【JavaSE】初始化顺序

来源:互联网 发布:利乐公司待遇 知乎 编辑:程序博客网 时间:2024/06/04 19:02

Java的初始化主要包括:静态成员变量(以及静态代码块)初始化、普通成员变量(以及普通代码块)初始化、构造器的调用。

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

先来看看无继承初始化顺序。

package com.zzj.tj5.memberInit;public class Main {/** * @param args */public static void main(String[] args) {new Person();}}class Name {public Name(String name) {System.out.println(name);}}class Person {static Name staticName1 = new Name("静态成员1");static {System.out.println("静态代码块1");}static {System.out.println("静态代码块2");}static Name staticName2 = new Name("静态成员2");public Name name = new Name("普通成员1");{System.out.println("普通代码块1");}{System.out.println("普通代码块2");}public Name name2 = new Name("普通成员2");public Person() {System.out.println("构造器");}}

输出结果:
静态成员1静态代码块1静态代码块2静态成员2普通成员1普通代码块1普通代码块2普通成员2构造器
初始化顺序:静态成员变量(静态代码块)——》普通成员变量(普通代码块)——》构造器。

成员变量和代码块的优先级是一样的,它们的初始化顺序只与定义的顺序有关。

有继承情况下的初始化顺序

package com.zzj.tj5.memberInit;public class Main {/** * @param args */public static void main(String[] args) {new Son();}}class Name {public Name(String name) {System.out.println(name);}}class Father {static Name staticName = new Name("父类静态成员");static {System.out.println("父类静态代码块");}static Name staticName2 = new Name("父类静态成员2");Name name = new Name("父类普通成员");{System.out.println("父类普通代码块");}Name name2 = new Name("父类普通成员2");public Father() {System.out.println("父类构造器");}}class Son extends Father {static Name staticName = new Name("子类静态成员变量");Name name = new Name("子类普通成员");{System.out.println("子类代码块");}public Son() {System.out.println("子类构造器");}}

输出结果:
父类静态成员父类静态代码块父类静态成员2子类静态成员变量父类普通成员父类普通代码块父类普通成员2父类构造器子类普通成员子类代码块子类构造器

初始化顺序:父类静态成员变量(静态代码块)——》子类静态成员变量(静态代码块)——》父类普通成员变量(普通代码块)——》父类构造器——》子类普通成员变量(普通代码块)——》子类构造器。

初始化顺序图如下:




0 0
原创粉丝点击