由于抽象类无法实例化,并且由于受保护的成员始终对子类可见,因此它的构造函数是公共的还是受保护的似乎没有区别.
有没有公共构造函数与受保护构造函数相比可以有所作为的示例?我通常更喜欢适用的限制性最强的访问级别.
不,没有充分的理由为抽象类创建公共构造函数:如果不先将子类化,则无法实例化抽象类,并且语言会为您处理相关的角点案例.
特别是,如果要匿名为抽象类创建子类,这意味着您无法在子类中提供自己的构造函数,则该语言将根据抽象基类的受保护构造函数的签名为您提供一个:
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();
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,它看起来像是调用了抽象类的受保护构造函数,但事实并非如此:编译器为您的匿名类*构建了一个可见的构造函数,这是在您编写时调用的new Foo(123)
.
*实际可见性是默认的.谢谢,Pshemo,发现错误并提供一个很好的测试示例.