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


   p.eyeNum = 2;    //再次通过 Person 对象来访问 name 实例变量 和 eyeNum 类变量
   System.out.println(\"p 对象的 name 变量值是:\" + p.name + \"p 对象的 eyeNum 变量值是:\" + p.eyeNum);    //前面通过 p 修改了 Person 的 eyeNum 此处的 Person.eyeNum 将输出 2
   System.out.println(\"Person 的 eyeNum 类变量值:\" + Person.eyeNum);
   Person p2 = new Person();    //p2 访问的 eyeNum 类变量依然引用 Person 类的 因此依然输出 2
   System.out.println(\"p2 对象的 eyeNum 类变量值:\" + p2.eyeNum);
 


从上面程序可以看出 成员变量无须显式初始化.
只要为一个类定义了 类变量 或 实例变量.(类变量在程序开始之前 , 系统会自动初始化变量)
系统就会在这个类的准备阶段或创建该类的实例时进行默认初始化.
成员变量默认初始化的赋值规则与我们之前讲的 数组动态初始化 时数组元素的赋值规则完全相同.
我们还可以得知 类变量的作用域 比 实例变量的作用域 更大.
实例变量随实例的存在而存在.
而类变量则随类的存在而存在.
实例也可以访问类变量 同一个类的所有实例访问类变量时.
实际上访问的是该类本身的同一个变量 也就是说 访问了同一片内存区.
注意!!!
Java 允许实例访问 static 修饰的类变量本身就是一个错误.
因此建议你以后看到通过实例来访问 static 修饰的类变量时 都可以将它替换成通过类本身来访问. 这样程序的可读性 / 明确性 都会大大提高!
局部变量局部变量根据定义形式的不同 可以分为如下三种:

  • 形参:在方法定义签名时定义的变量 , 形参的作用域只在这个方法内有效 。
  • 方法的局部变量:在方法体内定义的局部变量 , 它的作用域就是从定义该变量的地方生效 , 直到方法结束时失效 。
  • 代码块局部变量:在代码块中定义的局部变量 , 这个局部变量的作用域从定义该变量的地方生效 , 直到该代码块结束时失效 。
  • 与成员变量不同的是 局部变量除了形参之外 都必需显式初始化.
  • 也就是说 必需先给方法局部变量和代码块局部变量指定初始值 否则不可以访问它们.
  • 下面我写个定义代码块局部变量的程序.
public class BlockTest{  public static void main(String[
args)
 {
   {      //定义一个代码块局部变量 a
     int a;      //下面代码将会出现错误 因为 a 变量没有初始化
     System.out.println(\"代码块局部变量 a 的值:\" + a);
       //下面试图访问 a 变量 但 a 变量的作用域根本无法涉及这里
   System.out.println(a);
 


上面的代码是一个错误示例 如果你写出来还要运行的话 只能说你想得太简单了
从上面代码可以看出 只要离开了 代码块局部变量 所在的代码块 这个局部变量就没法用了.
对于方法局部变量 其作用域从定义该变量开始 直到该方法结束.
下面我写个 方法局部变量的作用域 示例.
public class MethodLocalVariableTest{  public static void main(String[
args)
 {    //定义一个方法局部变量 a
   int a;    //下面代码将会出现错误 因为 a 变量没有初始化
   System.out.println(\"方法局部变量 a 的值:\" + a);
 

下面说说形参.
形参的作用域时整个方法体内有效 而且形参也无须显式初始化.
形参的初始化在调用该方法时由系统完成 形参的值由方法的调用者负责指定.