为什么在Java中没有“仅子类”访问修饰符?


17

在Java中,方法有四个可用的访问修饰符:

public -任何类都可以使用此方法。

protected -同一包中的类和任何包中的子类都可以使用此方法。

private -只有此类可以使用此方法。

no modifier (“包私有”)-只有同一包中的类才能使用此方法。

经常发生的事情是,我想在超类中拥有所有子类都可以使用的有用方法。但是其他类访问此方法没有任何意义,从某种意义上说,它将破坏封装。

因此,我必须在超类publicor中声明这些有用的方法protected,这至少在包中将它们公开给所有其他类。即使它们仅打算由子类使用。

有没有理由subclasses-only在Java中没有访问修饰符?对我来说似乎很奇怪。我想念什么吗?

同样,subclasses-only当您只想将变量公开给子类时,访问修饰符也很有用。在我身上发生的事情很多。

Answers:


10

因为您可以通过使用protected修饰符并强制仅将父类及其子类放在同一包中来模拟仅子类的修饰符。

这确实是一个好习惯,因为这些程序包不仅有助于组织内聚的大型项目,而且还表明同一程序包中的类可能具有某种程度的耦合。


15
“并强制只有父类及其子类在同一个程序包中” –现在,该怎么做?
JimmyB 2014年

1
然后,您将无法使用仅打包访问修饰符。而且您需要大量的软件包。这不是实际的解决方案。
user253751

13

Java最初具有这样的修饰符。它是编写的,private protected但是在Java 1.0中已删除。

我认为这是一个判断电话,认为额外的复杂性不值得付出代价。

每种语言功能都有其代价:向新程序员教授语言时;在文件中; 在编译器,JVM和开发工具中实现它;关于程序正确性的推理;限制未来的语言发展;和更多。语言功能可能会进行N 2次交互,从而彼此交互。

百分之几的Java程序员已阅读Java语言规范和VM规范?我敢打赌,这只是一个很小的百分比,为了便于理解和我们可以依赖的工程产品,它主张使用更简单的语言

private protected功能的好处很小,因为封装是模块化的主要单元。


1
所以在1.0之前有Java版本?
Mark Yisri'1

1
@MarkYisri Java在1995年公开发布了alpha和beta版本,并且针对它们编写了大量代码。
David Moles

4

可以将访问控制看作是与一个正在与您的类一起讨论类方法和属性的虚构开发人员进行的讨论的结果...

您:假设您要执行x,您将调用方法doX。。开发人员:请告诉我更多..参数是什么?

这是公开的...

您:我在doX内部打电话给我...开发人员:哇,信息太多了,我不在乎。我只想知道如何使用它。告诉我一件事。

这是私人的...

您:当进行子类化时,我有doX和doY调用doIt来这样做。

这是受保护的...

您:我一个小时要去度假,在接下来的六个月里我将离开。老板说这只小狗是你的!再见 开发人员:等等,别走了,告诉我一切...

这是包。

您:doItWhen方法仅由此类调用,并且十年没有改变。DEV:哇,我们还剩50分钟。下一个属性,并且通话速度更快。

这是受保护的私人...


3

这个已经存在。它受到保护。

您可以控制包中存在哪些类。如果程序包中没有其他类,并且给定的变量或方法受到保护,则它是“仅子类”。

也就是说,您再次可以控制包中存在哪些类。您可以选择不使用受保护的方法或变量。


3
除了某些保留的系统软件包之外,我是否不能向任何软件包中添加类,甚至您不希望我向其中添加类的软件包中的一个?
大卫·摩尔

@David IIRC是的,但是它不允许您从另一个JAR访问程序包字段,因此即使将其放在同一程序包中,如果它位于另一个JAR中,也将无法访问它。但是,如果在同一个JAR中引用,则可以访问它,但是,如果您能够修改相关的JAR,则可以轻松地更改访问修饰符。
Pokechu22年

1
@ Pokechu22我认为您必须肯定地密封 JAR才能获得该保护,但是很重要。
David Moles
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.