Java中的实例变量和类变量易混点(1)

Java 1772℃

Java程序的变量大体可分为成员变量和局部变量。

1.局部变量

局部变量的作用时间很短暂,它们都被存储在方法的栈内存中。局部变量可分为如下3类:

  • 形参:在方法签名中定义的局部变量,由方法调用者负责为其赋值,随方法的结束而消亡。
  • 方法内的局部变量:在方法内定义的局部变量,必须在方法内对其进行显式初始化。这种类型的局部变量从初始化完成后开始生效,随方法的结束而消亡。
  • 代码块内的局部变量:在代码块内定义的局部变量,必须在代码块内对其进行显式初始化。这种类型的局部变量从初始化完成后开始生效,随代码块的结束而消亡。

2.成员变量

类体内定义的变量被称为成员变量(Field)。如果定义该成员变量时没有使用static修饰,该成员变量又被称为非静态变量或实例变量;如果使用了 static 修饰,则该成员变量又可被称为静态变量或类变量。

3.static关键字说明

对于 static 关键字而言,从词义上来看,它是“静态”的意思。但从 Java 程序的角度来看,static 的作用就是将实例成员变为类成员。static 只能修饰在类里定义的成员部分,包括成员变量、方法、内部类、初始化块、内部枚举类。如果没有使用static修饰这些类里的成员,这里成员属于该类的实例;如果使用了static修饰,这些成员就属于类本身。从这个意义上看,static 只能修饰类里的成员,不能修饰外部类,不能修饰局部变量、局部内部类。

4.实例变量和类变量

Java 要求定义成员变量时必须采用合法的前向引用。示例如下。

public class ErrorDef 
{ 
      //下面代码将提示: 非法向前引用 
      int num1 =  num2 + 2; 
      int num2 = 20; 
}

上面程序中定义num1成员变量的初始值时,需要根据num2变量的值进行计算,这就是“非法前向引用”。因此,编译上面程序将提示“非法前向引用”的错误。类似地,两个类变量也不允许采用这种“非法前向引用”,示例如下。

public class ErrorDef2 
{ 
      //下面代码将提示: 非法前向引用 
      static int num1 =  num2 + 2; 
      static int num2 = 20; 
}

但如果一个是实例变量,一个是类变量,则实例变量总是可以引用类变量,示例如下。

public class RightDef 
{ 
      //下面代码将完全正常 
      int num1 = num2 + 2; 
      static int num2 = 20; 
}

上面程序中num1是一个是实例变量,而num2是一个类变量。虽然num2 位于 num1之后被定义,但num1的初始值却可根据num2计算得到。这是因为,num2变量是一个类变量,num1是实例变量,而类变量的初始化时机总是处于实例变量的初始化时机之前。所以,虽然源代码中先定义了num1,再定义了num2,但num2 的初始化时机总是位于num1之前,因此num1变量的初始化可根据num2的值计算得到。

转载请注明:零五宝典 » Java中的实例变量和类变量易混点(1)