java – 具有公共构造函数而不是受保护构造函数的抽象类中是否有任何意义?

由于抽象类无法实例化,并且由于受保护的成员始终对子类可见,因此它的构造函数是公共的还是受保护的似乎没有区别.

有没有公​​共构造函数与受保护构造函数相比可以有所作为的示例?我通常更喜欢适用的限制性最强的访问级别.

最佳答案
不,没有充分的理由为抽象类创建公共构造函数:如果不先将子类化,则无法实例化抽象类,并且语言会为您处理相关的角点案例.

特别是,如果要匿名为抽象类创建子类,这意味着您无法在子类中提供自己的构造函数,则该语言将根据抽象基类的受保护构造函数的签名为您提供一个:

abstract class Foo {
    protected int x;
    protected Foo(int x) {this.x = x;}
    public abstract void bar();
}
public static void main (String[] args) {
    Foo foo = new Foo(123) { // <<== This works because of "compiler magic"
        public void bar() {System.out.println("hi "+x);}
    };
    foo.bar();
}

在上面的示例中,它看起来像是调用抽象类的受保护构造函数,但事实并非如此:编译器为您的匿名类*构建一个可见的构造函数,这是在编写新的Foo(123)时调用的.

Demo.

*实际可见性是默认的.谢谢,Pshemo,发现错误并提供了一个不错的test example.

转载注明原文:java – 具有公共构造函数而不是受保护构造函数的抽象类中是否有任何意义? - 代码日志