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

2022-08-31 12:56:47

不止一次,我发现自己渴望一个在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


答案 1

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

您应该可以控制包,因此只需不要在此处调用这些受保护的方法即可。

(顺便说一句,与 并不完全相同,因为非静态受保护方法(如果不在同一包中)不能在声明类的任意对象上调用,而只能在代码所在的子类的对象上调用。protectedsub-class and packageObject.clone()


答案 2

“在同一包中”只是被视为一种比“子类型”更接近的关系。

为什么?

您通常控制正在开发的软件包(*)的所有源代码,因此您至少可以避免进行错误的调用。

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


*)但是,嘿,我用pack package com.yourpackage开始任何源文件;所以你无法控制包中的所有代码!好吧,是的,但是a)你不应该这样做,b)可以通过密封包装来防止它。