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
答案 0 :(得分: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 Language Specification § 12.5中记录了如何创建新实例。对于Object
以外的任何类,始终会执行超级构造函数。
- 此构造函数并不以对同一类中的另一个构造函数的显式构造函数调用(使用此函数)开头。如果此构造函数用于Object以外的其他类,则此构造函数将以显式或隐式调用超类构造函数(使用super)开始。使用这五个相同的步骤,递归评估超类构造函数调用的参数和过程。如果该构造函数调用突然完成,则出于相同原因,此过程也会突然完成。否则,请继续执行步骤4。
因此,始终会调用super
构造函数。如果只想打印“构造函数C”,则需要执行以下任一操作:
B
的构造函数,使其不再通过删除println
语句或一起删除无参数构造函数来打印“构造函数B”。在B
中添加第二个构造函数,该构造函数不打印任何内容,并从C
进行调用:
B(boolean b) {
}
C() {
super(true);
}
确保C
不再扩展B
:
class C {
public C() {
System.out.println("Constructor C");
}
}
答案 1 :(得分:1)
不,您不能这样做。 Java将根据层次结构调用所有构造函数。