我有点卡在这个SCJP练习题上,特别是第5行(使用String构造函数)。我认为它应该是私有的,但解决方案是“受保护的”。我认为受保护的访问不能满足所有Alpha实例都将String alpha设置为A的要求。如果构造函数受到保护,那么同样在包alpha中的任何其他类,或者Alpha的任何子类,不管包,都可以调用它,将alpha设置为它想要的任何东西。 Amirite?任何人都可以澄清吗?谢谢!
答案 0 :(得分:3)
如果构造函数是私有的,那么Beta如何调用super(a)
?
所以它不能私有......但你是对的:如果是protected
那么同一个包中的其他类型确实可以调用
new Alpha("some other value")
换句话说,我不相信private
是正确答案,但我不相信 是正确的答案。您无法限制Java中仅派生类的可见性。
使Alpha
抽象,并使用构造函数执行您喜欢的操作,只要Beta
public
或protected
可见即可。这样第三个条件自动为真,因为永远不会只是Alpha
的任何实例!
package alpha;
public abstract class Alpha {
final String alpha;
Alpha() { this("A"); }
public Alpha(String a) { alpha = a; }
}
package beta;
public class Beta extends alpha.Alpha {
public Beta(String a) { super(a); }
}
现在, 需要对第1点进行一些狡猾的解释。我认为Beta
的实例是Alpha
<的实例/ em>(毕竟,instanceof
将返回true :)以便满足第1点,但Beta
的实例不是“Alpha
类型的对象”,所以第3点仍然是好的。