我想在多级继承中只调用 child class 构造函数?

I want to call only child class constructor in multilevel inheritance?

class A {
    public A() {
        System.out.println("Constructor A");
    }
}

class B extends A {
    public B() {
        System.out.println("Constructor B");
    }
}

class C extends B {
    public C() {
        System.out.println("Constructor C");
    }

    public static void main(String[] args) {
        C c = new C();
    }
}

当 运行 代码调用所有构造函数但只需要调用子构造函数。

像打印一样输出

Constructor C

不,你不能这样做。 Java 将根据层次结构调用所有构造函数。

就像评论和其他答案已经说过的那样,这显然是不可能的

如果一个class(classFoo)扩展了另一个class(classBar),那么[=的所有构造函数15=] 必须直接或间接调用 Bar 的构造函数之一。这可以通过显式调用或隐式调用来完成。

class Foo {

    // No constructor is specified, so a default, empty constructor is generated:
    // Foo() { }

}
class Bar extends Foo {

    Bar() {
        // Explicit call to a constructor of the super class is omitted, so a
        // default one (to Foo()) is generated:
        // super();
    }

}

Java Language Specification § 12.5中写了如何创建新实例。对于除 Object 之外的任何 class,始终执行超级构造函数。

  1. This constructor does not begin with an explicit constructor invocation of another constructor in the same class (using this). If this constructor is for a class other than Object, then this constructor will begin with an explicit or implicit invocation of a superclass constructor (using super). Evaluate the arguments and process that superclass constructor invocation recursively using these same five steps. If that constructor invocation completes abruptly, then this procedure completes abruptly for the same reason. Otherwise, continue with step 4.

因此 super 构造函数 总是 被调用。如果只想打印 "Constructor C",则需要执行以下任一操作:

  • 通过删除 println 语句或完全删除无参数构造函数来更改 B 的构造函数,使其不再打印 "Constructor B"。
  • B 中添加第二个构造函数,它不打印任何内容并从 C:

    调用它
    B(boolean b) {
    
    }
    
    C() {
        super(true);
    }
    
  • 确保 C 不再扩展 B:

    class C {
        public C() {
            System.out.println("Constructor C");
        }
    }