我参加了java程序员的采访,在几个人的问题之后,面试官问我“什么是封装和抽象”这个问题我真的对问题感到满意,并且我已经回答它隐藏了实施细节用户不需要知道。而Abstraction只向用户展示了重要的细节。在我回答后几秒钟,面试官对我提出了另一个问题。向用户显示重要细节,这意味着将不相关的数据(如实现细节)隐藏到用户。是吗?
我的回答是肯定的!
还有另外一个问题。那么抽象和封装之间有什么区别。我认为根据你的答案没有区别。
我就像我不知道,我的双手被冷冻,对我来说是一个非常糟糕的一天
如果有人向你提出这样的问题,任何人都可以解释你会如何回答
答案 0 :(得分:3)
封面用外行的术语仅仅意味着覆盖(封装)。
对于Java而言,它意味着将代码编写在一起并仅暴露其中要暴露的部分。但它通常与数据隐藏相关联。例如,当您定义实例方法/函数private时,只能从同一个类访问它。这样您就不会直接公开实例变量/函数。为什么?因为用户与此无关。
外行人的术语中的抽象是一个隐藏其背后复杂性的概念。以计算机为例。它们一直是处理器的抽象,它进行实际的计算,其中涉及的芯片涉及到门。对于普通人而言,就所使用的门而言,谈论起来很困难。因此,这个概念被抽象出来了。
关于Java抽象意味着隐藏用户的实现细节。这包括使类抽象或定义接口。所有用户都是接口(一组函数或API)。他不需要知道它的内部实施。所有他必须知道他必须提供什么输入(参数)以及相应的输出(返回类型)。
为了更好地理解Java示例,请参阅this问题。
答案 1 :(得分:1)
什么是封装?
封装只不过是保护易于改变的东西。封装的合理背后是,如果任何功能很好地封装在代码中,即只保存在一个地方而不是分散在代码中很容易改变。这可以通过Java中的一个简单的封装示例来更好地解释。我们都知道构造函数用于在Java中创建对象,构造函数可以接受参数。假设我们有一个类Loan有一个构造函数,而且在各种类中你通过使用这个构造函数创建了贷款实例。现在需求发生变化,您需要在贷款时包括借款人的年龄。由于此代码没有很好地封装,即不限于一个地方,您需要在调用此构造函数的任何地方进行更改,即一次更改需要修改多个文件而不是一个文件,这更容易出错并且单调乏味,尽管它可以是如果您只需要在一个地方进行更改,那么使用高级IDE的重构功能会不会更好?是的,如果我们将贷款创建逻辑封装在一个方法中,例如createLoan(),并且客户端代码调用此方法,并且此方法在内部创建Loan对象,则可以。在这种情况下,您只需要修改此方法而不是所有客户端代码。
示例强>
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中的Encapsulation的同一个例子中,您看到所有成员变量都是私有的,因此它们被很好地封装,您只能在此类中直接更改或访问此变量。如果你想允许外界访问这些变量,最好创建一个getter和setter,例如getLoan()允许您在返回贷款之前进行任何类型的验证,安全检查,因此它可以让您完全控制您想要执行的操作以及受控和管理的客户端的单一访问通道。
什么是抽象?
抽象类是不完整的,你不能创建抽象类的实例。如果你想使用它,你需要通过扩展它来使它完整或具体。如果一个类不包含任何抽象方法并且实现从它已实现或扩展的抽象类或接口继承的所有抽象方法,则该类称为concrete。顺便说一句,Java有抽象类的概念,但抽象方法却不能在Java中抽象变量。 Java中抽象类的流行示例是ActionListener,它具有名为actionPerformed(ActionEvent ae)的抽象方法。当您单击JButton时触发ActionEvent时会调用此方法。它通常在java中通过使用Anonymous类实现抽象方法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接口这对于理解设计更好的Java应用程序很重要,如果你只知道你的类的方法名称,你可以去java接口应该有例如对于Server,它应该有start()和stop()方法但我们不知道这些start和stop方法究竟是如何工作的。如果您在设计类时知道某些行为,并且在所有子类中保持通用,则将其添加到抽象类中。像Runnable这样的接口是Java中抽象的好例子,用于抽象多线程执行的任务。
答案 2 :(得分:0)
封装是将数据包装到单个单元中。示例class
你得到了正确的抽象
答案 3 :(得分:0)
抽象是使基类“抽象”然后扩展其功能的做法。抽象类是具体事物中不存在的东西;它的唯一目的是扩展。想想你是否在编写代表不同物种的课程。你所有不同的物种都可以扩展一个抽象的动物类,因为它们都会像动物一样拥有共同的属性。但是,你永远不会实例化一个动物对象,因为你在世界上看到的每一只动物都是松鼠,狗,或鱼......或某种基础的抽象动物类的具体实现。
封装是将类变量设为私有,然后允许从get和set方法访问它们的做法。这样做的目的是分开访问数据的方式和实现方式。例如,如果您有一个有需求的变量,那么每次更改它时,它也会将第二个变量增加1,然后您将封装该功能;这样你的代码就更可靠了,因为你每次访问原始变量时都不必记住遵守该规则。
如果您需要特定的代码示例,我建议您只进行Google搜索,因为有很多可用的示例。这是两个:
http://www.tutorialspoint.com/java/java_abstraction.htm http://www.tutorialspoint.com/java/java_encapsulation.htm
答案 4 :(得分:0)
我想说Encapsulation是实现数据抽象的方式。
封装意味着在一个单元中包装数据和功能。
抽象是我们在封装之后得到的。
答案 5 :(得分:0)
Abstraction
- 抽象是用于识别对象外部视图的概念/技术。只提供所需的界面。
Encapsulation
- 将数据和相关功能绑定到一个单元中。它有助于抽象和信息隐藏。允许在单元上应用成员访问等功能以实现抽象和信息隐藏