求输出结果
希望大神能解释下A b=new B(); 谢谢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);
}
希望大神能解释下A b=new B(); 谢谢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);
}
—— 成员属性可没有“重写”的概念希望大神能解释下A b=new B(); 谢谢
—— 需要解释啥?父类的变量自然可以引用子类的对象。
—— 比如: Object obj = new String("123"); 这不是很正常的事情么?
B()调用父类的构造(super),
A()构造调用init,调用的是(new B()).init();
###########至此,B的init方法输出,完成构造
执行System.out,(A)b.str输出执行结果:
null
A
String str="A";
A(){
this.str = "B"
}
最后打印下结果看是A还是B,就知道谁先执行谁被覆盖了。个人觉得这种类似八股文一点意思都没有。。谁会在fields段赋值后又在constructor中初始化不过谁能说说同一个对象中有一模一样的2个属性str这个不觉得很奇怪么。。即使超类按照封装的概念是原子单元但毕竟不是还在子类中么。编译的bytecode文件中有什么区分么。
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 class CAB
{
public static void main(String[] args)
{
A b=new B();
System.out.println(b.str);
}
}
运行后输出null,A
A b=new B();这是多态,B继承了A,这就是多态问题,父类的引用指向子类的对象;
方法可以重写,也可以重载, 但是属性不能重写, 在多态实例化的过程中,首先调用父类的构造方法,然后再调用子类的构造方法;
在调用子类的构造方法时,通过super(),调用父类的属性,从而实现输出;
首先进入了A的构造方法,而A的构造方法调用的了init方法,
这个init方法不是A自己的init方法,而是B继承了A之后重写了A的init方法(也就是说A构造方法里
调用的init方法是B的init方法),所以B的这个init方法输出了null,这个null是A b = new B()
的时候就已经输出的,下面的Sysoutprintln(b.str)输出A是,因为声明的对象是A,所以他调用的
是A里的属性!
在执行new B()时,先把成员变量敷默认值,B里的str为null.
之后追溯其父类,到父类同样要把父类的成员变量赋默认值,A里的str为null,(一直到Object).
再返回来,每到一级先给成员变量显式赋值, A里给str赋值'A'。再执行构造函数语句,init(). 这个init()被子类重写了,所以执行子类的init()方法,输出子类的str,这时子类的str是null.
执行完父类的构造函数后,返回到子类继续初始化,这时才给str显式赋值'B'.再执行构造函数语句。输出b.str,因为b是父类引用,所以输出A.
参考一下:
http://wenwen.soso.com/z/q191435823.htm
首先楼主要明白的一点是,当构造方法没有执行完毕时类的属性(除static的外)是被赋值为系统默认的值,所以String为null;
接下来实例化一个B即new B(),根据多态调用父类的构造函数A(),然后调用父类的init(),因为init()被子类覆写,所以调用B的init(),init中输出的是str,但此时B的构造函数还没执行完毕,所以父类中str=null;
综上所述输出为null;
总结:这个题目还是考查基础内容,对java初始化的理解,还是相当有深度的,不知这是哪个公司的笔试题?