public class TestInit
{
public static void main(String[] args) {
new Sub("child");
}
}
abstract class Base
{
public String name =" ";
public Base(String name) {
System.out.println("name:" + this.name);
this.name=name;
System.out.println("invoke base constructor");
System.out.println("name:" + name);
this.setName("parent");
}
{
System.out.println("invoke base instance block");
printInfo();
}
static{
System.out.println("invoke base static block");
}
//public abstract void setName();
public abstract void printInfo();
public void setName(String name) {
this.name=name;
System.out.println("invoke parent setName method");
System.out.println("name:" + name);
}
}
class Sub extends Base
{
public static int age = 10;
public Sub(String name) {
super(name);
System.out.println("invoke sub constructor");
System.out.println("name:" + name);
}
{
System.out.println("invoke sub instance block");
System.out.println("name:" + name);
}
static{
System.out.println("invoke sub static block");
}
public void printInfo() {
System.out.println("/n");
System.out.println("invoke sub printInfo");
System.out.println("age:" + age);
System.out.println("name:" + name);
System.out.println("/n");
}
public void setName(String name) {
System.out.println("invoke sub setName method");
this.name =name;
System.out.println("name:" + name);
}
}
JVM首先会判断此类是否装载,否则装载本类和父类的所有静态部分,若已经装载了则进入子类(当前类)的构造方法体(压入栈中,并把对象变量部分也压入栈)但不执行,而是进入父类构造方法,再执行前一类似过程,直到不能再往上走为止,再出栈开始执行.此过程中若有父类构造体中调用方法可被子类重载,则JVM会从最低子类对象处寻找此方法,找到则执行,虽然此时对象还未完全生成.