我想在多级继承中仅调用子类构造函数吗?

时间:2019-02-11 10:12:19

标签: java inheritance constructor constructor-chaining

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

2 个答案:

答案 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以外的任何类,始终会执行超级构造函数。

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

因此,始终会调用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将根据层次结构调用所有构造函数。