Java 访问修饰符的用途是什么?

Java 访问修饰符的用途是什么?,java,access-modifiers,Java,Access Modifiers,我知道这适用于许多语言,不仅仅是Java,这也是我最熟悉的语言 我了解修饰符的作用,以及如何使用它们。我只是想知道,为什么我们需要它们?为什么不能访问每个对象,不管它是否需要访问?它们或多或少用于控制谁可以访问您的成员变量和函数。这是Java()中更广泛的封装概念 从Oracle文档: 访问级别修饰符确定其他类是否可以使用 特定字段或调用特定方法。有两个层次 访问控制: 在顶级public或package private(无显式修改器) 在成员级别,公共、私有、受保护或包私有(否 显式修饰符)

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


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

它们或多或少用于控制谁可以访问您的成员变量和函数。这是Java()中更广泛的封装概念

从Oracle文档:

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

在顶级public或package private(无显式修改器)

在成员级别,公共、私有、受保护或包私有(否 显式修饰符)

至于你为什么要这样做:


这与使用意图有关。最好将其描述为有助于指导整个代码库使用的设计选择。通过将某些内容标记为私有,您正在告诉其他开发人员,此字段或方法不应在其当前用途之外使用。随着时间的推移,这对于那些让开发人员洗牌的大型项目来说变得非常重要。它有助于传达类的目的和预期用途。

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

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

通过将类特性设置为私有和公共,可以清楚地将外部世界的接口与内部世界分开。您对外部世界的接触越少,您对内部实现的操作就越自由


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

根据类工作方式的具体细节,将字段和方法设置为私有可以防止其他类不正确地使用。公共接口(最好的例子是实际的
接口
)描述了客户机代码应该如何基于所做工作的语义与库交互。然后,实现者可以自由地使用任何适当的技术来实现该接口,并且可以在知道客户机代码将继续工作的情况下进行重大的幕后更改

一个日常的例子是接口集合组。大多数情况下,从逻辑上讲,代码不需要知道正在使用哪种类型的
集合,只需要知道它是一个支持特定操作且没有重复项的集合。这意味着接受
的方法将与任何
一起工作,包括
哈希集
ImmutableSet
,因为编写接口的人没有深入到实现的内部


出现这种情况的一个例子是,一些程序员不幸倾向于在
com.sun
名称空间中使用包,尤其是在使用加密技术时。升级到新版本的JRE通常会破坏这段代码,如果程序员使用适当的
javax.crypto
接口和工厂方法,而不是在JVM内部翻来覆去的话,这段代码会很好地工作。

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

这对于避免成员变量以不受控制的方式变异(例如,没有适当的验证,没有通知侦听器,…)非常有用

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


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

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

修饰符|类|包|子类|世界 否修饰符:-----是----------是----------是----------否----------否----|


二等兵:-----是----------否----------否----------否----------否----|


公众:---------------是----------是----------是----------是----------是----------是----|


受保护:-----是----------是----------是----------是----------是----------否-----|


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

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

例如:

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")"
   }
}
public int-maxUsers;
public void setMaxUsers(int用户)引发IllegalArgumentException{

如果(用户>0和用户解释

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

如果一个变量在一个类中被设置为protected,那么只能通过继承从同一个类或不同包中定义的子类访问它

受保护的