求教该程序的运行顺序!
public class B extends A{
static {
System.out.println("2");
}
public B(){
System.out.println("B");
}
}
public class A{
static {
System.out.println("1");
}
public A(){
System.out.println("A");
}
}
public class B extends A{
static {
System.out.println("2");
}
public B(){
System.out.println("B");
}
}
------解决方案--------------------你的main方法呢?
------解决方案--------------------你如何生成对象的呢?单单列出类有什么用?
------解决方案--------------------自己运行一下。到网上再查下静态代码块和继承类是怎么被调用的。
------解决方案--------------------12ABAB
默认构造器会调用super();
------解决方案--------------------首先,如果你对 Java 中的属性,方法,构造方法,代码块的执行顺序熟悉的话,这个就很简单了。
1> 父类的静态属性和静态代码块,按它们在文件中出现的先后顺序来执行。
2> 子类的静态属性和静态代码块,按它们在文件中出现的先后顺序来执行。
3> 父类的实例成员属性和实例代码块,按它们在文件中出现的先后顺序来执行。
4> 父类的构造方法。
5> 子类的实例成员属性和实例代码块,按它们在文件中出现的先后顺序来执行。
6> 子类的构造方法。
看懂上面之后,然后就可以来分析了:
A ab = new B();
这里 new 的是 B 类的对象,B 是 A 的子类,因此实例化 B 对象之前,先执行初始化 A 类。
A 和 B 类中都有静态代码块,因此先执行 A 类的静态代码块输出1,接着执行 B 类的静态代码块输出2。
接着执行 A 的构造方法输出 A,再执行 B 的构造方法输出 B。
OK,这行代码分析已经完成了。
接着是 new B();
首先,由 static 修饰的是属于静态的,静态的东西是属于类本身的,不属于任何一个对象,因此不管类被 new 了多少次,类的字节码文件只会被 Java 虚拟机加载一次,静态变量只会被分配一次的内存空间,而静态代码块只会在类被加载的时候执行一次,以后都不会再执行。
因此,这里的 new B(); 只会先输出父类 A 构造方法中输出的 A,然后输出 B 类构造方法中输出的 B。
因此,最终的输出结果是:
1
2
A
B
A
B