顺序(重点)
-
父类中静态成员变量和静态代码块
-
子类中静态成员变量和静态代码块
-
父类中普通成员变量和代码块,父类的构造函数
-
子类中普通成员变量和代码块,子类的构造函数
其中“和”字两端的按照代码先后顺序执行。
例子
package com.sie.tianwei.base.test;
/**
* @author xjx
* @note
*/
/*** 父类初始化<clinit> * 1、j = method() *
* 2、 父类的静态代码块 ** 父类实例化方法: * 1、super()(最前) * 2、i = test() (9) *
* 3、子类的非静态代码块 (3) *
* 4、子类的无参构造(最后)(2) *** 非静态方法前面其实有一个默认的对象this * this在构造器或<init> 他
* 表示的是正在创建的对象,因为咱们这里是正在创建Son对象,
* 所以 * test()执行的就是子类重写的代码(面向对象多态) ** 这里i=test() 执行的就是子类重写的test()方法 *
* @author gcq * @Create 2020-09-25 */
public class Father {
private int i = test();
private static int j = method();
static {
System.out.println("(1)");
}
Father() {
System.out.println("(2)");
}
{
System.out.println("(3)");
}
public int test() {
System.out.println("(4)");
return 1;
}
public static int method() {
System.out.println("(5)");
return 1;
}
}
package com.sie.tianwei.base.test;
/**
* @author xjx
* @date .
* @note
*/
/*** 子类的初始化<clinit> * 1、j = method() *
* 2、子类的静态代码块 ** 先初始化父类 (5)(1) * 初始化子类 (10) (6) ** 子类实例化方法: *
* 1、super()(最前 * 2、i = test() (9) *
* 3、子类的非静态代码块 (8) *
* 4、子类的无参构造(最后)(7) *
* @author gcq * @Create 2020-09-25 */
public class Son extends Father {
private int i = test();
private static int j = method();
static {
System.out.println("(6)");
}
Son() {
super();
System.out.println("(7)");
}
{
System.out.println("(8)");
}
@Override
public int test() {
System.out.println("(9)");
return 1;
}
public static int method() {
System.out.println("(10)");
return 1;
}
public static void main(String[] args) {
Son son = new Son();
System.out.println();
Son son1 = new Son();
}
}