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;
}
}
public class Son extends Father{
private int i = test();
private static int j = method();
static {
System.out.println("(6)");
}
Son(){
System.out.println("(7)");
}
{
System.out.println("(8)");
}
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 s1 = new Son();
}
}
public static void main(String[] args) {
// Son s1 = new Son();
}
结果如下
类的初始化过程
一个类要创建实例,先加载并初始化该类
一个子类要初始化需要先初始化父类
一个类的初始化就是执行< clinit>()方法
这个方法由静态变量显示赋值代码和静态代码块组成
类变量显示赋值代码和静态代码从上到下顺序执行,< clinit>()只执行一次
执行以下操作
结果如下
实例初始化过程
父类实例化方法
(1)super()
(2)i = test();
(3) 父类的非静态代码块
(4) 父类的无参构造(最后)
子类实例化方法 :
(1)super()
(2)i = test();
(3) 子类的非静态代码块
(4) 子类的无参构造(最后)
为什么它会在(3)前面和父类的test方法呢?
非静态方法前面其实有一个默认的对象this
this在构造器或者说在init方法,表示正在创建对象,因为创建Son对象,所有test()执行的是子类重写的代码(面向对象多态)
对象多态性
实例初始化就是执行< init > () 方法
原文:https://www.cnblogs.com/llsj/p/14711875.html