为什么String构造函数应该受保护而不是私有?

时间:2010-09-22 16:42:40

标签: java constructor access-modifiers

我有点卡在这个SCJP练习题上,特别是第5行(使用String构造函数)。我认为它应该是私有的,但解决方案是“受保护的”。我认为受保护的访问不能满足所有Alpha实例都将String alpha设置为A的要求。如果构造函数受到保护,那么同样在包alpha中的任何其他类,或者Alpha的任何子类,不管包,都可以调用它,将alpha设置为它想要的任何东西。 Amirite?任何人都可以澄清吗?谢谢!

alt text

1 个答案:

答案 0 :(得分:3)

如果构造函数是私有的,那么Beta如何调用super(a)

所以它不能私有......但你是对的:如果是protected那么同一个包中的其他类型确实可以调用

new Alpha("some other value")

换句话说,我不相信private是正确答案,但我不相信 是正确的答案。您无法限制Java中派生类的可见性。

编辑:我知道了:)

使Alpha抽象,并使用构造函数执行您喜欢的操作,只要Beta publicprotected可见即可。这样第三个条件自动为真,因为永远不会只是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点仍然是好的。