class ABC{
static{
System.out.print("1");
}
public ABC(){
System.out.print("2");
}
}
class BCD extends ABC{
static {
System.out.print("a");
}
public BCD(){
System.out.print("b");
}
}
public class cd {
public static void main(String [] args){
@SuppressWarnings("unused")
ABC ab=new BCD(); //
System.out.println("********");
ab=new BCD(); //b
}
}
这段代码的整个执行顺序是怎么的。。。。
简单讲一下java的ClassLoad机制:
1. 所有的静态代码都在类加载(就是JVM第一次使用该类,需要把该类的class加载入内存中)时执行,顺序从上至下;
2. 所有非静态代码都在对象(类)被实例化时执行,非静态代码段先执行,然后是构造器;
3. 在对象(类)有继承关系时,父类总是先于子类执行。
好了,在了解了以上3个原则后,对于Java代码的执行顺序就比较清楚了。
代码先出现ABC的声明,所以先加载ABC: -->打印“1”;
然后实例化BCD,加载BCD: -->打印 “a”;
由于BCD继承自ABC,所以先执行ABC: -->打印“2”;
最后执行BCD: -->打印“b”;
又实例化一次BCD,由于已经加载了,所以不再执行静态代码: -->打印“2”打印“b”。
所以最后应该输出:
1a2b
2b