成员变量的初始化和内存中的运行机制
当系统加载类或创建该类的实例时 系统自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值
成员变量是自动赋值,但是,局部变量而言,不会赋初始值,必须要手动给它赋初始值,不然会造成空指针异常
public class Person{
String name;
static int eyeNum;
public static void main(String[] args) {
Person pl = new Person( );
Person p2 = new Person() ;
pl.name = "张三";
p2.name = "悟空";
pl.eyeNum = 2 ;
System.out.println(pl.name+pl.eyeNum);
p2.eyeNum = 3 ;
System.out.println(pl.name+pl.eyeNum);//因为访问的是同一块类实例,所以当一个对象修改后,另外一个对象再来访问,访问的就是修改后的类实例
System.out.println(p2.name+p2.eyeNum);
}
}
张三2
张三3
悟空3
Process finished with exit code 0
当执行Person pl = new Person( ); 时候,因为是第一次使用Person类,所以会在第一次使用时候,加载这个Person类,并初始化它
在类的准备阶段,系统为该类的类变量分配内存空间,并指定默认的初始值
当Person类初始化完成后,系统在堆内存为Person类分配一块内存空间
当Person类初始化完成后,系统会为Person类创建一个类对象
这块内存空间保存了eyeNum类变量的内存,并且给它设置赋初始值0
接着
系统创建了Person对象,把Person对象赋值给了p1变量
Person对象包含了name实例,实例变量是在创建实例时候分配内存空间并指定初始值的
eyeNum 类变量并不属于 Person 对象 它是属于 Person类的,所以创建第
一个Person 对象时并不需要为 eyeNum 类变量分配内存,系统只是为 name实例变量分配了 内存空间,并指定默认初始值 null
接着执行 Person p2 = new Person() 代码创建第二个 Person 对象,此时因为 Person 类己经存在于堆内存中了,所以不再需要对 Person 类进行初始化
创建第二个 Person 对象 与创建第一 Person 对象并没有什么不同
执行 p1. epyeNum = 2; 代码时,此时通过 Peron 对象来修改 Person 的类变量
Person 对象根本没有保存 eyeNum 这个变量,通过 pl 问的 eyeNum 类变量
其实还是 Person类的 eyeNum 类变量,因此,此时修改的是 erson 类的 eyeNum 类变量
换句话来说 通过哪个 Person实例来访问 eyeNum 类变量 ,本质其实还
是通过 Person类来访问 eyeNum 类变量时,它们所访问的是同 一块内存。基于这个理由,建议
当程序需要访问类变量时,尽量使用类作为主调,而不要使用对象作为主调,这样可以避免程序产生歧义,提高程 的可读性
是通过 Person类来访问 eyeNum 类变量时,它们所访问的是同 一块内存。基于这个理由,建议
当程序需要访问类变量时,尽量使用类作为主调,而不要使用对象作为主调,这样可以避免程序产生歧义,提高程 的可读性