【问题标题】:Explain encapsulation in OOP解释 OOP 中的封装
【发布时间】:2014-01-24 17:54:57
【问题描述】:

我是 OOP 新手,对封装有一些疑问。

  1. “部分”封装和“弱”封装之间的区别是什么意思? java中的一个例子对我有帮助。

  2. 封装是否意味着只将数据像类一样放在胶囊中,还是必须有访问修饰符?

我读到封装意味着隐藏和组合数据。

在这个例子中:

class A{ 
  public int a;
  public void foo(){}
}

上面的代码是封装的例子吗?如果是,那么外部世界没有什么隐藏的,因为afoo 是公开的。 afoo 必须是 private 才能使此示例被视为封装?

【问题讨论】:

  • 感谢投反对票,但请在投反对票前帮助我或发表评论。
  • 上面的代码不是封装的例子,因为'a'在外面是可见的。它不是隐藏的……让它私有,有公共的getter和setter,然后就可以了……它被封装了。
  • 好的。意思是bean类是封装的定义。因为bean类是这样定义的。
  • 在现实世界中,您正在使用您的大脑。但是,仍然不知道大脑是如何运作的……那是封装。

标签: java oop encapsulation


【解决方案1】:

这里有一个很好的解释https://mail.mozilla.org/pipermail/es-discuss/2010-December/012334.html

基本上,如果您要实现 java 库或 API,您的目标是强封装,以便用户无法访问他们不应该访问的内容。

强封装意味着没有人可以访问秘密的内部变量,因为你有一个适当的继承heirachy,所有这些东西都是隐藏的。

您的示例是非常弱的封装,因为变量a 是公共的。如果你的类是一个 API,而a 实际上是credit_card_details,那你就麻烦大了。

对于初学者,您可以将这些变量设置为私有并使用 getter 和 setter 来访问它们。

不过,总体而言,您需要一些抽象的东西来封装它。从 OOP 的角度来看,我听到的唯一另一件事就是封装,就是简单地将现实世界的对象捆绑到类中

【讨论】:

    【解决方案2】:

    面向对象是关于消息的。如果您只能要求在对象内部设置或获取值,那么这些值将被封装。访问它们的唯一方法是通过预定义的协议,即 setter 或 getter 或任何其他方法。 如果你有一个公共字段,看起来没有封装,但你仍然不拥有该变量,将其视为默认设置或获取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2010-12-10
      • 2019-03-09
      • 2018-12-19
      相关资源
      最近更新 更多