只能被自己的类或其他子类调用的Java方法

Posted

技术标签:

【中文标题】只能被自己的类或其他子类调用的Java方法【英文标题】:A Java method that can only be called by its own class or by other subclasses 【发布时间】:2014-01-30 07:20:09 【问题描述】:

我希望我的类有一个只能由其自身或其子类调用的方法。

最接近的是protected访问,但它也允许同一个包中的其他类调用该方法,这是我不想要的。

有没有办法实现这一点,还是我应该考虑进行某种包重构?

在我看来private 不会让子类使用该方法。

【问题讨论】:

切换到 Scala,它将 protected 关键字重新定义为您想要的含义 ;-) 还有其他人记得 Java 小时候的 private protected 吗? ***.com/a/903050/831878 【参考方案1】:

见In Java, difference between default, public, protected, and private

没有这样的事情。但是你可以将类移动到一个空包中并使用protected

【讨论】:

【参考方案2】:

简答:重构你的包

解释:

Java 规范认为package 关系比subclass 关系更密切。这是因为我可以扩展任何类,只要我导入它。

如果您想确保即使包外的子类也无法访问该方法,请使用default 可见性修饰符。

Source

Stack Overflow reference

【讨论】:

【参考方案3】:

要做到这一点,请将您的类放在自己的包中,并使方法成为默认保护。包中不会有任何其他类可以看到它通过包访问来调用它。

还请考虑,如果您 seal the jar 该类在其中,则只有您控制给定包中的内容,并有效地锁定了任何其他人,无法在您定义的包中创建类 - 没有其他人能够将一个类引入包中并打破封装。

【讨论】:

但是,“密封”一个 jar 文件并不能阻止某人提取文件的内容,将自己的类添加到一个包中,然后在自己的代码中使用该组合,无论该组合是否用作单独的文件或将文件捆绑到一个新的 jar 文件之后......可能是密封的......当然,这不是真正的问题,除非有人认为包、访问关键字或“密封”jar 正在做出某种保证,它们不是. 这种技术使得无法对类进行子类化,这违反了问题的条款。 -1 @ejp 您是否将密封罐子与最终课程混淆了? @MichaelT 这个问题很荒谬。【参考方案4】:

抱歉,如果您希望子类能够调用或覆盖方法而不使其成为public,那么protected 是您唯一的选择。如果出于某种原因您不希望同一包中的其他类具有访问权限,请将您的类移动到新包中。但如果你认为包和访问控制关键字形成某种 DRM(即数字版权管理)系统,而不是简单的代码管理和类“合同”系统,那你就错了。将访问控制关键字视为文档,当其他代码不符合文档所表达的意图时,编译器有能力验证它。

【讨论】:

以上是关于只能被自己的类或其他子类调用的Java方法的主要内容,如果未能解决你的问题,请参考以下文章

Java基础类-----继承

Java基础类-----继承

java 类2

Java 面向对象

Java中子类的访问权限为何比父类大?

java protected与private