为什么在Java中没有子类可见性修饰符?

不止一次,我发现自己希望Java中不可能实现可变的可见性。 我希望某些成员能够在自己的class级和任何一个小class中被看到,但是不能够看到其他人或者世界其他地方。 换句话说,我想这个:

Modifier Class Package Subclass World sub-class YNYN 

但是,Java的devise者只给了我这个 :

 Modifier Class Package Subclass World public YYYY protected YYYN no modifier YYNN private YNNN 

当我想要这样的东西时,典型的情况是创build一个抽象类。 有时我发现抽象父母需要访问某些成员,但是具体的孩子也可以。 我可以通过使成员protected来为他们提供这种访问权限,但是当我不想要的时候,这会打开对包的其余部分的访问。

要完全清楚,我知道这样的修饰符在Java中是不可能的。 我的问题是为什么这种修饰符不包含在Java中? 看起来(在我看来)是一个比protected或默认更自然的可见性水平。 是不是因为它的重要性不被包括在内,还是与我没有考虑到的可能的副作用有关呢?

我想他们想通过拥有非线性访问层次来避免增加的复杂性。

你应该可以控制你的包,所以不要在那里调用这些受保护的方法。

(顺便说一句, protectedsub-class and package不太一样,因为非静态保护方法(如果不在同一个包中)不能在声明类的任意对象上调用,而只能在代码所在的子类(你可以在Object.clone()上看到这个,只能被被克隆对象的类调用)

显然,他们认为是一种“子types”,而不是“ 相同的包装” 。 而对于你所build议的修饰语,除非子类实际上处于一个不同的包中,否则它与protected内容并没有多大的区别,我认为,在同一个包中,它被认为是一个更紧密的关系,一个完全不同的包。

你应该把你的类放在它自己的包中,并将成员(实例variables或方法)标记为受保护的。 这样,没有其他的类,除了子类可以访问你保护的那个成员。 如果您迫切希望只有子类访问受保护的成员,那么最终会在一个包中包含一个类。