2012-05-01 29 views
10

我是一名AP Java学生,我正在为我的考试而练习。我碰到这个问题,我不明白的答案:多态现象和构造函数

考虑下面的类:

public class A 
{ 
    public A() { methodOne(); } 

    public void methodOne() { System.out.print("A"); } 
} 

public class B extends A 
{ 
    public B() { System.out.print("*"); } 

    public void methodOne() { System.out.print("B"); } 
} 

是什么时,执行以下代码的输出:

A obj = new B(); 

正确答案是B *。有人可以向我解释方法调用的顺序吗?

+0

将打印语句添加到'A'的构造函数中,它可能会变得更清晰。 –

回答

27

B构造函数被调用。 B构造函数的第一个隐式指令是super()(调用超类的默认构造函数)。所以A的构造函数被调用。 A的构造函数调用super(),它调用java.lang.Object构造函数,该构造函数不会打印任何内容。然后调用methodOne()。由于对象属于B类型,因此调用B的版本methodOne,并打印B。然后B构造函数继续执行,并打印*

必须注意的是,从构造函数调用一个可重写的方法(如A的构造函数)是非常糟糕的做法:它调用尚未构造的对象的方法。

+4

+1,特别是对于坏练习位。 –

+0

而且,超级方法可能无法像'A类'期望的那样工作。 –

+0

我不知道隐式调用super(),谢谢! – user1104775

2

基类必须在派生类之前构造。

第一个A()被调用,其中调用methodOne()打印B

接下来,B()被称为打印*