Java 学习之路 之 成员变量和局部变量
Java 学习之路 之 成员变量和局部变量
1,成员变量和局部变量
成员变量指在类范围里定义的变量,也就是前面所介绍的Field;局部变量指的是在方法里定义的变量。不管是成员变量还是局部变量,都应该遵守相同命名规则。
成员变量被分为类 Field 和实例 Field 两种,定义 Field 时没有 static 修饰的就是实例 Field,有 static 修饰的就是类 Field。 其中类 Field 从这个类的准备阶段起开始存在,知道系统完全销毁这个类,类Field的作用域与这个类的生存范围相同;而实例 Field 则从该类的实例被创建起开始存在,知道系统完全销毁这个实例,实例 Field 的作用域与对应实例的生存范围相同。
下面程序定义了一个 Person 类,在这个 Person 类中定义两个成员变量, 一个实例 Field:name,以及一个类 Field: eyeNum。程序还通过PersonTest 类来创建 Person 实例,并分别通过 Person 类和 Person 实例来访问实例 Field 和类 Field。
- package com.sym.test;
- public class PersonTest {
- public static void main(String[] args) {
- //Person类已经初始化了,则eyeNum变量起作用了,输出0
- System.out.println("Person的eyeNum类Field的值:" + Person.eyeNum);
- Person p = new Person();
- //通过Person对象的引用 p 来访问 Person 对象 name 实例 Field
- //并通过实例访问eyeNum 类 Field
- System.out.println("p 变量的 name Field 值是:" + p.name + " p 对象的eyeNum Field的值是:" + p.eyeNum);
- //直接为 name 实例 Field 赋值
- p.name = "java";
- //通过 p 访问 eyeNum 类 Field,依然是访问 Person 的 eyeNum 类 Field
- p.eyeNum = 2;
- //再次通过 Person 对象来访问 name 实例 Field 和 eyeNum 类 Field
- System.out.println("p 变量的 name Field值是:" + p.name + " p对象的eyeNum Field值是:" + p.eyeNum);
- //前面通过 p 修改了 Person 的 eyeNum,此处的 Person.eyeNum 将输出 2
- System.out.println("Person 的 eyeNum 类 Field 值:" + Person.eyeNum);
- Person p2 = new Person();
- //p2 访问的 eyeNum 类 Field 依然引用 Person 类的,因此依然输出 2
- System.out.println("p2 对象的 eyeNum 类 Field 值:" + p2.eyeNum);
- }
- }
- class Person{
- //定义一个实例 Field
- public String name;
- //定义一个类 Field
- public static int eyeNum;
- }
package com.sym.test;
public class PersonTest {
public static void main(String[] args) {
//Person类已经初始化了,则eyeNum变量起作用了,输出0
System.out.println("Person的eyeNum类Field的值:" + Person.eyeNum);
Person p = new Person();
//通过Person对象的引用 p 来访问 Person 对象 name 实例 Field
//并通过实例访问eyeNum 类 Field
System.out.println("p 变量的 name Field 值是:" + p.name + " p 对象的eyeNum Field的值是:" + p.eyeNum);
//直接为 name 实例 Field 赋值
p.name = "java";
//通过 p 访问 eyeNum 类 Field,依然是访问 Person 的 eyeNum 类 Field
p.eyeNum = 2;
//再次通过 Person 对象来访问 name 实例 Field 和 eyeNum 类 Field
System.out.println("p 变量的 name Field值是:" + p.name + " p对象的eyeNum Field值是:" + p.eyeNum);
//前面通过 p 修改了 Person 的 eyeNum,此处的 Person.eyeNum 将输出 2
System.out.println("Person 的 eyeNum 类 Field 值:" + Person.eyeNum);
Person p2 = new Person();
//p2 访问的 eyeNum 类 Field 依然引用 Person 类的,因此依然输出 2
System.out.println("p2 对象的 eyeNum 类 Field 值:" + p2.eyeNum);
}
}
class Person{
//定义一个实例 Field
public String name;
//定义一个类 Field
public static int eyeNum;
}
- Person的eyeNum类Field的值:0
- p 变量的 name Field 值是:null p 对象的eyeNum Field的值是:0
- p 变量的 name Field值是:java p对象的eyeNum Field值是:2
- Person 的 eyeNum 类 Field 值:2
- p2 对象的 eyeNum 类 Field 值:2
Person的eyeNum类Field的值:0 p 变量的 name Field 值是:null p 对象的eyeNum Field的值是:0 p 变量的 name Field值是:java p对象的eyeNum Field值是:2 Person 的 eyeNum 类 Field 值:2 p2 对象的 eyeNum 类 Field 值:2从上面程序来看,成员变量无须显示初始化,只要为一个类定义了类 Field 或实例 Field,系统就会在这个类的准备阶段或创建改类的实例时进行默认初始化,成员变量默认初始化时的赋值规则与数组动态初始化时数组元素的赋值规则完全相同。
局部变量根据定义形式的不同,又可以被分为如下三种。
形参:在定义方法签名时定义的变量,形参的作用域在整个方法内有效。
方法局部变量:在方法体内定义的局部变量,他的作用域是从定义该变量的地方生效,到该方法结束时失效。
代码块局部变量:在代码块中定义的局部变量,这个局部变量的作用域从定义该变量的地方生效,到改代码块结束时失效。
与成员变量不同的是,局部变量出了形参之外,都必须显示初始化。也就是说,必须先给方法局部变量和代码块局部变量指定初始值,否则不可以访问它们。
2,成员变量的初始化和内存中的运行机制
当系统加载类或创建该类的实例时,系统自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值。
3,局部变量的初始化和内存中的运行机制
局部变量定义后,必须经过显示初始化后才能调用,系统不会为局部变量执行初始化。这意味着定义局部变量后,系统并未为这个变量分配内存空间,直到等到程序为这个变量赋初始值时,系统才会为局部变量分配内存,并将初始值保存到这块内存中。
4,变量的使用规则
读者可以参考李刚 疯狂java(第二版)
浙公网安备 33010602011771号