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

时间:2014-07-23 12:06:53

标签: oop private encapsulation public access-modifiers

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

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

2 个答案:

答案 0 :(得分:5)

有数千个原因,但我会引用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开始,然后:

  1. 派生类需要访问此成员吗?如果是,请升级到protected
  2. 其他课程是否需要访问此会员?如果是,请升级到public

答案 1 :(得分:1)

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

  1. 私有
  2. 保护
  3. 默认
  4. 公共
  5. 公共访问修饰符

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

    私人访问修饰符

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

    受保护的访问修饰符

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

    默认访问修饰符

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