0
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
4

2 回答 2

2

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

如果一个类(类Foo)扩展了另一个类(类Bar),那么 的所有构造函数Foo必须直接或间接调用 的一个构造函数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 语言规范第 12.5 节中,它描述了如何创建新实例。对于除了超级构造函数之外Object的任何类,总是会被执行。

  1. 此构造函数不以显式构造函数调用同一类中的另一个构造函数开始(使用 this)。如果此构造函数用于 Object 以外的类,则此构造函数将以显式或隐式调用超类构造函数(使用 super)开始。使用这五个相同的步骤递归地评估超类构造函数调用的参数和过程。如果该构造函数调用突然完成,则此过程出于相同的原因突然完成。否则,继续执行步骤 4。

所以总是调用super构造函数。如果您只想打印“Constructor C”,那么您需要执行以下任何操作:

  • 更改构造函数,B使其不再通过删除println语句或完全删除无参数构造函数来打印“构造函数 B”。
  • 添加第二个构造函数,B其中不打印任何内容并从以下位置调用它C

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

    class C {
        public C() {
            System.out.println("Constructor C");
        }
    }
    
于 2019-02-11T11:16:31.140 回答
1

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

于 2019-02-11T10:43:23.167 回答