关于继承的变量赋值、覆盖,构造函数的问题,坐等解答
是论坛有朋友发过的一个问题。
class A{
String str="A";
A(){
init();
}
public void init(){
System.out.println(str);
}
}
class B extends A{
String str="B";
B(){
super();
}
public void init(){
System.out.println(str);
}
}
public static void main(String[] args){
A b=new B();
System.out.println(b.str);
}
答案应该是
null
A 本来觉得自己是懂了,但是试着把class B中的 String str="B";去掉,打印结果变成了
A
A 这里感觉比较迷茫,第一次的打印有null我觉得是b的构造是调用父类class A的构造,父类调用的init函数因为子类有重写,我觉得应该是调的B类的init,此时子类还未完成构造,所以子类的str还未赋值。但是init调用实在父类的构造函数里的,此时父类应该也还未完成构造,但是为什么子类中去掉String str="B";后调用init就可以打印出A了?此时父类中的str已经赋值了吗?比较困惑,求高手能帮我解答下,也就是构造函数和变量赋值的顺序问题。感觉语言组织的不适太好,希望大家能懂。还有突然发现没分了很不好意思,但是现在又特纠结这问题,厚着脸皮发了,望能解答,谢谢!