访问修饰符 - 目的是啥?

Posted

技术标签:

【中文标题】访问修饰符 - 目的是啥?【英文标题】:Access Modifiers - what's the purpose?访问修饰符 - 目的是什么? 【发布时间】:2014-09-14 14:44:01 【问题描述】:

我对一般编程比较陌生,我想知道是否有人可以帮助我理解访问修饰符的用途?我理解他们为类和变量等设置不同级别的访问权限这一事实,但你为什么要限制对这些的访问权限?不允许访问不同的东西有什么意义?为什么不只允许访问所有内容? 抱歉,这是一个愚蠢的问题!

【问题讨论】:

【参考方案1】:

原因有上千种,但我将引用here 中的一些,然后对其进行扩展:


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

一种类型强制执行某些不变量是很常见的(例如,一个人的 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 开头,然后:

    派生类是否需要/是否需要访问该成员?如果有,请升级到protected 其他类是否/是否需要访问此成员?如果有,请升级到public

【讨论】:

当你在一个程序员团队中非常有用,其中一个团队做后端,另一个团队做前端。前端程序员不需要知道他们需要显示的数据来自哪里,只要他们正在获取数据。【参考方案2】:

实际上,修饰符是用于限制访问以模拟现实生活中的对象。 访问修饰符

    私人 受保护 默认 公开

公共访问修饰符

在公共类中声明为公共(限制最少)的字段、方法和构造函数对 Java 程序中的任何类都是可见的,无论这些类是在同一个包中还是在另一个包中。

私人访问修饰符

私有(最严格的)字段或方法不能用于类和接口。它也不能用于接口中的字段和方法。声明为私有的字段、方法或构造函数受到严格控制,这意味着它们不能被封闭类之外的任何地方访问。标准的设计策略是将所有字段设为私有并为其提供公共 getter 方法。

受保护的访问修饰符

受保护的字段或方法不能用于类和接口。它也不能用于接口中的字段和方法。在超类中声明为受保护的字段、方法和构造函数只能由其他包中的子类访问。同一个包中的类也可以访问受保护的字段、方法和构造函数,即使它们不是受保护成员类的子类。

默认访问修饰符

Java 提供了一个默认说明符,当没有访问修饰符时使用该说明符。任何没有声明访问修饰符的类、字段、方法或构造函数只能由同一包中的类访问。默认修饰符不用于接口中的字段和方法。

【讨论】:

这不能回答问题。 OP 想知道我们为什么需要它们,而不是它们做什么。

以上是关于访问修饰符 - 目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

Java中成员属性默认访问修饰符是啥

方法有那些访问控制修饰符,分别是啥作用

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

C#中类。方法。字段 的默认访问修饰符分别是啥?

c++类不声明访问修饰符 默认是啥