访问修饰符的目的是什么?

我知道这适用于许多语言,而不仅仅是Java,但这是我最熟悉的语言。

我理解修饰符的作用以及如何使用它们。 我只是想知道,为什么我们需要它们? 为什么不能访问每个对象,无论它是否需要?

当你必须维持一个更大的项目时,原因会变得更加明显。 当一个方法或变量是公共的时,你必须在对其进行更改时要小心,因为你永远不知道代码库的哪些部分依赖于它的确切行为。

但是当变量或方法是私有的时,您知道它不在类之外使用。 这意味着当您进行更改时,您需要注意的代码要少得多。

通过将类function设为私有和公共,您可以清楚地将界面与外部世界从内部区分开。 您暴露于外部世界的次数越少,您对内部实施所做的事情就越自由。

例如,当您始终将变量设为私有并通过getter和setter访问它们时,您可以稍后将它们从变量更改为计算值,然后甚至为了性能原因将缓存添加到计算中。 如果它是一个公共变量,则必须在使用变量的任何地方更改代码。 但是当你通过getter和setter将它暴露给外面的世界时,所有其他代码都可以继续使用该类,就像没有任何改变一样。

根据类的工作方式的具体细节,使字段和方法私有化会使其他类不正确。 公共接口(以及最好的情况,实际interface )描述了客户端代码应如何根据正在完成的工作的语义与库交互。 然后,实现者可以自由地使用任何适当的技术来实现该接口,并且可以在知道客户端代码将继续工作的情况下进行重要的幕后更改。

日常的例子是Collections组接口。 大多数情况下,代码知道什么特定类型的Set正在使用中,逻辑上并不重要,只是它是一个支持某些操作并且没有重复的集合。 这意味着接受Set将适用于任何 Set ,包括HashSetImmutableSet ,因为编写接口的人并没有在实现的内部进行调用。

这种情况发生故障的一个例子是一些程序员在com.sun命名空间中使用包的不幸倾向,特别是在使用加密时。 升级到新版本的JRE通常会破坏这段代码,如果程序员使用了正确的javax.crypto接口和工厂方法而不是在JVM内部进行调试,那么这样就可以正常工作。

或多或少它们用于控制谁可以访问您的成员变量和函数。 这是Java中更广泛的封装概念( http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming) )。

来自Oracle Docs:

访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。 访问控制有两个级别:

在顶层 – public或package-private(没有显式修饰符)。

在成员级别 – public,private,protected或package-private(无显式修饰符)。

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

至于你为什么要这样做:

它与使用意图有关。 它可能最好被描述为一种设计选择,有助于指导整个代码库的使用。 通过标记私有内容,您告诉其他开发人员,此字段或方法不应在其当前目的之外使用。 随着时间的推移,随着开发人员的洗牌,这对于大型项 它有助于传达课程的目的和用途。

避免其他类直接访问类的内部成员。

这对于避免成员变量以不受控制的方式变异(例如,没有正确的validation,而不通知侦听器,……)是最有用的。

避免这种情况的另一个原因是内部实现可能随时发生变化,但您不想破坏使用它的代码。

正如其他人所指出的那样,这个概念称为封装。

访问修饰符用于设置类,变量,方法和构造函数的访问级别。 这为个人提供了更好地控制应用程序隐私的机会。 有4个访问修饰符。

修饰符| class级| 套餐| 子类| 世界

没有修饰符: – | —-是—- | ——是——– | ——–没有——– | —–无—- |


私人:——- | —- —-是| ——- ——–没有| ——–没有—- —- | —–不—- |


市民:——– | —- —-是| ——是——– | ——-是—– – | —- —-是|


保护:— | —- —-是| ——是——– | ——- ——-是| – —没有—– |


关于你的问题,我们确实需要并使用访问修饰符,因为我们需要限制谁可以调用我们的程序以及以何种方式调用。

此外,当涉及变量时,如果你公开一些东西,这意味着我可以直接访问它。 因此,我可以通过你的方法遵循你的指导方针,做任何我想做的事情。

例如:

 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方法,这将简单地使您的程序以exception方式运行(在最好的情况下)。

说明

私有成员只能在声明的同一个类中访问。 没有访问修饰符的成员只能在同一个包中的类中访问。

要么

如果变量在Class中设置为protected,则只能通过inheritance从相同类或不同包中定义的子类访问它。

受保护的成员可以在同一个包中的所有类中以及其他包中的子类中访问。

所有类都可以访问公共成员 (除非它驻留在一个不导出它的模块中的模块中,这是一个更好的表格版本。(带有模块列的未来certificate。)