繁体   English   中英

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

[英]Access Modifiers - what's the purpose?

我对编程总体上比较陌生,我想知道是否有人能帮我理解访问修饰符的目的? 我理解他们为类和变量等设置了不同级别的访问权限,但为什么要限制对这些访问权限的访问权限呢? 不允许访问不同的东西有什么意义? 为什么不只是允许访问一切?

对不起,如果这是一个愚蠢的问题!

有数千个原因,但我会从这里引用一些,然后对这些进行扩展:


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

类型强制执行某些不变量是很常见的(例如,一个人的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宣传

实际上,修饰符用于限制Access的建模,就像现实生活对象一样。 访问修饰符

  1. 私人的
  2. 保护
  3. 默认
  4. 上市

公共访问修饰符

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

私人访问修饰符

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

受保护的访问修饰符

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

默认访问修饰符

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM