面向对象编程中的封装是什么?

4

我是一名新手,对面向对象编程(OOP)的封装(encapsulation)有些疑问。

  1. "partial"和"weak"封装有什么区别?请给出Java中的例子。

  2. 封装是否只意味着将数据放在类似于类的胶囊中,或者必须有访问修饰符(access modifier)?

我读到过封装的定义是隐藏和组合数据。

在这个例子中:

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

以上代码是否是封装的示例?如果是,则外部世界没有任何隐藏,因为afoo是公共的。在这个示例中,afoo必须被声明为private才能被认为是封装吗?


6
请不要直接点踩,而是在点踩前请先帮助我或留下评论。 - ReflectionHack
以上代码并不是封装的例子,因为'a'在外部是可见的,它没有被隐藏起来。将其设置为私有的,使用公共的getter和setter方法,这样就可以实现封装了。 - TheLostMind
好的。意思是Bean类是封装的定义,因为Bean类的定义类似于这样。 - ReflectionHack
请返回已翻译的文本:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)https://dev59.com/qGox5IYBdhLWcg3wzXal - TheLostMind
在现实世界中,你使用你的大脑。但是,仍然不知道大脑如何运作......这就是封装。 - Shashi
相关:https://dev59.com/qGox5IYBdhLWcg3wzXal - Ray Tayek
2个回答

0

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

基本上,如果你正在实现一个Java库或API,你会朝着强封装的方向努力,这样用户就无法访问他们不应该访问的东西。

强封装意味着没有人可以访问秘密内部变量,因为你有一个正确的继承层次结构并且所有那些东西都被隐藏了。

你的例子是非常薄弱的封装,因为变量a是公共的。如果你的类是一个API,而a实际上是credit_card_details,那么你将会遇到大麻烦。

首先,你需要将那些变量设置为私有,并使用getter和setter来访问它们。

总体而言,你需要将某些东西抽象化以便于封装。从面向对象编程的角度来看,我所听说的唯一与封装有关的另一件事情就是将真实世界的对象打包进类中。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接