概念之间的区别

我曾经参加过一个面向java程序员的面试,面试官在问了一些个人问题之后问了什么是封装和抽象问题,我对这个问题感到非常满意,我已经回答了这个问题,因为它隐藏了不必要的实现细节供用户认识。 抽象仅向用户展示了重要的细节。 在我回答几秒钟之后,面试官对我又有了一个问题。 仅向用户显示重要的细节,即向用户隐藏实施细节等不相关的数据。 是吗?

我已经回答是肯定的!

还有另外一个问题。那么抽象和封装有什么区别。我认为根据你的回答没有区别。

我就像我不知道,我的手被冻结,对我来说是一个非常糟糕的一天

任何人都可以解释,如果有人向你提出这样的问题,你将如何回答

Solutions Collecting From Web of "概念之间的区别"

通俗地说,封装就是覆盖(封装)。

对于Java而言,这意味着将代码编写在一起,只显示那些意图被暴露的部分。但是它通常与数据隐藏有关。 例如,当你定义你的实例方法/函数私有它只能从同一个类访问。 这样你就不会直接暴露你的实例variables/函数。 为什么? 因为用户与它无关。

通俗地讲,抽象概念是为了隐藏背后的复杂性而build立起来的。 以电脑为例。 它们是对处理器的一个抽象,它涉及到涉及到门的芯片的实际计算。 对于普通人来说,用所用的门来说就很难说。 所以这个概念已经被抽象出来了。

关于Java抽象意味着隐藏用户的实现细节。 这包括做一个类抽象或定义一个接口。 所有用户都暴露的是接口(一组函数或API)。 他不需要知道这是内部实现。 他必须知道他必须提供什么input(参数),什么是相应的输出(返回types)。

为了更好地理解Java示例,请参考此问题。

什么是封装?

封装不过是保护任何易于改变的东西。 在封装之后的理性是,如果任何被完全封装在代码中的function,即仅在一个地方维护而不散布在代码中,则很容易改变。 这可以用一个简单的Java封装例子来解释。 我们都知道构造函数是用来在Java中创build对象的,构造函数可以接受参数。 假设我们有一个类贷款有一个构造函数,而且在各个类中你已经使用这个构造函数创build了贷款的实例。 现在需求变化,你需要包括借款人的年龄,同时还贷款。 由于这个代码没有很好的封装,也就是说不会被局限在一个地方,所以你需要在任何地方改变你正在调用这个构造函数,例如,对于一个改变,你需要修改多个文件,而不是只是一个文件,这个文件更容易出错,用高级IDE的重构function来完成,如果你只需要在一个地方进行更改,这样做会不会更好? 是的,如果我们用一种方法封装贷款创build逻辑,那么createLoan()和客户端代码调用这个方法,并且这个方法内部创build贷款对象。 在这种情况下,你只需要修改这个方法而不是所有的客户端代码。

class Loan{ private int duration; //private variables examples of encapsulation private String loan; private String borrower; private String salary; //public constructor can break encapsulation instead use factory method private Loan(int duration, String loan, String borrower, String salary){ this.duration = duration; this.loan = loan; this.borrower = borrower; this.salary = salary; } //no argument consustructor omitted here // create loan can encapsulate loan creation logic public Loan createLoan(String loanType){ //processing based on loan type and than returning loan object return loan; } } 

在这个Java封装的例子中,你看到所有的成员variables都是私有的,所以它们被很好的封装起来,你只能直接在这个类中改变或访问这个variables。 如果你想允许外部世界访问这些variables,最好创build一个getter和setter,例如getLoan(),它允许你在返还贷款之前做任何validation,安全检查,这样就可以完全控制你想要做的事情,受控和pipe理客户端的单一访问渠道。

什么是抽象?

抽象类是不完整的,你不能创build抽象类的实例。 如果你想使用它,你需要通过扩展它来完成或具体化。 如果一个类不包含任何抽象方法,并且实现了从已经实现或扩展的抽象类或接口inheritance的所有抽象方法,则该类称为具体。 顺便提一下,Java有抽象类的概念,抽象方法但variables不能在Java中抽象。 Java中stream行的抽象类的例子是ActionListener,它具有称为actionPerformed(ActionEvent ae)的抽象方法。 当一个ActionEvent被触发,就像在你点击JButton时调用这个方法。 它通常在java中通过使用匿名类实现抽象方法actionPerformed(ActionEvent ae)来将ActionListener与JButton附加在一起,如下所示:

 JButton ok = new JButton("OK"); ok.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ //code to handle event } }); 

Java接口是提供抽象的另一种方式,接口默认是抽象的,只包含公共静态,最终常量或抽象方法。 它非常常见的面试问题是,我们应该在哪里使用抽象类,在我看来,我们应该在哪里使用Java接口,这对于devise更好的Java应用程序是很重要的,如果您只知道您的类的方法名称应该有例如服务器它应该有start()和stop()方法,但我们不知道这些启动和停止方法将如何工作。 如果在devise类时知道一些行为,并且在所有子类中保持共同,则将其添加到抽象类中。 像Runnable这样的接口是Java中抽象的很好的例子,用来抽象multithreading执行的任务。

抽象是做一个基类“抽象”,然后扩展其function的做法。 一个抽象的类是不存在于具体事物中的东西; 它的唯一目的是被延伸。 想想你是否正在编写代表不同物种的课程。 所有不同的物种都可能会扩展一个抽象的动物类,因为它们都有共同的属性作为动物。 但是,你永远不会实例化一个动物对象,因为你在世界上看到的每一个动物都是一只松鼠,一条狗,一条鱼……或者是这个抽象的动物类的某种具体实现。

封装是将您的类variables设为私有的,然后允许从get和set方法访问它们。 这样做的目的是分开数据的访问方式和实现方式。 例如,如果你有一个需求variables,那么每次改变它时,它也会把第二个variables加1,然后封装这个function。 这样你的代码就更可靠了,因为每次访问原始variables时都不必记住遵守这个规则。

如果你想要特定的代码示例,我build议只是做一个谷歌search,因为有很多像这样的例子。 这里有两个:

http://www.tutorialspoint.com/java/java_abcraction.htm http://www.tutorialspoint.com/java/java_encapsulation.htm

我会说封装是实现数据抽象的方法。

封装意味着将数据和function封装在一个单元中。

抽象是我们在封装后得到的。

封装将数据封装到一个单元中。 示例class

抽象你是对的

从这个答案

Abstraction – 抽象是用来确定对象的外部视图应该是什么的概念/技术。 只提供所需的接口。

Encapsulation – 将数据和相关function绑定到一个单元中。 它有利于抽象和信息隐藏。 允许在单元上应用成员访问等function来实现抽象和信息隐藏