2014-07-23 119 views
3

我对编程一般都比较陌生,我想知道是否有人可以帮助我理解访问修饰符的用途?我明白他们为类和变量设置不同级别的访问权限,但为什么你想限制什么访问这些?什么是不允许访问不同的东西?为什么不只是允许访问一切?

对不起,如果这是一个愚蠢的问题!访问修饰符 - 目的是什么?

回答

3

有千千万万的理由,但我会从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. Do/would派生类需要访问此成员吗?如果是这样,请推荐到protected
  2. 其他课程是否需要访问该成员?如果是这样,推广到public
+0

当你在一个程序员团队中时,非常有用,在这个团队中,一个团队做后台,而另一个团队做前台。前端程序员不需要知道他们需要显示的数据,只要他们正在获取数据。 – DarkBee

+0

非常感谢,非常好的答案,非常简洁。 –

1

实际上,修饰符用于将建模的访问限制为与真实生活对象相似。 访问修饰符

  1. 私人
  2. 保护
  3. 默认
  4. 公共

公共访问修饰符

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

私有访问修饰符

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

受保护的访问修饰符

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

默认访问修饰符

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

+2

这并没有回答这个问题。 OP想知道为什么我们需要他们,而不是他们做什么。 – dcastro