抽象类:此代码的输出

xhe*_*nry 2 java eclipse

目前正在对抽象类和接口进行实践测试并遇到了这个问题:

  public class Test {
  public static void main(String[] args) {
    new Circle9();
  }
}

public abstract class GeometricObject {
  protected GeometricObject() {
    System.out.print("A");
  }

  protected GeometricObject(String color, boolean filled) {
    System.out.print("B");
  }
}

public class Circle9 extends GeometricObject {
  /** Default constructor */
  public Circle9() {
    this(1.0);
    System.out.print("C");
  }

  /** Construct circle with a specified radius */
  public Circle9(double radius) {
    this(radius, "white", false);
    System.out.print("D");
  }

  /** Construct a circle with specified radius, filled, and color */
  public Circle9(double radius, String color, boolean filled) {
    super(color, filled);
    System.out.print("E");
  }
Run Code Online (Sandbox Code Playgroud)

}

为什么输出BEDC?我认为新的Circle9()会首先调用Circle 9类的无参数构造函数,打印A,然后打印其他字母,但我很难理解代码的路径.

mil*_*ose 5

构造函数有点特殊 - 除了之外Object(),任何类中的每个构造函数都必须在其中的任何其他代码运行之前调用一个,并且只在当前类或其超类中调用一个其他构造函数.您可以使用或选择明确指定哪个构造函数.如果不这样做,那么只会隐式调用超类的no-args构造函数.(好像你曾经使用过.)this(...)super(...)super()

这意味着您可以将此视为依赖链,该依赖链以您正在调用的构造函数开头new,最终必须达到Object().在您的示例中,此链将是:

Circle9() => prints "C"
  |
  | (explicit)
  v
Circle9(double) => prints "D"
  |
  | (explicit)
  v
Circle9(double,String,boolean) => prints "E"
  |
  | (explicit)
  v
GeometricObject(String, boolean) => prints "B"
  |
  | (implicit)
  v
Object() => does nothing
Run Code Online (Sandbox Code Playgroud)

然后,您在构造函数中运行实际代码,向后移动此链.

"A"永远不会打印的原因是永远GeometricObject()不会被调用,因为它既没有构造函数Circle9也没有GeometricObject(String,boolean)调用("依赖于"它) - 它们都显式调用了其他构造函数.


Boh*_*ian 5

按照调用堆栈:

  • 新的Circle9()调用Circle9()
  • Circle9()调用此(1.0)
  • Circle9(双)调用此(半径,"白色",假)
  • Circle9(double,String,boolean)调用super(颜色,填充)
  • GeometricObject(String,boolean)打印B
  • Circle9(double,String,boolean)打印E
  • Circle9(双)打印D.
  • Circle9()打印C