封装与抽象?
以下是封装和抽象的简要定义。
抽象:
Java中的抽象过程用于隐藏某些细节,仅显示对象的基本特征。 换句话说,它处理对象(接口)的外部视图。 我在不同网站上看到的唯一好例子就是界面。
封装:
它的基本原理是隐藏对象的状态,如私人,公共,受保护等修饰符的帮助下,我们只有在需要时才通过公共方法公开方法。
我们用private
, public
等修饰符实现的功能也会从外部世界隐藏不必要的细节,这只不过是一种抽象概念
所以,从上面的解释看,封装是抽象的一部分,或者我们可以说它是抽象的一个子集。 但是,为什么封装术语只能在抽象化的时候才被发明出来? 我相信应该有一些重大的区别,它们可以区分它们,但网上的大多数资料都说他们两个都差不多。
虽然这个论坛早些时候也提到过这个问题,但是我再次发表了具体的疑问。 有些答复还说抽象是一个概念,封装就是实现。 但我不买这个 - 如果这是真的,那么我可以认为这两个不同的概念提供给我们混淆。
更新: - 5年后,我想出了自己的答案,这是基于这篇文章和下面的答案的要点
封装是一种用作抽象的一部分的策略。 封装是指对象的状态 - 对象封装它们的状态并将它从外部隐藏; 类的外部用户通过它的方法与它进行交互,但不能直接访问类的状态。 所以这个类抽象出与其状态相关的实现细节。
抽象是一个更通用的术语,它也可以通过(其他)子类来实现。 例如,标准库中的接口List
是一系列项目的抽象,它们的位置是索引的, List
具体示例是ArrayList
或LinkedList
。 与List
交互的代码抽象了它正在使用的列表的详细类型。
如果没有通过封装来隐藏基础状态,抽象往往是不可能的 - 如果一个类暴露了它的内部状态,它就不能改变它的内部工作,因此不能被抽象化。
抽象是用更简单的术语来描述某个东西的概念,即抽象出细节,以便专注于重要的东西(这也可以在抽象艺术中看到,例如,艺术家专注于图像的构建块,例如颜色或形状)。 同样的想法通过使用继承层次转化为面向对象,其中更抽象的概念位于顶部,更具体的想法在底部,基于抽象概念。 在最抽象的层面上,根本没有实现细节,也许只有很少的共同点,随着抽象的减少而增加。
作为一个例子,顶部可能是一个单一方法的接口,然后下一个级别提供了几个抽象类,它们可能会或可能不会填充关于顶层的一些细节,但通过添加他们自己的抽象方法,那么这些抽象类中的每一个都是提供所有其余方法实现的具体类。
封装是一种技术。 它可能会或可能不会用于抽象,但肯定是关于信息隐藏和/或组织。 它要求以某种方式对数据和功能进行分组 - 当然,良好的面向对象实践要求它们应该通过抽象进行分组。 但是,还有其他用途只是帮助维护性等。
封装是抽象的一部分,或者我们可以说它是抽象的一个子集
他们是不同的概念。
抽象是细化对象的所有不必要/不重要的属性并仅保留最适合您的域的特征的过程。
例如,对于一个人:你决定保留姓名和SSN。 年龄,身高,体重等被忽略为无关紧要。
抽象是你的设计开始的地方。
即数据和方法捆绑在一起。