为什么不让所有的变量都是私有的?所有的变量必须给一个getter,setter来修改/读取。为什么要在这里留下“公共”关键字?除了方便之外,还有其他原因吗?为什么我们需要设置变量private/public?
回答
制作一个变量私有被称为information hiding或encapsulation。引入这个概念是为了将程序逻辑与程序实现分开。
拥有变量public或变量private与公共getter和setter是不一样的,即使是getter和setter也不会对变量进行任何转换。如果这是set
或者它是get
,就像缓存或约束检查一样,Getter和setter会对变量进行某种操作。
一个公共getter或setter可以被覆盖在一个子类中,专门化它的行为。你不能对公共变量做同样的事情。即使使用属性,行为也不一样,因为您无法覆盖子类中的访问器。写入(空)访问器为您提供了更多的扩展可能性。
请注意,这个概念并不是由所有语言实现的,例如C和Python他们没有实现。
那么,他们确实有一个默认值。
你应该问自己的问题是,为什么不是一切公开的,一旦你明白了 - 我相信你可以回答你自己的问题。
如果您是唯一使用此代码的人 - 请全部公开。如果不是 - 你应该使用私人领域,如果你不想让别人改变它,因为这可能会破坏你的设计,你的课堂行为将是不可预知的。都需要内部逻辑只
- 一些变量。如果你不需要它知道,也许你会需要它后来
你是非常正确的,最好是有可变private
,并有public
的getter/setter。直接访问public
的字段实际上是bad practice。
这与所谓的“表示独立性”有关:如果通过getter/setter进行外部访问,则可以更改对象的内部表示,而不会出现重大故障。
事实是,如果字段被迫在语言中是私人的,那么不会有很多东西会丢失。在大多数语言中,就像你说的那样,建议使用属性setter/getter来封装所有的字段。一种语言可以相当合理地强制所有字段都是私有的。
但是,如果您有类似的私人内部类:
public class OuterClass
{
private InnerClass
{
public int publicField;
}
}
那么你可能会说,干将/不需要setter方法。在这种情况下,在C#中,使用自动实现的属性同样简单。然而,这些只是在C#2中引入的,所以我猜这就是公有字段仍然被允许的原因。预先自动实现的属性,人们不得不编写getter/setter,这可能被认为是私人内部类的矫枉过正。
在具有指针的语言(如C++)中,如果希望从类外部获取指向字段的指针,则需要公共字段。
对于程序员来说,通常的反射就是将类中的所有字段设置为私有*,并提供由一系列获取器和设置器组成的接口来操作它们。这是根据封装原则,其中一个类的内部工作保持隐藏,并允许程序员说明可能发生什么变化。
某些情况下需要public,protected和default(= none)访问说明符。公共可用于任何方法或领域,应该可以从课堂外自由访问,而缺少说明符则限制对类本身和同一包中的任何类的访问。最后,当需要从包中的子类和其他类访问字段时,可以使用protected,这是框架中有时使用的一种方法。
这里显示的访问符之间的差异的联系:由于
http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
*随着容器对象除外检索一个实例为您提供了完全控制。
- 1. 为什么我们需要设置SONAR_RUNNER_OPTS?
- 2. 为什么我们需要在通过原型后将变量设置为void?
- 3. 为什么我们需要创建类变量来获取和设置属性?
- 4. 为什么我需要设置变量值
- 5. 为什么我们需要为IMessenger.Subscribe()明确设置收件人?
- 6. 为什么我们需要私有变量?
- 7. 为什么我们需要新的实例变量?
- 8. 为什么我们需要iOS中的property outlet和变量?
- 9. 为什么我们需要投放变量而不分配它?
- 10. 为什么我们需要在hdfs-site.xml中设置rpc地址
- 11. 为什么我们需要设置发布地址[network.host]的值
- 12. 为什么我们需要强化学习中的MDP设置
- 13. 为什么我们需要设置keywindow iOS中
- 14. 为什么我们需要在这里取消设置?
- 15. 为什么我们必须将__block变量设置为零?
- 16. 为什么我需要在后缀配置文件中设置myhostname变量?
- 17. 为什么你需要设置WORKON_HOME环境变量?
- 18. 为什么设置USER环境变量需要12秒?
- 19. DavLockDB:我们需要什么?
- 20. 为什么我们需要simple_one_for_one?
- 21. 为什么我们需要TensorFlow tf.Graph?
- 22. 为什么我们需要使用prompt.start()?
- 23. 为什么我们需要scalaz.stream迭代?
- 24. 为什么我们需要WCF
- 25. 为什么我们需要Anaconda 2.7?
- 26. 为什么我们需要编写log.isDebugEnabled?
- 27. 为什么我们需要ng-click?
- 28. 为什么我们需要Control.Lens.Reified?
- 29. 我们为什么需要纤维
- 30. 为什么我们需要org.junit.ComparisonFailure?