隐藏实现细节Encapsulation或Abstraction?

cru*_*fux 3 java oop c++11

有些人将抽象定义为:

抽象通过在基本功能上提供一个层来隐藏实现细节.

它不是封装的一部分来隐藏对象用户的实现细节吗?

让我们说Animal类有函数eat(),那么为对象的用户提供这个接口是封装还是抽象?或提供使用的函数名称是抽象,方法实现部分的隐藏是封装.

我很困惑,因为在许多地方它是抽象的,很多人说实现细节隐藏是封装?

在这个SO问题的最佳答案:

抽象=对象外部; 封装(通过信息隐藏实现)=内部对象.

那么这意味着对象接口暴露是抽象而隐藏在对象内部的数据是封装吗?

dev*_*per 5

隐藏实现细节Encapsulation或Abstraction?

抽象就是提供一个带有接口和抽象类的附加层.这个层(接口和抽象类)告诉我们需要做什么,而不是如何做.因此隐藏实现称为抽象.

理解抽象概念的最好例子是所有J2EE/JMS规范都为interfaces应用程序供应商提供了抽象(通常),然后这些接口将由不同的供应商实现(如Tomcat/JBoss/Weblogic/IBM/etc ......).与规范的实际定义/行为(称为实现).

抽象只讨论需要做什么,实现讲述了应该如何完成.

抽象提供了在运行时注入行为的能力(这是多态性).现在,以Spring框架(或实际任何DI框架,如Guice等)为例,Spring DI容器在运行时将提供的bean(通过xml或annotations)实现对象 (实现) 注入给定的接口类型(抽象) ).

那么这意味着对象接口暴露是抽象而隐藏在对象内部的数据是封装吗?

是的,几乎在Java抽象中可以使用interfaces或有时使用Abstract classes(如J2EE HttpServlet等)来实现.

现在进入Encapsulation,它是关于为类/方法/字段提供/定义正确的访问级别(隐藏/保护类和类成员).在Java中,可以使用访问修饰符(protected/ private/ public/ etc ..)实现封装.

您可以在此处查看有关Java中抽象的更多信息,以及此处用于覆盖(实现)和隐藏方法.