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

不止一次,我发现自己渴望一种在 Java 中不可能实现的变量可见性。我希望某些成员在他们自己的类和任何子类中都是可见的,而不是对包的其他部分或世界的其他部分。换句话说,我想要这样:

Modifier        Class     Package   Subclass  World
sub-class       Y         N         Y         N

然而,Java 的设计者只给了我 这个:

Modifier        Class     Package   Subclass  World
public          Y         Y         Y         Y
protected       Y         Y         Y         N
no modifier     Y         Y         N         N
private         Y         N         N         N

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

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

10417 次浏览

我想他们希望通过使用非线性访问层次结构来避免增加的复杂性。

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

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

处于同一包 被简单地认为是比 成为... 的子类型更密切的关系。

为什么?

您通常控制您正在开发的包的所有源代码,所以您至少拥有 可能性以避免发出错误的调用。

没有控制扩展类的所有代码。(任何人都可以扩展你的课程。)这意味着包私有访问起着更重要的作用。


*)但是,我可以用 package com.yourpackage;启动任何源文件,这样就不用控制包中的所有代码了!嗯,是的,但是 a)你不应该这样做,b)它可以被 密封包装阻止。

你应该把你的类放在它自己的包里,并且标记成员(实例变量或者方法)为 protected。 这样,除了子类之外,没有其他类可以访问您推销为受保护的成员。 如果您非常希望只有子类才能访问受保护的成员,那么您将在一个包中得到一个类。