父类、子类之间代码块与构造方法
静态于非静态之前,代码块于构造方法之前执行,父类构造方法于子类代码块,另外,静态代码块只执行一次。父类除子类静态外都由于子类先执行
public class HelloA { static { System.out.println("父类--静态代码块"); } { System.out.println("父类--非静态代码块"); } public HelloA() { System.out.println("父类--构造函数"); } publicHelloA(String s) { System.out.println("父类--带参构造函数"); } publicstatic void main(String[] args) { newHelloB(); } } public class HelloB extends HelloA { static { System.out.println("子类--静态代码块"); } { System.out.println("子类--非静态代码块"); } public HelloB() { // 只能调用一个父类的构造方法 // super(); // super("parent"); System.out.println("子类--构造函数"); } publicstatic void main(String[] args) { newHelloB(); } }运行结果:
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
特殊实例
publicclass ExA { privatestatic ExAa = new ExA(); static { System.out.println("父类--静态代码块"); } public ExA() { System.out.println("父类--构造函数"); } { System.out.println("父类--非静态代码块"); } publicstaticvoid main(String[] args) { new ExB(); } } publicclass ExBextends ExA { privatestatic ExBb = new ExB(); static { System.out.println("子类--静态代码块"); } { System.out.println("子类--非静态代码块"); } public ExB() { System.out.println("子类--构造函数"); } }运行结果:
父类--非静态代码块
父类--构造函数
父类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
分析:先执行父类对象static对象(包括new对象、代码块)->执行new对象中的属性(static不属于对象内容)、static代码块、父类其他属性->回到子类static的 new对象中的属性(static不属于对象内容) 、static代码块->父类的非静态代码块、构造函数->子类的非静态代码块、构造函数