美文网首页Java基础进行时
java类变量及成员变量初始化的顺序问题

java类变量及成员变量初始化的顺序问题

作者: VelyVelyGood | 来源:发表于2017-01-03 18:33 被阅读44次

类对象:属于类本身,类初始化的时候会在内存中开辟对应的内存空间,多个类的实例是共享这一份类变量的,类实例访问类变量底层也是通过类名+类变量名 的形式访问的;

实例变量:属于类的实例本身,实例初始化的时候分配内存空间,实例可以有N个。

初始化的时机:从运行角度看,每个JVM对一个Java类只运行一次,系统只为类变量分配一次内存空间,执行一次初始化;而每次创建Java对象都会为实例变量分配内存空间,并对实例变量进行初始化;

类初始化时会按先后顺序对静态变量(即类变量)和静态代码块进行初始化操作分配内存;

来看个例子

Price类 执行,打印结果

这里执行结果第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

相关文章

  • java类变量及成员变量初始化的顺序问题

    类对象:属于类本身,类初始化的时候会在内存中开辟对应的内存空间,多个类的实例是共享这一份类变量的,类实例访问类变量...

  • 设计模式——工厂,策略,建造者

    Java 类初始化顺序基本分为以下几种:静态块,初始化块,静态方法,构造函数块,静态变量,成员变量对于块顺序,静态...

  • java相关零碎知识

    java初始化,加载顺序: 父类的静态成员变量,父类静态代码块,子类的静态成员变量,子类的静态代码块,父类非静态成...

  • [转]Effective C++学习笔记:初始化列表中成员列出的

    类成员的默认初始化顺序是按照声明顺序进行, 如果使用初始化列表初始化成员变量, 则必须按照成员变量的声明顺序进行;...

  • java类初始化机制

    初始化顺序 无继承类初始化 初始化顺序静态变量/静态代码块 -> 成员变量/代码块 -> 构造函数其中,静态变量与...

  • java初始化顺序

    存在继承关系时 父类static块和静态成员变量,按顺序初始化 子类static块和静态成员变量,按顺序初始化 父...

  • java类初始化顺序

    原则 变量优先于块、静态变量优先于非静态 父类优先于派生类初始化 按照成员变量定义的顺序来进行初始化,即使变量定义...

  • 初始化

    成员方法的初始化 在类的内部,变量的定义顺序决定了初始化的顺序。创建一个对象时,会先初始化对象中的成员变量,然后才...

  • 单例:静态内部类和DCL实现

    1.DCL 2.静态内部类 先了解一下java内部类及类加载顺序:变量定义的先后顺序决定初始化顺序,而在不同变量之...

  • Java初始化顺序

    Java初始化顺序:①类变量、类方法>②(父类代码)>③实例变量>④构造器当一个类要实例化时,static变量和方...

网友评论

    本文标题:java类变量及成员变量初始化的顺序问题

    本文链接:https://www.haomeiwen.com/subject/iesnvttx.html