public class Test03 {
public static void main(String[] args) {
Sub s = new Sub();
}
}
class Base{
Base(){
method(100);
}
{
System.out.println("base");
}
public void method(int i){
System.out.println("base : " + i);
}
}
class Sub extends Base{
Sub(){
super.method(70);
}
{
System.out.println("sub");
}
public void method(int j){
System.out.println("sub : " + j);
}
}
Sub s = new Sub();发生的事情。非静态代码块在类的实例创建时开始加载。
- 需要new一个Sub对象时,需要加载对应的类的静态属性、静态代码块和静态方法。
- 加载Sub类时,需要先加载Base类。类的静态属性和静态方法加载完成。
- 此时开始new一个Sub对象。创建实例时,父类的非静态代码块加载->父类的构造器->子类相关代码块和构造器。
- Base类的非静态代码块加载:输出"Base"。Base类的构造器加载:调用this.method(100).输出“sub:100”.
- Sub类的的非静态代码块加载:输出"Sub"。Base类的构造器加载:调用super.method(70).输出“base:70”.
- 总结:先加载父类相关静态属性、静态代码块和静态方法,再加载子类相关静态属性、静态代码块和静态方法。实例创建时,优先super到object,然后开始加载父类的非静态代码块和构造器的其他代码,再加载子类的非静态代码和构造器的其他代码。