在java语言中,根据定义变量的位置不同,而可以将其分为成员变量和局部变量两大类(具体分类参照图一.变量分类详图),下面将为大家详细介绍一下两种变量的运行机制的差异。
图一.变量分类详图
一、概念
成员变量:指的是在类里面定义的变量,又因修饰符的不同,将其细分为实例变量和类变量。
class Animal{
// 定义一个实例变量
public String name;
// 定义一个类变量
public static int footNum;
}
public class AnimalTest{
public static void main(String[] args){
// 直接通过 类.类变量 来调用
System.out.println("Animal的footNum类变量为:"+ Animal.footNum);
// 如下以类.实例变量调用实例变量会报错
// System.out.println("Animal的name类变量为:"+ Animal.name);
// 创建Animal对象
Animal a = new Animal();
// 直接通过 实例.类变量 来调用
System.out.println("Animal的name实例变量为:"+ a.name
+";Animal的footNum类变量为:"+ a.footNum);
// 直接为那么实例变量赋值
a.name = "二哈";
// 通过a来访问footNum类变量,并赋值
a.footNum = 4;
// 再次通过Animal来访问name实例变量和footNum类变量
System.out.println("Animal的name实例变量为:"+ a.name
+";Animal的footNum类变量为:"+ a.footNum);
Animal a2 = new Animal();
System.out.println("Animal的name实例变量为:"+ a2.name
+";Animal的footNum类变量为:"+ a2.footNum);
}
}
程序结果:
Animal的footNum类变量为:0
Animal的name实例变量为:null;Animal的footNum类变量为:0
Animal的name实例变量为:二哈;Animal的footNum类变量为:4
Animal的name实例变量为:null;Animal的footNum类变量为:4
局部变量:指的是在方法里定义的变量,又因定义形式的不同,将其细分为形参、方法局部变量和代码块局部变量。
public class LocalTest{
public static void main(String[] args){
//形参
System.out.println("形参args的值为:"+args);
{
// 定义代码块
int a;
// 下面代码将出现错误,因为a变量还未初始化
// System.out.println("代码块局部变量a的值为:"+a);
// 为a变量赋初始值,即初始化
a = 1;
System.out.println("代码块局部变量a的值为:"+a);
}
// 下面代码将出现错误,因试图访问的代码块局部变量a不存在
// System.out.println("代码块局部变量a的值为:"+a);
//定义方法局部变量
int b;
// 下面代码将出现错误,因为b变量还未初始化
// System.out.println("方法局部变量b的值为:"+b);
// 为b变量赋初始值,即初始化
b = 2;
System.out.println("代码块局部变量b的值为:"+b);
}
}
程序结果:
形参args的值为:[Ljava.lang.String;@30c028cc
代码块局部变量a的值为:1
代码块局部变量b的值为:2
二、初始化
成员变量:无须显式初始化,只要在一个类中定义了成员变量,系统就会在这个类的准备阶段或者创建该类的实例时进行默认的初始化,其赋值规则与数组动态初始化数组元素的赋值规相同。
局部变量:
形参:无须显式初始化,在调用该方法时由系统完成初始化的动作,其值由该方法的调用者负责指定。
方法局部变量、代码块局部变量:需要在调用之前显式指定初始值,否则不可以访问。
三、作用域
成员变量:
实例变量:从该类的准备阶段开始存在,直到系统完全销毁整个类,与这个生存范围相同
类变量:从该类的实例被创建起开始存在,直到系统完全销毁这个实例,与对应实例的生存范围相同
局部变量:
形参:在整个方法中有效
方法局部变量:从定义该变量的地方开始生效,到该方法结束时失效
代码块局部变量:从定义该变量的地方开始生效,到该代码块结束时失效
小结:
大致可以这样描述:类变量->实例变量->形参->方法局部变量->代码块局部变量
四、访问语法
成员变量:
类变量:
① 只要类存在,程序就可以访问该类的类变量,语法为:类.类变量
② 该类的实例存在的情况下,也可以通过实例来访问,语法为:实例.类变量(不推荐这样)
实例变量:在该类的实例存在下,可以通过实例来访问该实例变量,语法为:实例.实例变量
局部变量:在作用域内,可以直接通过其变量名来访问
注意:
① 一个类内不能定义两个同名的成员变量,
② 一个方法内不能定义两个同名的方法局部变量,与形参同名也不可以
③ 同一个方法中的同一代码块内不能定义两个同名的代码块局部变量,但不同的代码块内可以同名;若方法局部变量定义在代码块后面,则其变量可以与前面代码块的变量同名,但尽量避免同名的情况
④ 同一个类中允许成员变量与局部变量同名,但局部变量会覆盖成员变量,若需要引用成员变量,则可以通过this(对于实例变量)或类名(对于类变量)来调用访问成员变量。值得注意的是,在现实的编码中还是要尽量避免成员变量与局部变量同名的情况