用父类实例出一个子类对象,举例:
public class A {
//父类静态代码块
static {
System.out.println("父类静态代码块执行了");
}
//父类构造函数
public A(){
System.out.println("父类构造函数执行了");
}
}
public class B extends A{
//子类的静态代码块
static{
System.out.println("子类的静态代码块执行了");
}
//子类的构造函数
public B(){
super();
System.out.println("子类的构造函数执行了");
}
//子类重载的构造函数
public B(String name){
System.out.println("子类重载的构造函数执行了"+name);
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
B b=new B();
B b1=new B("name1");
B b2=new B("name2");
}
}
结果如下
父类静态代码块执行了
子类的静态代码块执行了
父类构造函数执行了
子类的构造函数执行了
父类构造函数执行了
子类重载的构造函数执行了name1
父类构造函数执行了
子类重载的构造函数执行了name2
由此可知:static语句是最先打印的,并且只打印一次;然后优先打印父类构造函数中的内容,再打印子类构造函数内容;调用了带参数的构造函数,就不会再调用默认无参构造函数
若在父类和子类中增加非静态代码块则执行顺序为:
父类静态代码块–>子类静态代码块–>父类代码块–>父类构造–>子类代码块–>子类构造(同样的是先执行静态代码块,并且只打印一次,此后都以父类代码块–>父类构造–>子类代码块–>子类构造顺序执行)