Java:默认情况下继承所有超类的构造函数

时间:2019-06-28 17:34:41

标签: java inheritance optimization constructor code-duplication

我只是Java的初学者。

我的超类有几个构造函数:

public class Superclass {
    protected Superclass () {
        //some stuff
    }

    protected Superclass (typeA a){
        //some other stuff
    }

    protected Superclass (typeB B){
        //another stuff
    }
}

我想创建子类,但是它们都将仅使用Superclass的所有超级构造函数以及一些特定于该类动作的超级构造函数。子类的示例:

public class Subclass extends Superclass {
    protected Subclass () {
        super();
        //subclass stuff
    }

    protected Subclass (typeA a){
        super(typeA a);
        //the same subclass stuff
    }

    protected Subclass (typeB B){
        super(typeB B);
        //the same subclass stuff
    }
}

在Java中是否存在继承所有超类构造函数的东西?因为我不想复制粘贴代码,但是我想这样做:

@InheritsAllConstructors
public class Subclass extends Superclass {
    {
        //some stuff
    }
}

还是有更合适的解决方案?)

1 个答案:

答案 0 :(得分:0)

否,因为不会强制子类具有与其父类相同的构造函数(它们可以具有更多或更少的构造函数)。

  • 超类没有显式构造函数:不强制子类具有显式构造函数。
  • 超类具有一个显式构造函数:子类被强制具有至少一个构造函数。子类中的构造函数不必与超类中的构造函数匹配,但应使用super(...)
  • 进行调用。
public class Super {

    public Super(String value) {
        //...
    }
}

子类应提供一个调用super(..)的构造函数: 像这样:

private class Sub extends Super {

    public Sub(String value) {
        super(value);
    }
}

甚至是这样:

private class Sub extends Super {

    public Sub() {
        super("some default value");
    }
}
  • 超类具有多个显式构造函数:子类被迫提供至少一个调用超类的任何构造函数的构造函数:
public class Super {

    public Super(String value) {
        //...
    }

    public Super(int intValue) {
        //...
    }
}

子类可以是以下任意一个:

private class Sub extends Super {

    public Sub() {
        super("some default value");
    }
}

或者:

private class Sub extends Super {

    public Sub(String value) {
        super(value);
    }
}

或者:

private class Sub extends Super {

    public Sub(int intValue) {
        super(intValue);
    }
}

或这些构造函数的任意组合。