Java 多态性与构造函数
我是一名AP Java学生,正在为考试进行练习。我遇到了这个问题,我不明白答案: 考虑以下类别:Java 多态性与构造函数,java,polymorphism,Java,Polymorphism,我是一名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() { S
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*。有人能给我解释一下方法调用的顺序吗?基类必须在派生类之前构造 首先调用
A()
,调用打印B的methodOne()
接下来,调用B()
,它将打印*
调用B构造函数。B构造函数的第一条隐式指令是super()
(调用super类的默认构造函数)。因此,调用了A的构造函数。A的构造函数调用super()
,它调用java.lang.Object构造函数,该构造函数不打印任何内容。然后调用methodOne()
。由于对象是类型B,因此调用B的methodOne
版本,并打印B
。然后B构造函数继续执行,并打印*
必须注意的是,从构造函数调用可重写方法(就像a的构造函数那样)是一种非常糟糕的做法:它在尚未构造的对象上调用方法。向a
的构造函数添加一条print语句,它可能会变得更清晰。而且,overidden方法可能无法像A类
所期望的那样工作。