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

时间:2014-10-27 20:44:45

标签: java constructor

由于抽象类无法实例化,并且由于 protected 成员始终对子类可见,因此看起来它的构造函数是 public 还是< EM>保护

是否存在公共构造函数与受保护构造函数相比可能有所不同的示例?我通常更喜欢适用的限制性最强的访问级别。

2 个答案:

答案 0 :(得分:8)

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

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

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();
}

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

Demo.

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

答案 1 :(得分:0)

将抽象类的构造函数设为public是没有意义的。但你可以肯定,没有人会直接创建实例。