【问题标题】:Difference between the concepts [duplicate]概念之间的区别[重复]
【发布时间】:2013-12-23 09:42:25
【问题描述】:

我参加了一个java程序员的面试,在问了几个个人问题之后,面试官问了我一个问题“什么是封装和抽象”,我对这个问题非常满意,我的回答是隐藏了实现细节用户无需知道。抽象只向用户显示重要的细节。在我回答后几秒钟,面试官又问了我一个问题。只向用户显示重要的细节,这意味着向用户隐藏不相关的数据,如实现细节。是吗?

我的回答是肯定的!!!

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

我就像我不知道,我的手被冻住了,这对我来说真是糟糕的一天

如果有人问你这样的问题,谁能解释一下你会如何回答

【问题讨论】:

    标签: java php android ios


    【解决方案1】:

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

    对于 Java,这意味着一起编写代码并仅公开那些打算公开的部分。但它通常与数据隐藏相关联。例如,当您将实例方法/函数定义为私有时,它只能从同一个类中访问。这样您就不会直接公开您的实例变量/函数。为什么?因为用户与它无关。

    用外行的话来说,抽象是一个用来隐藏其背后复杂性的概念。以计算机为例。它们是对处理器的抽象,处理器进行实际计算,而芯片又涉及门。对于普通人来说,很难谈论所使用的门。所以这个概念已经被抽象到计算机上。

    对于 Java 抽象意味着对用户隐藏实现细节。这包括使类抽象或定义接口。所有用户都暴露于接口(一组函数或 API)。他不需要知道它的内部实现。他只需要知道他必须提供什么输入(参数)以及相应的输出(返回类型)。

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

    【讨论】:

      【解决方案2】:

      什么是封装?

      封装只不过是保护任何容易改变的东西。封装背后的合理性是,如果任何功能被很好地封装在代码中,即只维护在一个地方而不是分散在代码中,那么很容易改变。这可以通过一个简单的 Java 封装示例来更好地解释。我们都知道构造函数用于在Java中创建对象,构造函数可以接受参数。假设我们有一个 Loan 类,它有一个构造函数,并且在各种类中,您使用这个构造函数创建了 Loan 的实例。现在要求发生了变化,您在贷款时还需要包括借款人的年龄。由于此代码没有很好地封装,即没有限制在一个地方,因此您需要在调用此构造函数的任何地方进行更改,即对于一次更改,您需要修改多个文件而不是一个更容易出错和乏味的文件,尽管它可以是如果您只需要在一个地方进行更改,那么高级IDE的重构功能会不会更好?是的,如果我们将 Loan 创建逻辑封装在一个方法中,比如 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 封装的同一个示例中,您会看到所有成员变量都是私有的,因此它们被很好地封装,您只能在此类中直接更改或访问该变量。如果您想允许外部世界访问这些变量,最好创建一个 getter 和 setter,例如getLoan() 允许您在归还贷款之前进行任何类型的验证、安全检查,因此它可以让您完全控制您想做的任何事情,并为受控和管理的客户提供单一访问渠道。

      什么是抽象?

      抽象类是不完整的东西,你不能创建抽象类的实例。如果你想使用它,你需要通过扩展它来使其完整或具体。如果一个类不包含任何抽象方法,并且实现了从它实现或扩展的抽象类或接口继承的所有抽象方法,则该类称为具体类。顺便说一句,Java 有抽象类的概念,抽象方法但变量在 Java 中不能是抽象的。 Java 中抽象类的流行示例是 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 接口,这对于设计更好的 Java 应用程序很重要,如果你只知道你的类的方法的名称,你就可以选择 java 接口应该有例如对于 Server 它应该有 start() 和 stop() 方法,但我们不知道这些 start 和 stop 方法将如何工作。如果您在设计类时知道一些行为,并且在所有子类中仍然很常见,请将其添加到抽象类中。像 Runnable 这样的接口是 Java 中抽象的一个很好的例子,用于抽象多线程执行的任务。

      【讨论】:

        【解决方案3】:

        抽象是使基类“抽象”然后扩展其功能的做法。抽象类是在具体事物中不存在的东西。它的唯一目的是扩展。想想你是否正在编写类来代表不同的物种。您所有不同的物种都可能扩展一个抽象的 Animal 类,因为它们都将共享作为动物的共同属性。但是,您永远不会实例化 Animal 对象,因为您在世界上看到的每一种动物都是松鼠、狗或鱼……或者是该基础抽象动物类的某种具体实现。

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

        如果您想要特定的代码示例,我建议您只进行谷歌搜索,因为有很多类似的示例可用。这里有两个:

        http://www.tutorialspoint.com/java/java_abstraction.htmhttp://www.tutorialspoint.com/java/java_encapsulation.htm

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

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

            你做对了的抽象

            【讨论】:

            • 不回答问题,访问说明符与抽象无关。 -1
            • @EJP privateprotected 用于隐藏类外部的实现。不是吗?
            • 访问是一个比实现更好的术语,也就是封装。
            • @AJ。抽象是接口与实现的分离。与访问控制无关。以 Java 接口为例。方法是公开的,但实现是分开的。
            【解决方案6】:

            来自this answer

            Abstraction - 抽象是用于识别对象的外部视图的概念/技术。只提供所需的接口。

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

            【讨论】:

            • 那不是“来源”。这只是对 StackOverflow 上另一个问题的一个相当糟糕的答案,该问题的票数为零。另一个答案有五十多个,并引用了真实来源。为什么你引用这个是一个谜。 -1
            • @EJP 我认为这将有助于 OP 明确他的概念。用简单的语言。
            • 它可能确实如此,但这是一种奇怪的引用方式。你甚至没有链接答案,只是问题。
            • @EJP 我不知道链接答案。谢谢编辑。现在为什么要在这个时候投反对票?
            猜你喜欢
            • 2011-03-07
            • 2011-06-08
            • 2012-03-23
            • 2016-04-24
            • 2019-05-17
            • 2012-06-02
            • 2021-12-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多