class A{
static{
System.out.println("1");
}
public A(){
System.out.println("2");
}
}
class B extends A{
static{
System.out.println("a");
}
public B(){
System.out.println("b");
}
}
public class Hello{
public static void main(String[] args){
A ab=new B();
ad=new B();
}
}output:
1a2b
1a2bab谁能告诉我为什么会显示“1a2bab”吗?
static{
System.out.println("1");
}
public A(){
System.out.println("2");
}
}
class B extends A{
static{
System.out.println("a");
}
public B(){
System.out.println("b");
}
}
public class Hello{
public static void main(String[] args){
A ab=new B();
ad=new B();
}
}output:
1a2b
1a2bab谁能告诉我为什么会显示“1a2bab”吗?
1
a
2
b
2
b这个是我预测的!
ad=new B();
运行到这输出1a2b2b这本书上弄错了 印的是1a2bab Thank you
明显的印刷错误! 粗制滥造的书籍。
最后的答案:1a2b2b
1
a
2
b
a
b
1
a
2
b
2
b
要知道为什么会有这样的输出结果首先要明白static{}代码块以及构造函数以及类继承的原理
1. static{}定义的代码块是在类加载时就执行的,而且只执行一次,由于B继承了A,所以必须A加载完后才能加载B,所以首先执行A中的static{},然后执行B中的static{}块,所以首先输出1a
2. A ab=new B();要生成B的实例,由于B继承了A,所以要先构造A,然后构造B,所以紧接着输出2b
3. 代码ab = new B();同第2步