由于抽象类无法实例化,并且由于 protected 成员始终对子类可见,因此看起来它的构造函数是 public 还是< EM>保护
是否存在公共构造函数与受保护构造函数相比可能有所不同的示例?我通常更喜欢适用的限制性最强的访问级别。
答案 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)
时。
* 实际可见性为默认。谢谢,Pshemo,发现错误并提供了一个不错的test example。
答案 1 :(得分:0)
将抽象类的构造函数设为public是没有意义的。但你可以肯定,没有人会直接创建实例。