我知道这适用于许多语言,而不仅仅是Java,但这是我最熟悉的语言。
我理解修饰符的作用以及如何使用它们。我只是想知道,为什么我们需要它们?为什么不能访问每个对象,无论它是否需要?
答案 0 :(得分:13)
当您必须维护更大的项目时,原因会变得更加明显。当一个方法或变量是公共的时,你需要在对其进行更改时要小心,因为你永远不知道代码库的哪些部分依赖于它的确切行为。
但是当变量或方法是私有的时,你知道它不是在类之外使用的。这意味着在进行更改时,您需要注意的代码要少得多。
通过将类功能设为私有和公共,您可以清楚地将接口与外部世界分隔开来。您暴露于外部世界的次数越少,您对内部实施所做的事情就越自由。
例如,当您始终将变量设为私有并通过getter和setter访问它们时,您可以稍后将它们从变量更改为计算值,然后甚至为了性能原因将缓存添加到计算中。如果它是一个公共变量,则必须在使用变量的任何地方更改代码。但是当你通过getter和setter将它暴露给外面的世界时,所有其他代码都可以继续使用该类,就像没有任何改变一样。
答案 1 :(得分:1)
它们或多或少用于控制谁可以访问您的成员变量和函数。这是Java中更广泛的封装概念(http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming))。
来自Oracle Docs:
访问级别修饰符确定其他类是否可以使用 特定字段或调用特定方法。有两个级别 访问控制:
在顶层 - public或package-private(没有显式修饰符)。
在会员级别 - 公共,私人,受保护或包裹私人(没有 显式修饰符)。
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
至于你为什么要这样做:
这与使用意图有关。它可能最好被描述为一种设计选择,有助于指导整个代码库的使用。通过标记某些私有内容,您告诉其他开发人员,此字段或方法不应在其当前目的之外使用。随着时间的推移,随着开发人员的洗牌,这对大型项目来说确实很重它有助于沟通目的和课程的预期用途。
答案 2 :(得分:1)
使字段和方法私有化会使其他类不正确,这取决于类如何工作的具体细节。公共接口(以及最好的情况,实际的interface
)描述了客户端代码应该如何根据正在完成的工作的语义与库交互。然后,实现者可以自由地使用任何适当的技术来实现该接口,并且可以在知道客户端代码将继续工作的情况下进行重大的幕后更改。
日常示例是Collections组接口。大多数情况下,代码在逻辑上对于了解正在使用的Set
特定类型并不重要,只是它是一个支持某些操作且没有重复的集合。这意味着接受Set<Integer>
的方法将与任何 Set
一起使用,包括HashSet
和ImmutableSet
,因为编写界面的人并没有在实施的内部细节中徘徊。
这种情况发生故障的一个例子是一些程序员在com.sun
命名空间中使用包的不幸倾向,尤其是在使用加密时。升级到新版本的JRE通常会破坏这段代码,如果程序员使用正确的javax.crypto
接口和工厂方法而不是在JVM内部进行探索,那么这样就可以正常工作。
答案 3 :(得分:1)
避免其他类直接访问该类的内部成员。
这对于避免成员变量以不受控制的方式变异非常有用(例如,如果没有正确的验证,而不通知侦听器,......)。
避免这种情况的另一个原因是内部实现可能随时发生变化,但您不想破坏使用它的代码。
正如其他人所说,这个概念叫做封装。
答案 4 :(得分:1)
访问修饰符用于设置类,变量,方法和构造函数的访问级别。这为个人提供了更好地控制应用程序隐私的机会。有4个访问修饰符。
无修饰符: - | ----是---- | ------是-------- | --------否------ - | -----无---- |
私人:------- | ---- ----是| ------- --------没有| -------- NO- ------- | -----无---- |
公共:-------- | ----是---- | ------ --------是| ------- yes-- ----- | ----是---- |
保护:--- | ---- ----是| ------是-------- | ------- -------是| ----- -----不|
关于您的问题,我们确实需要并使用访问修饰符,因为我们需要限制谁可以调用我们的程序以及以何种方式调用。
此外,如果您将某些内容公之于众,那么这就意味着我有直接访问。因此,我可以通过你的方法遵循你的指导方针,做任何我想做的事。
例如:
public int maxUsers;
public void setMaxUsers(int users) throws IllegalArgumentException{
if(users > 0 && users <= 1000){
maxUsers = users;
}else{
throw new IllegalArgumentException("The users can not be less than 0 or greater than 1000")"
}
}
想象一下,您的整个程序都基于其maxUsers。既然,你给了我直接访问该变量的权利,我可以这样做: maxUsers = -15; 而不使用setMaxUsers方法,这将简单地制作你的程序表现异常(在最好的情况下)。
答案 5 :(得分:0)
<强>说明强>
私有成员只能在声明的同一个类中访问。 没有访问修饰符的成员只能在同一个包中的类中访问。
或
如果变量在Class中设置为protected,则只能通过继承从相同类或不同包中定义的子类访问它。
受保护的成员可以在同一个包中的所有类中以及其他包中的子类中访问。
所有类都可以访问公共成员(除非它位于不导出其声明的包的模块中) Here's a better version of the table. (Future proof with a column for modules.)