Java初始化顺序(转)

Java初始化顺序

1  无继承情况下的Java初始化顺序:

class Sample

{

Sample(String s)

{

System.out.println(s);

}

Sample()

{

System.out.println("Sample默认构造函数被调用");

}

}

class Test{

static Sample sam=new Sample("静态成员sam初始化");

Sample sam1=new Sample("sam1成员初始化");

static{

System.out.println("static块执行");

if(sam==null)System.out.println("sam is null");

sam=new Sample("静态块内初始化sam成员变量");

}

Test()

{

System.out.println("Test默认构造函数被调用");

}

}

//主函数

public static void  main(String  str[])

{

Test a=new Test();

}

输出结果为:

静态成员sam初始化     -----静态成员初始化

static块执行          -----静态块被执行

静态块内初始化sam成员变量 ----静态块执行

sam1成员初始化      -----普通成员初始化

Test默认构造函数被调用  -----构造函数执行

由此可以得出结论:

a 静态成员变量首先初始化(注意,Static可以看做一个静态成员,其执行顺序和其在类中申明的顺序有关)

b 普通成员初始化

c 执行构造函数。

对于静态成员(static块可以看成普通的一个静态成员,其并不一定在类初始化时首先执行)和普通成员,其初始化顺序只与其在类定义中的顺序有关,和其他因素无关。

例如下面的例子:

class Test{

static{

System.out.println("static 块 1  执行");

}

static Sample staticSam1=new Sample("静态成员staticSam1初始化");

Sample sam1=new Sample("sam1成员初始化");

static Sample staticSam2=new Sample("静态成员staticSam2初始化");

static{

System.out.println("static 块 2  执行");

}

Test()

{

System.out.println("Test默认构造函数被调用");

}

Sample sam2=new Sample("sam2成员初始化");

}

则结果为:

static 块 1  执行

静态成员staticSam1初始化

静态成员staticSam2初始化

static 块 2  执行

--------静态成员

sam1成员初始化

sam2成员初始化

--------普通成员

Test默认构造函数被调用

--------构造函数

2 Java继承情况下的初始化顺序:

class Test{

static{

System.out.println("父类static 块 1  执行");

}

static Sample staticSam1=new Sample("父类 静态成员staticSam1初始化");

Sample sam1=new Sample("父类 sam1成员初始化");

static Sample staticSam2=new Sample("父类 静态成员staticSam2初始化");

static{

System.out.println("父类 static 块 2  执行");

}

Test()

{

System.out.println("父类 Test默认构造函数被调用");

}

Sample sam2=new Sample("父类 sam2成员初始化");

}

class TestSub extends Test

{

static Sample staticSamSub=new Sample("子类 静态成员staticSamSub初始化");

TestSub()

{

System.out.println("子类 TestSub 默认构造函数被调用");

}

Sample sam1=new Sample("子类 sam1成员初始化");

static Sample staticSamSub1=new Sample("子类 静态成员staticSamSub1初始化");

static{System.out.println("子类 static 块  执行");}

Sample sam2=new Sample("子类 sam2成员初始化");

}

执行结果:

父类 static 块 1  执行

父类 静态成员staticSam1初始化

父类 静态成员staticSam2初始化

父类 static 块 2  执行

--------父类静态成员初始化

子类 静态成员staticSamSub初始化

子类 静态成员staticSamSub1初始化

子类 static 块  执行

-------子类静态成员初始化

父类 sam1成员初始化

父类 sam2成员初始化

父类 Test默认构造函数被调用

-------父类普通成员初始化和构造函数执行

子类 sam1成员初始化

子类 sam2成员初始化

子类 TestSub 默认构造函数被调用

-------父类普通成员初始化和构造函数执行

由此得出Java初始化顺序结论:

1 继承体系的所有静态成员初始化(先父类,后子类)

2 父类初始化完成(普通成员的初始化-->构造函数的调用)

3 子类初始化(普通成员-->构造函数)

Java初始化顺序如图:

时间: 2024-08-02 06:59:09

Java初始化顺序(转)的相关文章

Java初始化顺序

1.在类的内部,变量的定义的先后顺序决定了初始化顺序,即使变量定义散布于方法定义间,他们仍旧会在任何方法(包括构造器)被调用之前得到初始化 2.静态数据的初始化 class Bowl{ Bowl(int marker){ print("Bowl("+marker+")"); } void f1(int marker){ print("f1("+marker+")"); } class Table{ static Bowl bo

[转]Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数

Java初始化顺序1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)4,装载子类B后,完成静态动作类装载完成,开始进行实例化1,在实例化子类B时,先要实例化父类A2,实例化父类A时,先成员实例化(非静态代码)3,父类A的构造方法4,子类B的成员实例化(非静态代码)5,子类B的构造方法 先初始化父类的静

Java&&初始化顺序总结

1  无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默认构造函数被调用"); } } class Test{ static Sample sam=new Sample("静态成员sam初始化"); Sample sam1=new Sample("sam1成员初始化")

Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

1.执行顺序 1.1.一个类中的初始化顺序 (静态变量.静态初始化块)=>(变量.初始化块.构造器). 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)=> 子类的(静态变量.静态初始化块)=> 父类的(变量.初始化块.构造器)=> 子类的(变量.初始化块.构造器). 示例如下:(结果见注释) 1 class A { 2 public A() { 3 System.out.println("Constructor A."); 4 } 5

JAVA 初始化顺序

一.初始化顺序 无继承:静态变量.静态初始化块 > 变量.初始化块 > 构造函数 有继承:静态变量.静态初始化块 > 父类初始化 > 子类初始化 同一级别,按出现的顺序依次进行初始化. package initialization; public class Insect { public String field0 = this.InitField("Insect:变量0"); public static String staticField0 = Stati

java 初始化顺序以及由此可能引发的构造方法的潜在问题。

"设计构建器时一个特别有效的规则是:用尽可能简单的方法使对象进入就绪状态:如果可能,避免调用任何方法.在构建器内唯一能够安全调用的是在基础类中具有final属性的那些方法(也适用于private方法,它们自动具有final属性).这些方法不能被覆盖,所以不会出现上述潜在的问题." 摘录来自: (美)埃克尔 著 陈昊鹏 译. "java编程思想". 那么潜在的问题是什么呢?再来看看代码: abstract class Glypy { static int radius

Java 类成员的初始化顺序

Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究. ? 1 ?无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默认构造函数被调用"); } } class Test { static Samp

Android(java)学习笔记136:Java类初始化顺序

Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论: 1 .继承体系的所有静态成员初始化(先父类,后子类) 2 .父类初始化完成(普通成员的初始化-->构造函数的调用) 3 .子类初始化(普通成员-->构造函数) Java初始化顺序如图: 代码演示: class Sample { Sample(String s) { System.out.println(s); } Sample() { Sy

静态代码块、构造代码块、构造函数以及Java类初始化顺序

静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public HelloA(){//构造函数 } 关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的.2.构造函数的作用是用于给对象进行初始化.3.一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次. 构造代码块 {//构造代码块 }