Java|Java面向对象之各种变量详解( 三 )


在同一个类里 成员变量的作用域是整个类内有效.
一个类里不能定义两个同名的成员变量.
就算一个是类变量 一个是实例变量也不行.
一个方法里不能定义两个同名的成员变量.
方法局部变量与形参名也不能同名.
同一个方法中不同代码块内的代码块局部变量可以同名.
如果先定义代码块局部变量 后定义方法局部变量.
前面定义的代码块局部变量与后面定义的方法局部变量是可以同名的.
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;