多态性和构造函数

2022-01-24 00:00:00 polymorphism java

我是一名 AP Java 学生,我正在准备考试.我遇到了这个问题,我不明白答案:

I am an AP Java Student and I am practicing for my exam. I came across this question and I don't understand the answer:

考虑以下类:

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"); }
}

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

What is the output when the following code is executed:

A obj = new B();

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

The correct answer is B*. Can someone please explain to me the sequence of method calls?

推荐答案

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

The B constructor is called. The first implicit instruction of the B constructor is super() (call the default constructor of super class). So A's constructor is called. A's constructor calls super(), which invokes the java.lang.Object constructor, which doesn't print anything. Then methodOne() is called. Since the object is of type B, the B's version of methodOne is called, and B is printed. Then the B constructor continues executing, and * is printed.

必须注意,从构造函数调用可覆盖的方法(就像 A 的构造函数一样)是非常糟糕的做法:它调用尚未构造的对象上的方法.

It must be noted that calling an overridable method from a constructor (like A's constructor does) is very bad practice: it calls a method on an object which is not constructed yet.

相关文章