首页 \ 问答 \ Java中实现封装与信息隐藏与抽象与隐藏数据的比较(Practical example Encapsulation vs Information Hiding vs Abstraction vs Data Hiding in Java)

Java中实现封装与信息隐藏与抽象与隐藏数据的比较(Practical example Encapsulation vs Information Hiding vs Abstraction vs Data Hiding in Java)

我知道有很多关于这个问题的帖子,这些帖子在实时示例中有理论上的解释。这些OOP条款非常简单,但对于像我这样的初学者来说更容易混淆。 但我期待这里不是一个定义和实时示例,但期望在java中的代码片段

任何人都可以给予Java中每一个非常小的代码片段 ,这将帮助我理解封装vs信息隐藏vs抽象vs数据实际隐藏吗?


I know there are lots of post regarding this question which has theoretical explanation with real time examples.These OOPs terms are very simple but more confusing for beginners like me. But I am expecting here not a definition and real time example BUT expecting code snippet in java.

Will anyone please give very small code snippet for each one in Java that will help me a lot to understand Encapsulation vs Information Hiding vs Abstraction vs Data Hiding practically?

更新时间:2023-02-03 17:02

最满意答案

封装=信息隐藏=数据隐藏。 为了执行某项任务而不需要被他人知道的信息。

class Girl {
  private int age;
  Girl(int age) {
    this.age = age;
  }
  public boolean willGoOutWithGuy(boolean isGuyUgly) {
    return (age >= 22) && (!isGuyUgly);
  }
}

class Guy {
  private Girl girl = new Girl();
  private boolean isUgly = true;
  public boolean willGirlGoOutWithMe() {
    return girl.willGoOutWithGuy(isUgly);
  }
  // Guy doesn't have access to Girl's age. but he can ask her out. 
}

抽象=同一接口的不同实现。

public interface Car {
  public void start();
  public void stop();
}

class HotRod implements Car {
  // implement methods
}

class BattleTank implements Car {
  // implement methods
}

class GoCart implements Car {
  // implement methods
}

这些实现都是唯一的,但可以在Car类型下绑定。


Encapsulation = information hiding = data hiding. Information that doesn't need to be known to others in order to perform some task.

class Girl {
  private int age;
  Girl(int age) {
    this.age = age;
  }
  public boolean willGoOutWithGuy(boolean isGuyUgly) {
    return (age >= 22) && (!isGuyUgly);
  }
}

class Guy {
  private Girl girl = new Girl();
  private boolean isUgly = true;
  public boolean willGirlGoOutWithMe() {
    return girl.willGoOutWithGuy(isUgly);
  }
  // Guy doesn't have access to Girl's age. but he can ask her out. 
}

Abstraction = different implementations of the same interface.

public interface Car {
  public void start();
  public void stop();
}

class HotRod implements Car {
  // implement methods
}

class BattleTank implements Car {
  // implement methods
}

class GoCart implements Car {
  // implement methods
}

The implementations are all unique, but can be bound under the Car type.

相关问答

更多
  • 信息隐藏是设计师特意决定限制对实施细节的访问。 这是一个比面向对象设计早的原则,但经常使用。 一个简单的例子是在C中定义常量,例如#define NAME_SIZE 15常量的代码(客户端)不需要知道它的值,如果您(设计者)决定稍后更改其值。 他们不应该假设它真的是15,因为你可能决定改变它。 抽象是当你处理一个聚合时,例如,汽车是一个抽象的细节,如底盘,汽车,车轮等。抽象允许我们以一种更简单的方式来思考复杂的事情。 封装是我们如何确定构成我们抽象的元素的详细程度。 良好的封装应用信息隐藏,以强化细节的限制 ...
  • 数据隐藏是一种控制应用程序的一部分中的代码对应用程序的另一部分中的代码的 依赖性的方式。 也就是说,当一位代码发生变化时,一个或多个其他代码位是否也需要更新呢? 尽可能地,你希望答案是“不”,因为否则你对程序所做的每一点改变都会在程序进入稳定状态之前启动随之而来的大量变化,然后它将再次正常运行。 为了阻止程序员任意依赖于类的实现的任何方面,并鼓励他们只依赖于类的对象为客户端执行其预期功能所需的可控部分,您可以指定数据和/或允许客户端使用的功能:即“公共”和/或“受保护”接口。 您希望能够在没有客户端代码需要 ...
  • 封装是一种用作抽象的一部分的策略。 封装是指对象的状态 - 对象封装其状态并将其从外部隐藏; 类的外部用户通过其方法与它进行交互,但是不能直接访问类状态。 所以这个类抽象出与它的状态有关的实现细节。 抽象是一个更通用的术语,它也可以通过(其他)子类化来实现。 例如,标准库中的接口List是一系列项目的抽象,由它们的位置索引, List具体示例是ArrayList或LinkedList 。 与List进行交互的代码摘录了它正在使用的列表的详细信息。 抽象通常是不可能的,而不是通过封装来隐藏底层状态 - 如果一 ...
  • 去源头! Grady Booch说(面向对象分析与设计,第49页,第二版): 抽象和封装是互补的概念:抽象侧重于对象的可观察行为...封装着重于产生这种行为的实现...封装通常通过信息隐藏来实现,这是隐藏所有不符合其本质特征的物体秘密。 换句话说:抽象=外部对象; 封装(通过信息隐藏实现)=内部对象, 示例:在.NET Framework中, System.Text.StringBuilder类提供了一个字符串缓冲区的抽象。 这种缓冲区抽象可以让您使用缓冲区,而不考虑其实现。 因此,您可以将字符串附加到缓冲 ...
  • 这两个概念在某种程度上服务于同一目标,甚至Abstraction is more about the design, and encapsulation is more about the implementation (在讨论抽象时没有字段和数据)。 这个共同的目标是为用户提供一个简单且定义良好的界面,因此他不需要为细节而烦恼,而只需关心它的作用以及它如何与之连接。 例如,如果你看一下开/关开关,抽象将定义它的两个条件,以及它们之间切换的方式,封装将选择隐藏开关内的电线和东西,并让你看到熟悉的开关我们都知 ...
  • 重点是它并不重要。 任何人都可以用一种稍微不同的方式来定义一个术语,并且通常各种作者都会根据他们使用这些术语的各种环境来调整意义。 试图找出哪一个是“正确的”,哪一个是“错误的”,你不会得到启发。 从上下文中引用的行情特别没有意义。 重要的是要理解底层的想法,而不用参考用来引用它们的词汇表。 The main point is that it doesn't really matter. Anyone can define a term in a slightly different way, and us ...
  • 首先,不要过于雄心勃勃,正如你所说的这3个概念是相关的(特别是前两个),并且可以在许多情况下相互使用。 正确使用它们比完整的最终定义更重要。 “ 数据隐藏 ”就是在客户端和实现(部分)之间建立一个隔离墙。 模块的某些对象可以是模块的内部对象,对用户不可见。 因此,这是一种避免依赖的方法。 如果我不知道如何实现一件事,它的实现可能会改变。 “ 数据抽象 ”是在同一抽象下重新组合不同类型的数据。 它接近于协议的想法。 您不知道对象是如何实现的,但您知道它遵循一个众所周知的协议,即一组适用于不同类型数据的方法。 ...
  • 封装=信息隐藏=数据隐藏。 为了执行某项任务而不需要被他人知道的信息。 class Girl { private int age; Girl(int age) { this.age = age; } public boolean willGoOutWithGuy(boolean isGuyUgly) { return (age >= 22) && (!isGuyUgly); } } class Guy { private Girl girl = new Girl() ...
  • 请查看: https : //docs.oracle.com/javase/tutorial/java/javaOO/nested.html 。 它说它通过允许static类访问顶级类的私有成员来增加封装(有时你可能需要这样做)。 并且a是A类A私有成员,它属于BreakOOP的范围,后者又可以在B类中访问它。 Check this: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html. It says it increases e ...
  • 在您的示例中,您创建一个Dog ,然后将其用作动物。 在这种情况下,抽象不是很有用,因为你知道变量a总是指一只狗。 现在让我们说在其他一些类中你有一个方法soundTwice : class OutsideWorld { static void soundTwice(Animal a) { a.sound(); a.sound(); } } 在这里你不知道Animal a指哪种Animal ,但你仍然可以发出两次声音。 UPDATE 我正在添加这个类,因为类 ...

相关文章

更多

最新问答

更多
  • 在csproj中使用appdata环境变量(Use appdata environment variable in csproj)
  • 从背景返回后,Skobbler Map崩溃(Skobbler Map crashes after returning from background)
  • 如何保持对绑定服务的轮询?(How to keep polling a bound service?)
  • ASP.NET单选按钮jQuery处理(ASP.NET radio button jQuery handling)
  • Linux上的FORTRAN图形库(FORTRAN graphic library on Linux)
  • 我们如何根据索引更新dynamodb表(不基于primary has和range key)(how can we update dynamodb table based on index(not based on primary has and range key))
  • 功能包装避免重复(wrap of functions avoid duplicating)
  • Android BroadcastReceiver和Activity.onPause()(Android BroadcastReceiver and Activity.onPause())
  • 无法使用phonegap 2.4在Android上播放录音(unable to play audio recordings on android using phonegap 2.4)
  • VS2015 + Resharper:不要使用C#6(VS2015 + Resharper: Don't use C#6)
  • 大学电脑四级对初学者来说要多久能过
  • 特殊字符删除?(Special characters remove?)
  • Android视频教程现在网上的都比较零散呢?有些太坑爹了,感觉老师就是在想当然的讲
  • 计算同一个表中不同行之间的差异[重复](Calculate delta's between different rows in same table [duplicate])
  • Javaweb开发,技术路线是什么?该怎么写?
  • JavaScript只在php代码中执行一次(JavaScript only executes once inside php code)
  • 不兼容的字符编码:ASCII-8BIT和UTF-8(incompatible character encodings: ASCII-8BIT and UTF-8)
  • Clojure(加载文件)给出错误(Clojure (load-file) gives an error)
  • 为具有瞬态scala依赖性的spring-xd项目优化gradle(Optimize gradle for spring-xd project with transient scala dependency)
  • 如何才能在Alpha测试模式下发布我的应用程序?(How can I publish my app in Alpha test mode only?)
  • “没有为此目标安装系统映像”Xamarin AVD Manager(“No system images installed for this target” Xamarin AVD Manager)
  • maven中的Scalatest:JUnit结果(Scalatest in maven: JUnit results)
  • 使用android SDK将文件直接上传到存储桶中的文件夹(Upload a file directly to a folder in bucket using android SDK)
  • 是否应将plists导入CoreData?(Should plists be imported to CoreData?)
  • java.lang.reflect.InvocationTargetException JavaFX TableView(java.lang.reflect.InvocationTargetException JavaFX TableView)
  • 根据唯一列值动态创建多个子集(Dynamically create multiple subsets based on unique column values)
  • 使用CSS可以使HTML锚标签不可点击/可链接吗?(Is it possible to make an HTML anchor tag not clickable/linkable using CSS?)
  • 嵌套的模板可能性(Nested template possibilities)
  • 任何方式在iOS7 +上以编程方式打开蓝牙(Any way to turn on bluetooth programmatically on iOS7+)
  • 如何为给定的SQL查询编写JPA查询(How I can write JPA query for given SQL query)