在Java语言中,根据定义变量位置的不同,可以讲变量分为2大类:成员变量和局部变量。成员变量和局部变量运行机制
存在较大差异。
1.1成员变量和局部变量
成语变量指的是在类范围里定义的变量,也就是前面所说的属性;局部变量指的是在一个方法内定义的变量。
成员变量分为:实例属性(不以static修饰),类属性(以static修饰)。
局部变量分为:形参(方法签名中定义的变量),方法局部变量(在方法内定义),代码块局部变量(在代码块内定义)。
成员变量,类属性从这个类的准备阶段起开始存在,知道系统完全销毁这个类,类属性的作用域与这个类的生存范围相同;
而实例属性则从这个类的实例被创建开始起存在,直到系统完全销毁这个实例,实例属性的作用域与对应实例的生存范围相同。
只要类存在,程序就可以访问该类的类属性,在程序中访问类属性通过如下语法:
类.类属性
只要实例存在,程序就可以访问该实例的实例属性,在程序中访问实例属性通过如下语法:
实例.实例属性
当然,类属性也可以让该类的实例来访问,通过实例访问类属性的语法如下:
实例.类属性
但这个实例访问并不是这个实例的属性,依然访问的是它对于的类属性。也就是说,如果通过一个实例修改了类属性的值
,由于这个类属性并不属于它,而是它对应的类。因此,修改的依然是类属性,与通过该类来修改类属性的结果完全相同,
这会导致该类的其他实例来访问这个这个类属性时也将获得这个被修改过的值。
这个人叫null,年龄:0
这个人叫八戒,年龄:78
Person的age属性值:78
这个人叫八戒,年龄:78
下面代码示范的方法局部变量的作用域
存在较大差异。
1.1成员变量和局部变量
成语变量指的是在类范围里定义的变量,也就是前面所说的属性;局部变量指的是在一个方法内定义的变量。
成员变量分为:实例属性(不以static修饰),类属性(以static修饰)。
局部变量分为:形参(方法签名中定义的变量),方法局部变量(在方法内定义),代码块局部变量(在代码块内定义)。
成员变量,类属性从这个类的准备阶段起开始存在,知道系统完全销毁这个类,类属性的作用域与这个类的生存范围相同;
而实例属性则从这个类的实例被创建开始起存在,直到系统完全销毁这个实例,实例属性的作用域与对应实例的生存范围相同。
只要类存在,程序就可以访问该类的类属性,在程序中访问类属性通过如下语法:
类.类属性
只要实例存在,程序就可以访问该实例的实例属性,在程序中访问实例属性通过如下语法:
实例.实例属性
当然,类属性也可以让该类的实例来访问,通过实例访问类属性的语法如下:
实例.类属性
但这个实例访问并不是这个实例的属性,依然访问的是它对于的类属性。也就是说,如果通过一个实例修改了类属性的值
,由于这个类属性并不属于它,而是它对应的类。因此,修改的依然是类属性,与通过该类来修改类属性的结果完全相同,
这会导致该类的其他实例来访问这个这个类属性时也将获得这个被修改过的值。
下面程序定义了一个Person类,但这个类定义两个成员变量,一个实例属性:name,及一个类属性:age。
public class Person {
public String name;
public static int age;
}
//Perosn类已经初始化了,则age静态变量起作用了,输出0
System.out.println("Person的age属性值:" + Person.age);
Person p = new Person();
//通过对象的引用p来访问Person对象的name实例属性
//并通过实例来访问Person的类属性age
System.out.println("这个人叫" + p.name + ",年龄:" + p.age);
//通过p来访问age类属性,依然访问的是Person的属性
p.age = 78;
p.name = "八戒";
System.out.println("这个人叫" + p.name + ",年龄:" + p.age);
//前面通过p修改了Person的age属性,这里输出78
System.out.println("Person的age属性值:" + Person.age);
Person p2 = new Person();
//p2访问的是age类属性依然引用Person类的,因此输出78
System.out.println("这个人叫" + p.name + ",年龄:" + p.age);
输出内容:Person的age属性值:0
这个人叫null,年龄:0
这个人叫八戒,年龄:78
Person的age属性值:78
这个人叫八戒,年龄:78
局部变量根据定义形式的不同,又可以分为如下三种:
a、形参:在定义方法签名时定义的变量,形参的作用域在整个方法内有效
b、方法局部变量:在方法体内定义的局部变量,它的作用域是从它被定义的地方生效,到该方法结束时失效。
c、代码块局部变量:在代码块中定义的局部变量,这个局部变量的作用域从定义该变量的地方开始生效,到该代码块结束
时失效。
与成员变量不同的是,局部变量除了形参之外,都必须显示初始化。也就是说,必须先给方法局部变量和代码块局部变量
指定初始值,否则不可以访问它们。
下面代码是定义代码块局部变量的实例程序
{
//定义一个代码块局部变量a
int a;
//下面代码将会出错,因为a变量还未初始化
// System.out.println("a的值时" + a);
//为a变量赋值,也就是进行初始化
a = 5;
System.out.println("a的值时" + a);
}
//下面试图访问的a变量不存在
// System.out.println("a的值时" + a);
下面代码示范的方法局部变量的作用域
//定义一个方法局部变量a
int a;
//下面代码将会出错,因为a变量还未初始化
// System.out.println("a的值时" + a);
//为a变量赋值,也就是进行初始化
a = 5;
System.out.println("a的值时" + a);