Java:访问修饰符比“受保护”更严格,比“私人”限制更少?

Posted

技术标签:

【中文标题】Java:访问修饰符比“受保护”更严格,比“私人”限制更少?【英文标题】:Java: Access modifier more restrictive than 'protected', less restrictive than 'private'? 【发布时间】:2010-11-27 18:36:49 【问题描述】:

我想要类似于protected 的东西,其中只有实现protected 字段的类及其子类可以访问它。

所以,我希望能够将基类中的变量声明为private,但仍然能够从子类中访问它。

也许这违背了子类化的本质,private 和/或protected

Java 中是否存在类似的东西?

【问题讨论】:

作为一般规则,公开变量是一个坏主意——即使是子类也是如此。也有例外,但我鼓励你认真思考为什么要这样做。 (我意识到同样的问题也适用于 getter 方法调用 - 只是想指出一个潜在的问题) 这个功能(虽然不是这个语法)可以通过使用受保护的 getter 方法来实现。 【参考方案1】:

不,没有access modifier 可以做到这一点。 protected 修饰符是最接近的,但是它将字段暴露给同一包中的任何类以及子类(在同一包中或在同一包中)。

【讨论】:

【参考方案2】:

Java 中的字段只有四种访问级别:

private 包私有(默认;无访问修饰符) protected public

protected 将允许子类、同一包中的其他类以及类本身的成员访问protected 成员。

简短的回答是,没有办法完全达到预期。

关于这四个访问修饰符的描述,The Java Tutorials 中的Controlling Access to Members of a Class 有更具体的信息。

【讨论】:

【参考方案3】:

如果您控制代码库,则始终可以使用基类控制进入包的内容 - 如果它在其包中单独存在,则只有子类可以访问您想要保持私有的成员,子类除外。

【讨论】:

这是一个很好的解决方法。虽然它没有回答是否有这样的修饰符(没有)但确实提供了所需的功能。【参考方案4】:

不可能。你仍然可以将变量声明为私有,然后声明修改变量的公共方法 超类。然后调用变量的公共方法。

【讨论】:

以上是关于Java:访问修饰符比“受保护”更严格,比“私人”限制更少?的主要内容,如果未能解决你的问题,请参考以下文章

使用受保护的访问修饰符覆盖没有访问修饰符的方法

Java中受保护的访问修饰符

java 访问修饰符

Java 接口小总结;

Java中方法的默认范围是啥?

内部接口 *比内部受保护的构造函数更不可访问?