访问修饰符 - 作用是什么?

6

我对编程相对来说还比较新,想问问有没有人能帮我理解访问修饰符的作用?我知道它们针对类和变量等设置不同级别的访问权限,但为什么要限制访问呢?不允许不同的东西进行访问的目的是什么?为什么不允许任何东西都进行访问?

如果这是一个愚蠢的问题,那就抱歉啦!

2个回答

7
有无数个理由,但我会从这里引用并扩展其中的几个:

隐藏对象的内部可保护其完整性,防止用户将组件的内部数据设置为无效或不一致的状态。

一个类型往往需要强制实施特定的不变量(例如,人的ID号必须始终为8个字符长)。如果客户端能够完全访问类的每个成员,则无法强制执行这些约束。以下是一个具体示例:

public class Person
{
    public string Id;

    public void SetId(string newId)
    {
        if(newId.Length != 8)
            throw new InvalidArgumentException("newId");

        Id = newId;
    }
}

没有任何限制阻止我访问Id字段并将其设置为任何我想要的值!我可以这样做:

Person p = new Person();
p.Id = "Invalid Id";

这就是为什么你的私有状态需要保持 私有


封装的一个潜在好处是,它可以通过允许开发人员限制软件组件之间的相互依赖来减少系统复杂性,从而增加鲁棒性。

假设我开发了一个类,其中有40个方法 - 其中35个方法用于连接类的内部和实现其功能,另外5个方法对客户端非常重要。现在我把这个类给你使用 - 你看到它的公共接口,里面有40个方法,其中大部分与你无关,你会问我 "这是什么乱麻??"

为了确保类型的意图清晰,您需要限制与客户端无关的任何成员的访问权限。

此外,更多的公共成员 = 更大的公共表面 = 需要测试的东西更多 = 更难维护。


作为一个经验法则,尽可能将成员设置为私有,然后逐步提高访问级别。例如,从 private 开始,然后:

  1. 派生类需要访问这个成员吗?如果需要,提升为 protected
  2. 其他类需要访问这个成员吗?如果需要,提升为 public

当你在一个程序员团队中,其中一组人负责后端,而另一组人负责前端时,这非常有用。前端程序员不需要知道他们的数据来自哪里,只需要展示数据即可,只要他们能获取到数据就可以了。 - DarkBee

1
实际上,修饰符用于限制对建模的访问,就像现实生活中的对象一样。 访问修饰符:
1. private 2. protected 3. default 4. public
公共访问修饰符:
在公共类中声明为public(最不限制)的字段、方法和构造函数可被Java程序中的任何类看到,无论这些类是否在同一个包中或另一个包中。
私有访问修饰符:
最严格的私有字段或方法不能用于类和接口。它也不能用于接口内的字段和方法。声明为private的字段、方法或构造函数是受严格控制的,这意味着它们不能被封闭类外的任何地方访问。一种标准的设计策略是将所有字段设为私有,并为它们提供公共的getter方法。
受保护的访问修饰符:
受保护的字段或方法不能用于类和接口。它也不能用于接口内的字段和方法。在超类中声明为protected的字段、方法和构造函数只能由其他包中的子类访问。同一包中的类也可以访问受保护的字段、方法和构造函数,即使它们不是受保护成员类的子类。
默认访问修饰符:
Java提供了一个默认的修饰符,当没有访问修饰符时使用。任何没有声明访问修饰符的类、字段、方法或构造函数只能被同一包中的类访问。默认修饰符不用于接口中的字段和方法。

4
这并没有回答问题。提问者想知道我们为什么需要它们,而不是它们能做什么。 - dcastro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接