以下是封装和抽象的简要定义.
抽象:
Java中的抽象过程用于隐藏某些细节,仅显示对象的基本特征.换句话说,它处理对象(界面)的外部视图.我在不同站点看到的唯一好例子是界面.
封装:
它基本上是在私有,公共,受保护等修饰符的帮助下隐藏对象的状态.我们只在需要时通过公共方法暴露状态.
我们用修饰符所实现的private,public也隐藏了来自外部世界的不必要的细节,这也是一个抽象概念
因此,从上面的解释来看,封装是抽象的一部分,或者我们可以说它是抽象的一个子集.但是,为什么封装术语是在我们只能用抽象来处理的时候发明的呢?我确信应该有一些区别于它们的主要区别,但网上的大多数材料对两者都说几乎相同.
虽然这个问题早已在这个论坛上提出过,但我再次发布它并带有特别的怀疑.一些回复还说抽象是一个概念,封装是实现.但我不买这个 - 如果是真的,那么我可以认为提供这两个不同的概念来迷惑我们.
更新: - 5年后我得出了自己的答案,这是基于这篇文章及以下答案的要点
可能重复:
抽象VS信息隐藏VS封装
我知道这个问题可能已经在这个论坛上被问了几千次,甚至net也充满了关于这些概念的许多定义,但所有声音都相同,并且都使用相同的技术词汇.例如以下定义
封装是将数据和对数据进行操作的代码绑定或包装到单个实体中的过程.这样可以保护数据免受外部接口和误操作的影响.考虑封装的一种方法是作为保护包装器,防止代码和数据被包装器外部定义的其他代码任意访问.
我从上面的定义中理解的是创建变量,将它们标记为私有并为这些变量生成getter-setter,并使用object来访问那些getter和setter.这样,数据就隐藏在对象内部,只能通过对象访问.希望我是对的.
抽象是Java中的过程,用于隐藏某些细节并仅显示对象的基本特征.换句话说,它处理对象(界面)的外部视图.
现在这是让我困惑的部分.每当我想到抽象时,我想到的东西就是抽象类(可能因为它们都有Abstract关键字).上面的定义说抽象意味着隐藏数据并且只显示所需的细节,但这是我们在封装中已经做的事情吗?然后有什么区别.此外,我没有得到对象的侧视图,它处理对象的外部视图.
有人可以用一些现实生活中的例子,或者如果可能的话,用一些程序化的例子来说明这一点.
我正在准备面试,并决定刷新我的OOP概念.有数百篇文章可供使用,但似乎每篇文章都有不同的描述. 有人说
抽象是"识别具有系统变化的共同模式的过程;抽象代表了常见模式,并提供了指定使用哪种变体的方法"(Richard Gabriel).
并通过抽象类实现.
一些其他的说
抽象意味着仅向对象的客户端显示必要的细节
和
假设您的Employee类中有一个方法"CalculateSalary",它将EmployeeId作为参数,并将当前月份的员工薪水作为整数值返回.现在,如果有人想要使用该方法.他不需要关心Employee对象如何计算薪水?他唯一需要关注的是方法的名称,输入参数和结果成员的格式,
我一遍又一遍地搜索,结果似乎没有给我一个正确的答案. 现在,封装在哪里适合所有这些? 我搜索并发现了堆栈溢出问题.即使答案到问题被混淆 在这里,它说
封装是一种用作抽象的一部分的策略.封装是指对象的状态 - 对象封装其状态并将其隐藏在外部; 类的外部用户通过其方法与之交互,但无法直接访问类状态.因此,该类抽象出与其状态相关的实现细节.
而这里的另一个知名的成员说,
它们是不同的概念.
抽象是精炼对象的所有不需要/不重要的属性并且仅保留最适合您的域的特征的过程.
现在我搞砸了整个概念.我知道抽象类,继承,访问说明符和所有.我只是想知道在面试中被问及抽象和/或封装时我该如何回答.
请不要将其标记为重复.我知道有几个类似的问题.但我想避免相互矛盾的解释之间的混淆.任何人都可以提出可靠的链接吗?除非再次造成混淆,否则也欢迎链接到stackoverflow问题.:)
编辑:我需要答案,有点c#导向
学习OOP概念特别有兴趣深入了解抽象和封装.
已经查看了下面的内容
我发现用一个真实而简单的示例类/代码片段很难理解这些概念.
我的一位同事说抽象只不过是创建抽象类和普通类来保护其成员变量的范围称为封装.
是否有一种简单的方法可以理解并帮助其他人了解它们究竟是什么,而不是重复下面的内容?
抽象和封装是互补的概念:抽象侧重于对象的可观察行为......封装侧重于产生这种行为的实现......封装通常是通过信息隐藏来实现的,这是隐藏所有内容的过程.对象的秘密不会对其基本特征产生影响.
我今天接受了采访.我有一个来自OOP的问题,关于Encapsulation&Abstraction之间的区别?
我回答她的知识,Encapsulation基本上是将数据成员和成员函数绑定到一个名为Class的单元中.而抽象基本上是为了隐藏实现的复杂性并提供对用户的轻松访问.我觉得她的回答会很好.但她问道,如果两者的目的都是隐藏信息,那么这两者之间的实际区别是什么?我不能给她任何答案.
在提出这个问题之前,我在StackOverFlow上阅读了关于这两个OOP概念之间差异的其他线程.但我并没有发现自己有能力说服采访者.
任何人都可以用最简单的例子来证明它的合理性吗?
在采访中,我被要求解释抽象和封装之间的区别.我的答案一直是这样的
抽象使我们能够以最简单的方式表现复杂的现实世界.它是识别对象应具备的相关品质和行为的过程; 换句话说,表示必要的特征而不表示背景细节.
封装是将对象的所有内部细节隐藏在外部现实世界中的过程."封装"一词,就像"封闭"成"胶囊".它限制客户端看到其实现抽象行为的内部视图.
我认为通过上面的回答,面试官确信,但后来我被问到,如果两者的目的都隐藏了,那么为什么需要使用封装.那时候我没有一个好的答案.
我应该添加什么来使我的答案更完整?
我有两个封装定义,不能适合一个定义.
这两个定义如何讨论相同的概念?
我参加了一个java程序员的面试,在几个人的问题之后,面试官问我"什么是封装和抽象"这个问题我对问题非常满意,并且我已经回答它隐藏了不必要的实现细节供用户知道.而Abstraction只向用户展示了重要的细节.在我回答后几秒钟,面试官对我提出了另一个问题.向用户显示重要细节,这意味着将不相关的数据(如实现细节)隐藏到用户.是吗?
我回答是的!
还有另外一个问题.那么抽象和封装之间有什么区别.我认为根据你的答案没有区别.
我就像我不知道,我的双手被冷冻,对我来说是一个非常糟糕的一天
如果有人向你提出这样的问题,任何人都可以解释你会如何回答