当前位置: 首页 > 面试题库 >

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

曹焱
2023-03-14
问题内容

在不止一次的情况下,我发现自己希望获得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默认值或默认值更自然。仅仅是因为它的原因不够重要,还是与我未曾考虑过的可能的副作用更相关?


问题答案:

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

您应该控制您的包,因此不要在其中调用这些受保护的方法。

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



 类似资料:
  • private private修饰符是我们使用的最限制的修饰符。它表示它只能被自己所在的文件可见。所以如果我们给一个类声明为private,我们就不能在定义这个类之外的文件中使用它。 另一方面,如果我们在一个类里面使用了private修饰符,那访问权限就被限制在这个类里面了。甚至是继承这个类的子类也不能使用它。 所以一等公民,类、对象、接口……(也就是包成员)如果被定义为private,那么它们只

  • Kotlin中这些修饰符是与我们Java中的使用是有些不同的。在这个语言中默认的修饰符是public,这节约了很多的时间和字符。但是这里有一个详细的解释关于在Kotlin中不同的可见性修饰符是怎么工作的。

  • 问题内容: 在类的前面和构造函数的前面使用修饰符(在本例中为package- private)有什么区别?我认为构造函数前面的修饰符意味着可以实例化该类的实例。但是班级前面的修饰符呢? 问题答案: 首先,由3个访问修饰符创建4个访问级别。 公共-随处可见 受保护-可在同一个包装中以及儿童中使用 默认-仅在同一程序包中可访问 私人-仅在同一班级可以访问。 您是正确的-构造函数级别的修饰符与类的实例直

  • 所有构造函数默认都是public的,它们类是可见的,可以被其它地方使用。我们也可以使用这个语法来把构造函数修改为private: class C private constructor(a: Int) { ... }

  • 问题内容: 当您在子类中重写某个方法时降低了其可见性时,为什么编译器会给出错误消息? 问题答案: 因为子类的每个实例仍然需要是基类的有效实例(请参见Liskov替换原理)。 如果子类突然失去了基类的一个属性(例如,一个公共方法),那么它将不再是基类的有效替代品。

  • 问题内容: 众所周知,有多种原因(请参阅第一个答案)。为什么只有一个例外涵盖所有这些情况,而不是多个继承自的细粒度情况? 问题答案: 我期望如此,因为发生这种情况时,您实际上什么也做不了:为何耗尽资源几乎无关紧要,因为无论如何您都被搞砸了。也许附加信息会很好,但是… 我知道tomcat会尝试执行“内存不足降落伞”操作,在此过程中,它们会保留一块内存并尝试释放它,但是我不确定它的工作原理。