困惑:抽象和封装是一样的吗?

时间:2009-12-18 08:20:32

标签: java oop

  

可能重复:
  Abstraction VS Information Hiding VS Encapsulation

“抽象”和“封装”的定义似乎与我非常相似。我总是混淆这些条款。请通过展示示例来澄清差异。

5 个答案:

答案 0 :(得分:13)

this forum post中提供了简短但明确(我认为)的答案:

  

封装有两面;数据   抽象和信息隐藏。   数据抽象是从中看到的类型   外。信息隐藏是一种   从内部看到的类型。

     
      
  • 抽象侧重于对象的外部视图(即界面)
  •   
  • 封装(信息隐藏)可防止客户端看到它   内部视图,行为的地方   抽象实施
  •   

答案 1 :(得分:12)

抽象是关注对象的一些关键特征,故意忽略其他特征。例如,以下内容有什么共同之处:

Plane
Train
Automobile

对,他们都有轮子!我们的对象模型有一个方法。

getNumberOfWheels()

我们抽象我们关心此特定问题的常见功能。当然,你可能期望一些其他抽象专注于numberOfPassengers()或speed(),但我们的想法是我们正在一些特定问题领域工作,因此专注于某些特定的抽象。

在一个更现实的例子中,我们可能有Janitor,高级执行官,销售人员,经理等。我们的抽象主要关注他们的付款。所以我们有

 getSalary()

现在我们看到一些有趣的东西。对于看门人而言,工资由

计算
 hoursWorked * paymentPerHour

对于销售人员而言

 baseSalary + commision

但是当我们查看抽象getSalary()时,我们看不到这些细节,只能回答“工资是多少”的问题;我们有 Encapsulated 薪水计算。

抽象:确定从外部看到的相关基本功能

封装:隐藏有关如何实施这些功能的详细信息

答案 2 :(得分:2)

他们实际上是相关的。

抽象是指对象或概念的高级视图。例如, Car 是一种抽象,它提供高级视图而无需参考细节(例如门,方向盘,座椅等)。基类通常是抽象,它将常见属性分开。

封装更进一步,隐藏了抽象的实现细节。例如,您知道 Car 有一个门,方向盘,座位等,但您禁止知道这些元素的实现细节(这些细节)封装)。

答案 3 :(得分:0)

抽象这是一个定义扩展它的类的行为的类。仅此而已。

封装这是定义类的哪些方法和属性可访问的东西。

结论你做了错误的比较,他们完全不同。

然而,大多数人在界面和抽象类之间感到困惑,这似乎是一个很小的逻辑问题,但那又不是那么正确的问题。

答案 4 :(得分:0)

他们非常不同,实际上......

抽象:以简化/不同的方式呈现内容的想法,这种方式更易于理解和使用,或者与情况更相关。

考虑一个发送电子邮件的类......它使用抽象向你展示自己作为某种信使的男孩,所以你可以调用emailSender.send(邮件,收件人)。它实际上做了什么 - 选择POP3 / SMTP,调用服务器,MIME翻译等,被抽象掉了。你只看到你的使者男孩。

封装:保护和隐藏对象私有的数据和方法的想法。它更多地涉及使某些东西独立和万无一失。

以我为例。我把自己的心率从世界其他地方封装起来。因为我不希望任何其他人改变该变量,我不需要任何其他人来设置它以便我运行。它对我来说至关重要,但你不需要知道它是什么,你可能也不在乎。

环顾四周,你会发现你触摸的几乎所有内容都是抽象和封装的一个例子。例如,您的手机向您展示了能够接受您所说的话并向其他人说出的抽象 - 覆盖GSM,处理器架构,无线电频率以及您不理解或不关心的其他一百万件事。它还封装了您的某些数据,如序列号,ID号,频率等。

这一切都让世界变得更加美好:D