2017-06-01 41 views
29

由于Java 9将允许我们在接口中定义privateprivate static方法,因此interfaceclass的剩余差异是什么?另外,Java是否正朝着多重继承缓慢发展?Java 9接口vs类

+26

我很惊讶,有这么多upvotes ...剩余的区别:'protected'支持,'package-private'支持,**基本上除了'private'和'static' **外所有内容。接口不能扩展类,保留关键字'interface'和'class ',*两者的存在理念/目的/理由..可能继续下去.. –

+4

@VinceEmigh我明白你的关注。但是在我职业生涯刚开始的时候有人告诉我:“没有问题是愚蠢的”。而且我知道所有包括你在内的人都会理解这一点。 – Aakash

+3

答案仍然与[默认方法与Java 8中的抽象类的接口](https://stackoverflow.com/q/19998454/2711488)中的相同,只是在接口中可以有'private'方法,这显然不会对其他班级产生影响。 – Holger

回答

35

Java 9中的私有接口方法的行为与其他私有方法完全相同:它们必须具有正文(即使在抽象类中),既不能被子类调用也不能被子类重写。因此,它们并不真正与继承进行交互。其中(特别是多重继承)的聊天,有(至少?)三种的它:

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

正如你所看到的私人界面方法不会在这里添加任何东西。

关于如何比较接口和类的问题,有两个主要区别:多重继承和状态。接口支持前者,类可以具有后者。由于国家在典型的面向对象方面很重要,所以类仍然是相关的。

如果有一种方法让接口强制实现具有特定的非公有领域或者直接定义一个接口本身,则游戏会发生变化,接口可能会与类竞争。

+0

这不是很漂亮,我不想看到它生产,但不能用一个内部类来封装状态来模拟多个类的继承?与此类似:https://stackoverflow.com/questions/3427073/java-interface-implementation-pair/3442218#3442218 – Terran

+0

由于内部类以及引用它的字段将是公开的,所以这并不算真正继承私有状态。 ;)公共状态是没有问题的,只需将状态相关的方法拖入界面即可。 – Nicolai

27

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

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

19

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

2

版本9中的Java接口具有私有方法,但具有静态私有方法。该功能已被引入以允许模块化方法。一个功能应该与一个责任一起工作,而不是使用冗长的缺省方法。它与多个继承无关。 更私有的静态方法,您将能够编写干净且可重用的代码的次数越多。无论如何,静态方法无论是public还是protected都不能被覆盖。