首页
学习
活动
专区
工具
TVP
发布

Java初始化顺序

对于静态成员(static块可以看成普通的一个静态成员,其并不一定在类初始化时首先执行)和普通成员,其初始化顺序只与其在类定义中的顺序有关,和其他因素无关。...--------构造函数 2 Java继承情况下的初始化顺序: class Test{ static{ System.out.println("父类static 块 1 执行...子类 sam1成员初始化 子类 sam2成员初始化 子类 TestSub 默认构造函数被调用 -------父类普通成员初始化和构造函数执行 由此得出Java初始化顺序结论: 1 继承体系的所有静态成员初始化...(先父类,后子类) 2 父类初始化完成(普通成员的初始化-->构造函数的调用) 3 子类初始化(普通成员-->构造函数) Java初始化顺序如图: ?...3.另外一条规则是初始化块和域的初始化按照声明的顺序进行。 详见thinking in java中译本第四版的P147页。

58170

JAVA初始化顺序

在一个类里,初始化顺序是由变量在类内的定义顺序决定的。即使变量定义大量遍布于方法定义的中间, 那些变量仍会在调用任何方法之前得到初始化——甚至在构建器调用之前。...例如: //: OrderOfInitialization.java // Demonstrates initialization order. // When the constructor is called...除此之外,t3 在构建器内部得到了重新初始化。...它的输入结果如下: Tag(1) Tag(2) Tag(3) Card() Tag(33) f() 因此,t3 句柄会被初始化两次,一次在构建器调用前,一次在调用期间(第一个对象会被丢弃,所以它后来...从表面看,这样做似乎效率低下,但它能保证正确的初始化——若只定义了一个过载的构建器,它没有初始化 t3;同时在t3 的定义里并没有规定“默认”的初始化方式,那么会产生什么后果 呢?

69220
您找到你想要的搜索结果了吗?
是的
没有找到

java基础☞初始化顺序java继承中的初始化顺序

1、初始化顺序:父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(父类的非静态代码块)-->父类的构造函数-->子类的非静态变量(子类的非静态代码块...子类的构造函数被执行 2、JAVA 类的加载机制 Java类加载分为5个过程,分别为:加载,连接(验证,准备,解析),初始化,使用,卸载。...2)将字节流所代表的静态存储结构转化为方法区的运行时数据结构; 3)在内存中生成一个该类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。...以上除了搞清楚执行顺序外,还有一个重点->结论2:静态资源在类的初始化中只会执行一次。不要与第3个步骤混淆。...按照顺序先是private static Singleton singleton = new Singleton(),根据 结论1 和结论2,value1和value2不会在此层执行赋值操作。

93430

java初始化顺序

java代码块 静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行。 执行顺序优先级:静态块,main(),构造块,构造方法。...构造函数 创建对象时调用 一般用于给对象初始化 一个对象建立,构造函数执行一次 构造代码块 用来给对象初始化 对象建立时运行构造代码块,优先于构造函数 构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化...block son's static code block A's code block A's constructor son's code block son constructor 有继承的情况,执行顺序如下...,并初始化子类普通成员变量 总结 java初始化执行顺序如下: 父类静态变量 父类静态初始化块 子类静态变量 子类静态化初始化块 父类变量 父类初始化块 父类构造器 子类变量 子类初始化块 子类构造器...规律是 静态变量、静态代码块->普通变量、初始化块、构造器 因为静态代码块是跟类关联的,所以只执行一次,并且优先级最高 参考资料 java初始化顺序

77210

Java初始化顺序

初始化顺序 对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是: (静态变量、静态初始化块)>(变量、初始化块)>构造器。...静态变量、静态初始化块,变量、初始化初始化顺序取决于它们在类中出现的先后顺序。...(2)执行根基类的static初始化,然后是下一个派生类的static初始化,依此类推。这个顺序非常重要,因为派生类的“static初始化”有可能要依赖基类成员的正确初始化。...基类的构造过程以及构造顺序,同派生类的相同。首先基类中各个变量按照字面顺序进行初始化,然后执行基类的构造函数的其余部分。 (5)对子类成员数据按照它们声明的顺序初始化,执行子类构造函数的其余部分。...这里要强调一下,有对象建立,才会运行构造代码块,类不能调用构造代码块的,而且构造代码块与构造函数的执行顺序是前者先于后者执行。

58930

Java中变量的初始化顺序

Java中变量的初始化顺序 在写一个通用的报警模块时,遇到一个有意思的问题,在调用静态方法时,发现静态方法内部对静态变量引用时,居然抛出了npe,仿佛是因为这个静态变量的初始化在静态方法被调用时,还没有触发...初始化顺序 类的初始化顺序 静态变量, 静态代码快 -》 实例变量(属性,实例代码块,构造方法) 继承关系初始化顺序 父类静态成员,静态代码块 -》 子类静态成员,静态代码块 -》 父类实例变量(属性,...Exception in thread "main" java.lang.ExceptionInInitializerError Caused by: java.lang.RuntimeException...初始化顺序 类的初始化顺序 静态变量, 静态代码快 -》 实例变量(属性,实例代码块,构造方法) 继承关系初始化顺序 父类静态成员,静态代码块 -》 子类静态成员,静态代码块 -》 父类实例变量(属性,...实例代码块,构造方法)-》子类实例变量(属性,实例代码块,构造方法) 相同等级的初始化的先后顺序,是直接依赖代码中初始化的先后顺序 2.

1.1K10

Java的,与类的初始化顺序

,变量初始化,调用父类的构造器等操作收敛到方法中,收敛顺序(这里只讨论非静态变量和语句块)为:  1....子类构造函数 所谓收敛到方法中的意思就是,将这些操作放入到中去执行 Java在编译之后会在字节码文件中生成方法,称之为类构造器,类构造器同实例构造器一样,也会将静态语句块,静态变量初始化,收敛到方法中...,收敛顺序为:  1....所以整个顺序就是:  1. 父类静态变量初始化  2. 父类静态语句块  3. 子类静态变量初始化  4. 子类静态语句块  5. 父类变量初始化  6. 父类语句块  7....子类构造函数 初始化顺序 如下父类代码 public class Parent { static int a = 1; int b = 1; static {

29100

彻底搞懂java程序的初始化顺序

使用场景 在java程序中,当实例化对象时,对象的所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。 原则 变量优先于块、静态优先于非静态。...父类优先于派生类初始化。 按照成员变量定义的顺序来进行初始化,即使变量定义散布于方法定义之中,它们仍然在任何方法(包括构造器)被调用前初始化。...初始化顺序 父类静态变量 父类静态代码块 子类静态变量 子类静态代码块 父类非静态变量 父类非静态代码块 父类构造函数 子类非静态变量 子类非静态代码块 子类构造函数 初始化示例代码 class Base

2.2K31

java小心机(5)| 浅谈类成员初始化顺序

但对于static域(包括静态成员变量、静态代码块、静态方法),当某个static域被调用时,类中的的所有staict就会被初始化,按照定义顺序(即书写顺序)初始化,且只会初始化一次(N个实例共用)。...} } //out: 静态块A 静态成员C5 普通成员C1 构造函数前 普通成员C2 构造函数后 普通成员C3 静态块后 非静态块A 普通成员C4 非静态块后 构造函数C 构造函数A 可以看出,初始化顺序为...:静态域 -> 非静态域 -> 构造函数 以上面优先级并按所定义的顺序初始化(即书写顺序) 在有继承父类的情况下: class HelloA extends HelloB{ public HelloA...:父类静态域->子类静态域->父类非静态域->父类构造函数->子类非静态域->子类构造函数 这里说明一点:这是初始化顺序,不等同于语句程序的执行过程。...因此在上面的初始化顺序里没有成员方法(静态或者非静态都没有),这是因为成员方法都是调用了才执行,虽然静态方法已经被加载进了方法区,但初始化过程中并没有执行过。

41110

一文理解java对象初始化顺序

--- 子类构造函数 从上面的例子总结类初始化的时候代码的执行顺序如下: 父类和子类的final static属性初始化 ---》 父类的static属性初始化---》父类的static代码块---...---- 细说 类的加载阶段 1、加载 ​ 由类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class...因为子类存在对父类的依赖,所以类的加载顺序是先加载父类后加载子类,初始化也一样。不过,父类初始化时,子类静态变量的值也有有的,是默认值。 ​...最终,方法区会存储当前类类信息,包括类的静态变量、类初始化代码(定义静态变量时的赋值语句 和 静态初始化代码块)、实例变量定义、实例初始化代码(定义实例变量时的赋值语句实例代码块和构造方法)和实例方法,...​ 初始化顺序是先初始化父类再初始化子类,初始化时先执行实例代码块然后是构造方法 4、如果有类似于Child c = new Child()形式的c引用的话,在栈区定义Child类型引用变量c,然后将堆区对象的地址赋值给它

50330

java类的初始化和对象的创建顺序

学习java编程思想--类的初始化p146 类的加载顺序 * 1加载器启动找到 xxx.class文件,通过extends关键字寻找基类,先加载基类 * 2类初始化初始化static成员变量和static...,非静态成员变量要随对象的创建而初始化) * 2先加载父类的构造函数 * 3再加载本类的非静态成员变量 * 4再加载本类的构造函数 * 总体: * -->表示顺序 * 父类-->子类 * 静态-->...非静态 * 类-->对象 * static随类的加载而加载 * 非static成员变量随对象的创建而加载 * 成员变量先于构造器加载 1 package com.test.java.classs;...2 3 /** 4 * Created by Administrator on 2015/12/8. 5 * 类的加载顺序 6 * 1加载器启动找到 xxx.class文件,通过extends...13 * 3再加载本类的非静态成员变量 14 * 4再加载本类的构造函数 15 * 16 * 总体: 17 * -->表示顺序 18 * 父类-->子类 19 * 静态-->非静态 20

964160
领券