对于封装的一个例子,我可以想到用户和手机之间的交互。用户不需要知道手机的内部工作原理就可以进行操作,所以这叫做抽象。但是封装在这个例子中适合什么地方呢?有人可以对此有所了解吗?
18 回答
封装是实现“信息隐藏”的一种方式,所以按照你的例子,你不需要“知道手机内部的工作原理就可以操作”。您有一个接口来使用设备行为,而无需了解实现细节。
另一方面,抽象可以解释为对不同对象使用相同接口的能力。可以存在同一接口的不同实现。封装隐藏了细节。
抽象:你永远不会买“设备”,但总是买更具体的东西:iPhone、GSII、诺基亚 3310……这里,iPhone、GSII 和 N3310 是具体的东西,设备是抽象的。
封装:你有几个设备,它们都有一个 USB 端口。你不知道后面是什么样的印刷电路,你只需要知道你可以将 USB 电缆插入其中。
抽象是一个概念,它被封装所允许。我的例子不是最好的(两个块之间没有真正的联系)。
您可以在不使用抽象的情况下进行封装,但是如果您想在项目中使用一些抽象,则需要封装。
通俗地说,抽象就是把复杂的东西隐藏在一个特定的过程后面,使过程看起来简单。
示例:Monitor ON/OFF ::--用户不需要知道太多关于 Monitor 打开或 OFF 时发生的所有芯片功能..他只需要知道 On Function ON-Monitor is On and on功能OFF-显示器关闭...
或者更好地寻找汽车——每个人都知道有一个特殊的齿轮机器可以改变齿轮,没有人会费心知道齿轮改变的所有功能。所以,这就是抽象(避免不必要的实现以防止复杂性)。
因此,如果开发人员提供了良好的抽象,用户就不会想窥探对象的内部机制。
抽象是通过使具有一个或多个方法抽象的类抽象来实现的。这只是基本特征,应该由扩展它的类来实现。
e.g.
当您发明/设计汽车时,您定义了一个特征,例如汽车应该有 4 个门、刹车、方向盘等……所以任何使用这种设计的人都应该包含这个特征。实现不是每个抽象的头。它只会定义应该包含的特征。
封装是限制用户遵循特定程序来访问特定进程的访问控制。它只是提供安全性并确保系统健壮性。
示例:我们可以将公司中的 HR 视为按照封装原则工作的人,.i.e.
我们不能直接与其他部门交谈,我们需要通过 HR 进行沟通。这确保了公司记录的安全性和更好的维护。
我们可以一起举一个例子UNDER CONSTRUCTION BUILDING..
,我们可以说“不”之类的事情。管理人员所需的材料类型、工人数量等作为他们在每个建筑施工中需要的抽象。
但是,与此同时,将每个此类字段包含在充当工人和建筑投资者之间调解人的承包商中可以被视为封装。因为,它将上述所有属性隐藏到一个实体中。
因此,如果您到目前为止已经理解,您可以说抽象只是 ENCAPSULATION 的一个子集。即每个执行抽象的实体都在内部封装,但每一个显示封装的东西都不一定是抽象。
例如.ToString()
,几乎每个类中定义的方法都是实现的,Abstraction
因为我们没有内部的功能,我们只关心它将几乎所有内容都更改为字符串。并且当它作为一个单元组装时,它也被封装了..但是,私有成员我们隐藏和访问Properties
只是封装的一个例子,因为它基本上是在牢记数据安全性的情况下完成的......!!
希望这能回答你的问题..!!
封装就是把变量或者东西隐藏在一个类里面,防止未经授权的人使用。所以像getter和setter这样的公共方法可以访问它,其他类调用这些方法来访问
抽象涉及定义代表抽象“参与者”的对象的工具,这些参与者可以执行工作、报告和更改其状态,以及与系统中的其他对象“通信”。
考虑以下实时示例:
封装: 作为驾驶员,您知道如何通过按下启动按钮启动汽车,启动操作的内部细节对您隐藏。所以整个启动过程对你是隐藏的,否则我们可以看出启动操作是对你封装的。
或者
驱动轮封装了从你转动轮子的过程。
抽象:
在提到抽象之前,我们可以在这里取三个不同的用户(我称他们为实体)
1) 你 2) 本地机械师 3) 专家
You Entity:因为你只知道按下一个按钮来启动汽车,而幕后的所有其他操作都是从你身上抽象出来的。
Local Mechanic Entity:我们当地的机械师知道一些启动汽车的实现,即他可以打开汽车的引擎盖并检查电池电缆或塞子等。所以总之Local Mechanic Entity 知道汽车的一些实现。
专家实体:由于我们的专家(汽车设计师)机械师了解我们汽车的所有操作,因此他可以很快修复它。所以简而言之,专家实体知道汽车的所有实现。
汽车的操作完全从你那里抽象出来,部分实现给本地机械实体,完全实现给专家实体。所以你是一个只有抽象方法的抽象类,Local Mechanic Entity 扩展了 You(因为他也是一个普通用户),他实现了一些方法,最后是我们的专家实体扩展 Local Mechanic 并实现了所有方法。
我认为这是一个很好的 例子。
一切都有许多属性和行为,所以随便拿电视、手机、汽车、人类或任何东西。
抽象:
- 挑选你真正需要的对象本质的过程
- 换句话说,从对象示例中选择您需要的属性
:电视 - 声音、视觉效果、电源输入、频道输入。
湾。手机 - 按钮/触摸屏、电源按钮、音量按钮、SIM 端口。
C。汽车 - 转向、刹车、离合器、加速器、钥匙孔。
d。人类——声音、身体、视力、听力、情绪。
封装:
- 隐藏不需要的对象的详细信息的过程
- 换句话说,隐藏对象中不需要但对象正常工作所需的属性和操作示例:
a。电视 - 扬声器、显示器、配电 b/w 组件、通道机制的内部和连接。
湾。移动 - 如何解析和处理输入,如何按下按钮开/关或更改音量,sim 如何连接到服务提供商。
C。汽车 - 转向如何转动汽车,如何减速或停止汽车,离合器如何工作,加速器如何提高速度,钥匙孔如何打开/关闭汽车。
d。人类 - 声音是如何产生的,身体内部是什么,视力是如何工作的,听力是如何工作的,情绪是如何产生和影响我们的。
抽象你需要的一切,封装你不需要的一切;)
您问题的措辞很奇怪-抽象与封装?应该是 - 有人解释抽象和封装......
抽象是理解事物的本质。
一个现实世界的例子是抽象艺术。这种风格的艺术家试图捕捉/描绘仍然允许它成为事物的事物的本质。这种 4 行的棕色涂片抓住了公牛的本质。
封装是黑盒。
手机就是一个很好的例子。我不知道手机如何连接到卫星、塔或其他电话。我不知道这该死的东西是如何理解我的按键的,也不知道它是如何拍摄照片并将照片发送到电子邮件地址或另一个电话号码的。我不知道现代智能手机的大部分工作原理的复杂细节。但是,我可以使用它!这些电话具有标准界面(是的 - 文字和软件设计),允许了解手机基础知识的人使用几乎所有这些界面。
两者有什么关系?
抽象和封装都是面向对象思想和设计的基础。因此,在我们的手机示例中。智能手机的概念是一种抽象,其中封装了某些功能和服务。iPhone 和 Galaxy 是更高层次抽象的进一步抽象。您的物理 iPhone 或 Galaxy 是包含封装功能和服务的多层抽象的具体示例。
抽象 意味着我们专注于某件事的基本品质,而不是一个具体的例子,我们会自动丢弃不重要或不相关的东西。
示例 我们正在编写一个银行账户类,银行账户的基本特征是开户日期、账户名称、帐号、余额等...
封装 意味着封装或包围某些东西的想法,不仅是为了将内容保持在一起,而且还保护和限制表单访问外部。与保密性一起,它是关于减少应用程序不同部分之间的依赖关系。
示例 在我们的银行账户类中,有人访问了 Balance 的属性并试图改变它,如果没有封装,尝试可以成功。
封装就是隐藏信息。
抽象隐藏了功能细节。
封装是通过构造类来执行的。抽象是通过在类之上创建抽象类或接口来实现的。
在问题中给出的示例中,我们使用该类来实现其功能,我们并不关心设备如何实现这一点。所以我们可以说手机的细节是从我们这里“抽象”出来的。
封装隐藏了手机使用什么来实现它的功能;抽象隐藏了它是如何做到的。-
封装有助于遵守单一职责原则,抽象有助于遵守代码到接口而不是实现。
假设我有一个汽车类:服务提供者类和司机类:服务消费者类。
对于抽象:我们为 CAR 定义了抽象类,并在其中定义了所有的抽象方法,这些抽象方法是汽车中可用的函数,例如:changeGear()、applyBrake()。
现在实际的 Car (Concrete Class 即像 Mercedes 一样,BMW 将以自己的方式实现这些方法并抽象执行,最终用户仍将为特定的具体汽车实例应用中断和换档,并且多态地执行将按照具体类中的定义发生.
对于封装:现在说梅赛德斯提出了新功能/技术:防滑制动,在实现 applyBrake() 时,它将将此功能封装在 applyBrake() 方法中,从而提供内聚力,服务消费者仍将通过相同的方法访问 applyBrake () 的汽车对象。因此,封装可以进一步实现相同的具体类实现。
我觉得当你看到编程中的如何不做时,讨论封装可能更有意义。例如,考虑如下的 Car 类。
class Car{
public float speed =0;
public boolean isReverse = false;
public boolean isStarted = false;
}
客户端代码可以使用上面的汽车类,如下所示。
class Main{
public static void main(args String[]){
Car car = new Car();
// No need to start??
car.speed = 100; // Turbo mode directly to 100
car.speed = 0; // Turbo break
}
}
查看更多信息:http: //brevitaz.com/encapsulation-example-benefits-java/
这是对汽车速度和其他变量的不受控制的访问。通过封装,Car 类可以完全控制 car 类中的数据变量如何被修改。
任何具有某种行为的具体实体都是封装的示例。行为是通过包裹某些东西并向客户端隐藏某些东西来提供的。在移动设备的情况下,它是信号、芯片、电路、电池等。
对于同一示例的抽象 - 普通用户可能会说我可以使用任何可以拨打和接听电话的东西。这种抽象可以被任何具体的移动设备代替。查看抽象示例。
让我给出一个与 IT 接近的现实世界示例类比的 2 美分。
假设您有一个订阅网站,例如 wordpress 网站
每个用户都有一个角色,例如管理员、订阅者等。许多用户可以是管理员、订阅者等。
所以这里的抽象体现在任何具有管理员角色的用户都可以做一组事情,这与具体的用户无关(这是抽象的一个例子)。
另一方面,订阅者用户无权访问网站的某些设置,因此应用程序的某些内部被封装为普通订阅者(这是封装的一个示例)
正如人们所看到的,抽象和封装是相对概念,它们适用于特定的事物。
可以按照这一推理路线解释多态性和继承性。
例如,超级管理员用户可以做管理员用户可以做的所有事情,还有更多。此外,如果管理员角色获得功能更新,超级管理员将获得相同的更新。因此可以在这里看到一个继承的例子,超级管理员角色继承了管理员角色的所有属性并对其进行了扩展。请注意,对于网站的大部分内容,管理员可以与超级管理员互换(这意味着超级管理员用户可以轻松地代替管理员用户,但反之亦然)。
将内部细节隐藏到外部世界的抽象,例如您创建一个类(如类中的计算器之一)但最终使用您提供类的对象,在对象的帮助下他们将播放和执行操作,他不知道什么内部使用的机制类型。抽象形式的类对象。
封装是使类中的字段成为私有并通过公共方法提供对字段的访问的技术。如果一个字段被声明为私有,则类外的任何人都无法访问它,从而隐藏了类内的字段。因此,封装也称为数据隐藏。例如包含私有方法 getAdd,getMultiply 的类计算器。
Mybe上面的答案将帮助您理解这个概念。
如果您看过重要的电视机,电视机的连接线和电视机的彩管都隐藏在电视机壳内,像我们这样的观众没有暴露在外,只暴露了电视机的必要部件,如电视频道键、电视音量键、ON/OFF 开关、有线电视开关和电视遥控器供观众使用。这意味着电视机器、电视连接和电视彩色管是不需要的数据,观众不需要看到它们对外界隐藏
所以封装意味着隐藏类的重要特性,这些特性不需要暴露在类之外,只暴露类的必要内容。这里类的隐藏部分的行为类似于封装,而类的暴露部分的行为类似于抽象。
只需将抽象视为隐藏键盘和显示屏细节, 将封装视为隐藏绑定它们的内部电路。
我想蛋壳可以考虑封装和抽象的内容。外壳保护信息。没有壳你就不能拥有鸡蛋的内容。,,哈哈
抽象
它用于管理 OOP 的复杂性。通过使用此属性,我们可以向用户提供对象的基本特征,而不包括其背景说明。例如,当向朋友发送消息时,我们只需编写消息,说“hiiii”并按“发送”,消息就会被传递到其目的地(她,朋友)。在这里,我们看到了抽象的工作,即我们不太关心负责发送和接收消息的移动设备的内部工作
让我借助您给出的有关手机的示例来解释抽象和封装。
抽象
手机内部的工作对用户是隐藏的。用户通过屏幕/按钮与手机进行交互。这相当于通过对象与类进行交互。这里的类是移动设备,对象是屏幕/按钮。
封装
在手机中,我们可以看到电池、CPU、RAM、摄像头等一起被包含在一个盒子/容器内。这类似于类如何封装其所有方法和变量。方法和变量包含在类中。
另外,你不能访问手机的内部组件吧?为此,您需要特殊的螺丝刀。手机内部的组件是安全的。同样,我们可以保护类中的组件或变量。我们使用私有访问修饰符保护它。私有访问修饰符是手机的容器。我们可以在 setter 和 getter 的帮助下访问私有字段。这些 getter 和 setter 就像特殊的螺丝刀。
抽象
我们在日常生活中使用了许多抽象概念。考虑一辆汽车。我们大多数人对汽车的工作原理都有一个抽象的看法。我们知道如何与它交互以让它做我们想做的事情:我们加油,转动钥匙,踩一些踏板,等等。但我们不一定了解汽车内部发生了什么以使其移动,我们也不需要。数以百万计的人每天使用汽车,却不了解汽车的工作细节。抽象帮助我们上学或上班!
程序可以设计为一组交互抽象。在 Java 中,这些抽象被捕获在类中。类的创建者显然必须知道它的接口,就像汽车司机可以在不知道引擎如何工作的情况下使用车辆一样。
封装
考虑一个银行系统。银行系统具有帐号、帐户类型、余额等属性。如果有人试图更改账户余额,如果没有封装,尝试可以成功。因此封装允许类完全控制它们的属性。