【问题标题】:Java 9 Interface vs ClassJava 9 接口与类
【发布时间】:2017-11-02 01:18:59
【问题描述】:

由于 Java 9 将允许我们在接口中定义 privateprivate static 方法,interfaceclass 的其余区别是什么? 此外,Java 是否正在缓慢地向多继承迈进?

【问题讨论】:

  • 我很惊讶这有这么多的赞成票...其余的区别:protected 支持,package-private 支持,基本上除了 privatestatic 之外的所有内容.. 接口不能扩展类,保留关键字interfaceclass两者的哲学/目的/存在原因 .. 可能会继续下去..
  • 答案还是和Interface with default methods vs Abstract class in Java 8一样,只是接口中可以有private方法,显然不会对其他类产生影响。
  • @Aakash 学生:“有什么愚蠢的问题吗?教授:“当然没有!" - 如果学生在得到答案后立即再次提出该问题怎么办?这不是一个愚蠢的问题吗?这句话背后的理念是“不要害怕提问,这是你得到答案的方式”,不要滥用它来鼓励懒惰。
  • @VinceEmigh 你有更多的投票,然后是第二个投票最多的答案:) 你应该让你评论一个
  • 接口和类的剩余区别是什么 - 假设你知道 java 类做什么,你不能自己列举这些添加之后仍然缺少哪些接口?如果我们从表面上看你的问题,那么听起来你是在问人们 java 类有哪些特性。

标签: java java-9


【解决方案1】:

Java 9 中的私有接口方法的行为与其他私有方法完全一样:它们必须有一个主体(即使在抽象类中),并且不能被子类调用或覆盖。因此,它们并没有真正与继承交互。说到哪一种(尤其是多重继承),有(至少?)三种:

  • 类型的继承意味着一种类型可以成为另一种类型,例如String 是一个 Object。 Java 从一开始就允许类型的多重继承(通过接口)。
  • 行为的继承意味着一种类型可以继承另一种类型的行为。在 Java 8 之前,只有类可以实现方法,所以只有这种单继承。 Java 8 出现了默认方法,允许接口实现方法,从而赋予 Java 行为的多重继承。
  • 状态的继承意味着一个类型继承了另一个类型的内部状态(即字段)。就目前而言(Java 9 以及目前为未来 Java 版本提出的所有内容),只有类可以具有状态,因此只有这种类型的单一继承。

如您所见,私有接口方法不会在此处添加任何内容。

关于接口和类如何比较的问题,有两个主要区别:多重继承和状态。接口支持前者,类可以有后者。由于状态在典型的 OOP 中有点重要,因此类将保持相关性。 ?

如果接口有一种方法可以强制实现具有特定的非公共字段或直接定义一个自己的字段,那么游戏将会改变,接口可以与类竞争。

【讨论】:

  • 它不漂亮,我不想在生产中看到它,但是不能用内部类封装状态来模拟多类继承吗?与此类似:stackoverflow.com/questions/3427073/…
  • 由于内部类以及引用它的字段都是公共的,这并不能真正算作继承私有状态。 ;) 公共状态没问题,只要把状态相关的方法拉到接口里就行了。
【解决方案2】:

私有方法不被子类继承,所以这个特性不会影响实现类。我相信接口中的私有方法允许我们在默认方法之间共享代码。

Java 接口仍然不能有非静态成员。这是一个很大的区别,而不是多重继承 IMO。

【讨论】:

    【解决方案3】:

    Java 9 接口仍然不能包含字段和构造函数。这在类和接口之间产生了巨大的差异,因此 Java 9 远非多重继承。

    【讨论】:

      【解决方案4】:

      版本 9 中的 Java 接口具有私有方法但静态私有。该功能已被引入以允许模块化方法。一项功能应负责一项职责,而不是使用冗长的默认方法。它与多重继承无关。 私有的静态方法越多,你就越能写出干净且可重用的代码。无论如何,无论是公共的还是受保护的,静态方法都不能被覆盖。

      【讨论】:

        【解决方案5】:

        虽然这是一个老问题,但让我也谈谈我的看法:)

        1. 抽象类: 在抽象类中我们可以声明实例 子类需要的变量

          接口: 在接口内部,每个变量总是公共静态的 最后我们不能声明实例变量

        2. 抽象类:抽象类可以谈论对象的状态

          接口:接口永远不能谈论对象的状态

        3. 抽象类:在抽象类中我们可以声明构造函数

          接口:在接口内部我们不能声明构造函数,因为构造函数的目的是初始化实例变量。所以呢 如果我们不能有实例,是否需要构造函数 接口中的变量。

        4. 抽象类:在抽象类中我们可以声明实例和静态块

          接口:接口不能有实例和静态块。

        5. 抽象类:抽象类不能引用 lambda 表达式

          接口:具有单一抽象方法的接口可以引用 lambda 表达式

        6. 抽象类:在抽象类中我们可以重写 OBJECT CLASS 方法

          接口:我们不能覆盖接口内的 OBJECT CLASS 方法。

        最后我会说:

        接口中的默认方法概念/静态方法概念只是为了保存实现类,而不是提供有意义的有用实现。默认方法/静态方法是一种虚拟实现,“如果你愿意,你可以使用它们,或者你可以在实现类中覆盖它们(在默认方法的情况下)”这样我们就不用在新的实现类中实现新方法了接口中的方法被添加。因此接口永远不能等同于抽象类。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-17
          • 2018-05-06
          • 2010-10-02
          • 1970-01-01
          • 2015-02-04
          • 2016-03-24
          • 2010-10-25
          相关资源
          最近更新 更多