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

时间:2011-03-14 14:45:52

标签: java language-design visibility

我不止一次发现自己希望获得Java中不可能的可变可见性。我希望某些成员在他们自己的类和任何子类中都可见,但不是对包的其余部分或世界其他地方都可见。换句话说,我想要这个:

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

然而,Java的设计者只给了我this

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或默认值更自然的可见性级别。原因是它的重要性不足以包含在内,还是与我未考虑的可能的副作用更相关?

3 个答案:

答案 0 :(得分:18)

我认为他们希望通过拥有非线性访问层次结构来避免增加的复杂性。

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

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

答案 1 :(得分:6)

显然,他们认为属于的子类型并不像是同一个包那样是“亲密关系”。对于你建议的修饰符,它与protected没有多大区别,除非子类实际上在不同的包中,并且我声称,在同一个包中,被认为是一个更接近的关系,而不是是一个完全不同的包中的子类。

答案 2 :(得分:3)

您应该将您的类放在它自己的包中,并将该成员(实例变量或方法)标记为受保护。 这样,除了子类之外,没有其他类可以访问您作为受保护市场营销的成员。 如果您迫切希望只有子类访问该受保护的成员,您最终会在一个包中使用一个类。