在同一个类里 成员变量的作用域是整个类内有效.
一个类里不能定义两个同名的成员变量.
就算一个是类变量 一个是实例变量也不行.
一个方法里不能定义两个同名的成员变量.
方法局部变量与形参名也不能同名.
同一个方法中不同代码块内的代码块局部变量可以同名.
如果先定义代码块局部变量 后定义方法局部变量.
前面定义的代码块局部变量与后面定义的方法局部变量是可以同名的.
Java允许局部变量和成员变量同名.
如果方法里的局部变量和成员变量同名 局部变量会覆盖成员变量.
如果需要在这个方法里引用被覆盖的成员变量.
可以使用 this (对于实例变量) 或 类名(对于类变量) 来作为调用者.
下面 我写个程序.
public class VariableOverrideTest{ //定义一个 name 实例变量
private String name = \"猪八戒\"; //定义一个 price 类变量
private static double price = 78.0; //主方法 程序的入口
public static void main(String[
args)
{ //方法里的局部变量 局部变量覆盖成员变量
int price = 65; //直接访问 price 变量 将输出 price 局部变量的值.
System.out.println(price); //使用类名作为 price 变量的调用者 访问被覆盖的 类变量
System.out.println(VariableOverrideTest.price); //运行 info 方法
new VariableOverrideTest().info();
public void info()
{ //方法里的局部变量 局部变量覆盖成员变量
String name = \"孙悟空\"; //直接访问 name 变量 将输出 孙悟空
System.out.println(name); //使用 this 来作为 name 的调用者 访问 实例变量
System.out.println(this.name);
从上面代码可以看出 当局部变量覆盖成员变量时.
依然可以在方法中显式指定 类名和this 作为调用者来访问被覆盖的成员变量 这使得变成更加自由.
不过 不过 不过 . 你应该尽量避免这种局部变量和成员变量同名的情形. (想个名字真的有那么难么 - - )
成员变量(属性)和局部变量的区别?
- 成员变量:
- 成员变量定义在类中 , 在整个类中都可以被访问 。
- 成员变量分为类成员变量和实例成员变量 , 实例变量存在于对象所在的堆内存中 。
- 成员变量有默认初始值 。
- 成员变量的权限修饰符可以根据需要 , 任意选择一个 。
- 如 , public , private 。
- 局部变量:
- 局部变量只定义在局部范围内 , 如 , 方法内 , 代码块等 。
- 局部变量存在于栈内存中 。
- 作用的范围结束 , 变量的空间会自动释放 。
- 局部变量没有默认初始值 , 每次必定显示初始值 。
- 局部变量声明时不指定权限修饰符 。
系统将自动为成员变量分配内存空间.
并在分配内存空间后 自动为成员变量指定初始值.
下面通过代码来创建两个实例(非完整代码能明白就行).
同时配合示意图来说明 Java 成员变量的初始化和内存中的运行机制.
//创建第一个 Person 对象Person p1 = new Person();//创建第二个 Person 对象Person p2 = new Person();//分别为两个 Person 对象的 name 实例变量赋值p1.name = \"孙悟空\";
p2.name = \"皮卡丘\";//分别为两个 Person 对象的 eyeNum 类变量赋值p1.eyeNum = 2;
p2.eyeNum = 3;
- Java|JS加密技术:平展控制流
- 阿里巴巴|育碧也希望被微软收购?育碧CEO表示对于收购待价而沽!
- 比利时|每周工作四天薪酬不变,比利时通过新规定
- 联发科|骁龙8最大对手来了!联发科徐敬全:天玑9000性能极致还很冷静
- 一加10 Pro、小米12 Pro游戏对比:同是骁龙8差距有点大
- r5-5600x|12 代酷睿 i5-12400F 对阵 AMD R5-5600X:夺回中端霸主的桂冠
- realme|iQOO Neo5S和realme GT探索版对比:哪一款更香?
- 滴滴出行|人民日报说得很对!滴滴突然官宣,柳青不想看到的情况发生了
- 爱因斯坦又对了!叶军团队证实相隔1毫米时间差一千亿亿分之一
- 叶军|爱因斯坦又对了!叶军团队证实相隔1毫米时间差一千亿亿分之一