类对象:属于类本身,类初始化的时候会在内存中开辟对应的内存空间,多个类的实例是共享这一份类变量的,类实例访问类变量底层也是通过类名+类变量名 的形式访问的;
实例变量:属于类的实例本身,实例初始化的时候分配内存空间,实例可以有N个。
初始化的时机:从运行角度看,每个JVM对一个Java类只运行一次,系统只为类变量分配一次内存空间,执行一次初始化;而每次创建Java对象都会为实例变量分配内存空间,并对实例变量进行初始化;
类初始化时会按先后顺序对静态变量(即类变量)和静态代码块进行初始化操作分配内存;
来看个例子


这里执行结果第6行会是-3;第8行为17;
如果不太清楚那我们可以从内存上来解释:第一次用到Price类时,程序开始对Price类进行初始化,初始化分为2个阶段
(1)系统为Price的两个类变量分配内存空间。
(2)按初始化代码(定义时指定初始值和初始化代码块中执行初始值)的顺序对类变量执行初始化。
初始化第一阶段,系统先为instance,initPrice两个类变量分配内存空间,此时instance initPrice的值默认为null和0.0.接着进入初始化第二阶段,程序按顺序依次为instance,initPrice进行赋值。对instance赋值要调用Price(3),创建Price实例,调用构造方法,执行对currentPrice赋值语句,此时initPrice类变量值为0,因此赋值结果为currentPrice等于 -3。接着,程序再次将initPrice赋值为20,但此时对实例instance的成员变量currentPrice已经不起作用了。
当再次创建Price实例时,因为类变量initPrice已经初始化为20,所以新的实例中的成员变量currentPrice的值等于 20.0 - discount
网友评论