Java 类的初始化顺序

来源:互联网 发布:cs1.6 优化参数 编辑:程序博客网 时间:2024/06/06 13:55

一、 没有继承情况下:

<span style="font-size:18px;"><strong>package I;import java.awt.image.SampleModel;import java.lang.Thread.State;class Example{static {System.out.println("Example 的静态块");}{System.out.println("Example 块");}public Example(String s) {// TODO Auto-generated constructor stubSystem.out.println(s);}public Example() {// TODO Auto-generated constructor stubSystem.out.println("默认的构造函数");}}public class Tset {static Example e = new Example("静态成员的初始化");//先执行Example中的static . 块Example e_ = new Example();{System.out.println("块");}static {System.out.println("Static 块");if( e== null)System.out.println("e is null");e = new Example("静态块内部初始化");}public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("Test 的默认构造函数");}}</strong></span>

输出的结果是:

<span style="font-size:18px;"><strong>Example 的静态块Example 块静态成员的初始化Static 块Example 块静态块内部初始化Test 的默认构造函数</strong></span>

由此可以看出,在没有继承关系的提前下:首先执行的是Test类中的静态成员,(静态成员定义的Example类的对象),所以首先输出 Example中的static块中的内容,随后输出Example中块的内容,最后执行的Example的构造器,

第二步执行的是Test中的static块, (Example中的静态块之执行一次),输出Example中的块,之后是构造器。
第三部执行Test中的 成员变量

最后执行main入口中的内容


执行顺序如下:

1、静态成员变量首先初始化               2、普通成员初始化       3、执行构造函数

(static块 可以看成一个静态成员变量,它的执行顺序和它在类中声明的位置有关)


二、Java有继承情况下的初始化顺序:

package I;import java.awt.image.SampleModel;import java.lang.Thread.State;import java.text.SimpleDateFormat;class Sample{      Sample(String s)      {            System.out.println(s);      }      Sample()      {            System.out.println("Sample默认构造函数被调用");      }}class Example{static {System.out.println("父类的static 块1");}static Sample sa = new Sample("父类静态成员1初始化");Sample saa = new Sample("父类成员1初始化");static Sample s = new Sample("父类静态成员2初始化");static {System.out.println("父类的static 块2");}public Example() {// TODO Auto-generated constructor stubSystem.out.println("Example默认构造函数的初始化");}Sample saaa = new Sample("父类成员2初始化");}public class Tset extends Example{static Sample s = new Sample("子类静态成员1的初始化");public Tset() {// TODO Auto-generated constructor stubSystem.out.println("子类默认构造函数的调用");}Sample sam1 = new Sample("子类1的初始化");static Sample s_ = new Sample("子类静态成员2的初始化");static {System.out.println("子类静态代码块的调用");}Sample as = new Sample("子类2的初始化");public static void main(String[] args) {// TODO Auto-generated method stubnew Tset();System.out.println("Test");}}
输出的结果是:

父类的static 块1父类静态成员1初始化父类静态成员2初始化父类的static 块2子类静态成员1的初始化子类静态成员2的初始化子类静态代码块的调用父类成员1初始化父类成员2初始化Example默认构造函数的初始化子类1的初始化子类2的初始化子类默认构造函数的调用Test
第一步执行的是父类静态成员初始化

第二步执行的是子类静态成员初始化

第三步执行的是父类普通成员的初始化和构造函数

第四步执行的是子类普通成员的初始化和构造函数

所以在Java初始化顺序中:

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

2、父类初始化完成(普通成员的初始化->构造器)

3、子类初始化(普通成员的初始化->构造器



0 0
原创粉丝点击