今天无意在论坛中看到帖子 地址:http://bbs.csdn.net/topics/390457086?page=1#post-394480008
然后自己想说一下自己对这个问题的理解,不知道是否正确欢迎大家拍砖。
先看代码,这里我直接粘贴帖子中的代码。
public class A {
public A() {
init();
}
protected void init() {
}
public void print() {
System.out.print("1");
}
}
public class B extends A{
private String b1=null;
protected void init() {
this.b1 = "0";
print();
}
public void print() {
// TODO Auto-generated method stub
System.out.print(b1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
A a =new B();//输出0
a.print();//输出null?
}
}
大家把代码拷贝到IDE运行一下,如果你能很清楚的知道为什么会输出‘0’,null这样的结果。
那么我可以肯定 的说你java基础很扎实。如果不是,那么我建立你好好回去温习一下以前学的基础知识。
为什么会输出这样结果呢?
输出‘0’,估计大家基本上都知道。
1,在new B()的时候会隐式的调用其父类A的构造函数。
2,在A中会将变量this.b1赋值为0,并打印出来。
3,然后这时候会初始化B中的成员变量。此时b1变量是null。所以会打印null.
为什么会是这样呢?
这个和java构造函数执行的顺序有关系。
1,进入B的构造函数,给B的成员变量分配空间。(只是分配空间,没有初始化)。
2,隐式调用父类A的的构造函数。super().
3,给B类成员变量初始化。(这时会将成员变量初始化,引用类型默认null,整型默认0)。
4,执行B的构造函数体代码。