Java 9 界面对比 Class
Java 9 Interface vs Class
由于 Java 9 将允许我们在接口中定义 private
和 private static
方法,所以 interface
和 class
?
而且,Java是不是慢慢走向多重继承?
子类不继承私有方法,因此该特性不影响实现类。我相信接口中的私有方法允许我们在默认方法之间共享代码。
Java 接口仍然不能有非静态成员。这是一个很大的区别,而不是多重继承 IMO。
Java9个接口仍然不能包含字段和构造函数。这使得 类 和接口之间存在巨大差异,因此 Java 9 与多重继承相去甚远。
Java9 中的私有接口方法与其他私有方法完全一样:它们必须有一个主体(即使是抽象的类)并且不能被子[=46=调用或覆盖].因此,它们并不真正与继承交互。说到哪个(尤其是多重继承),有(至少?)三种:
- 类型的继承意味着一种类型可以成为另一种类型,例如
String
是一个 Object
。 Java 从第一天起就允许类型的多重继承(通过接口)。
- 行为的继承表示一种类型可以继承另一种类型的行为。在Java8之前,只有类可以实现方法,所以只有这种单继承。使用 Java 8 个默认方法,允许接口实现方法,从而提供 Java 多重行为继承。
- 状态的继承意味着一个类型继承另一个类型的内部状态(即字段)。就目前而言(Java 9 和目前为未来 Java 版本提出的所有建议),只有 类 可以有状态,所以只有这种类型的单一继承。
如您所见,私有接口方法不要在此处添加任何内容。
关于你的接口和类如何比较的问题,有两个主要区别:多重继承和状态。接口支持前者,类可以有后者。由于状态在典型的 OOP 中有点重要,因此 类 将保持相关性。
如果接口有办法强制实现具有特定的非 public 字段或直接定义一个本身,那么游戏将会改变并且接口可以与 [=46= 竞争].
Java 版本 9 中的接口具有私有方法但静态私有。引入该功能以允许模块化方法。一个函数应该承担一个责任,而不是使用冗长的默认方法。它与多重继承无关。 私有静态方法越多,你就越能写出干净且可重用的代码。无论如何,无论是public还是受保护的静态方法都不能被覆盖。
虽然这是一个老问题,但让我也提供我的意见:)
abstract class: 在abstract里面class我们可以声明实例
child class
所需的变量
接口:接口内部每个变量总是public静态
最后我们不能声明实例变量
摘要class:摘要class可以谈谈object
的状态
接口:接口永远不能谈论object
的状态
abstract class: 在 Abstract class 中我们可以声明构造函数
接口:在接口内部我们不能声明构造函数作为
的目的
constructors是初始化实例变量。所以呢
如果我们没有实例,是否需要构造函数
接口中的变量.
抽象class: 在抽象里面class我们可以声明实例和静态块
接口:接口不能有实例块和静态块。
摘要class:摘要class不能引用lambda表达式
接口:只有一个抽象方法的接口可以引用lambda表达式
abstract class:在抽象class内部我们可以覆盖OBJECTCLASS方法
接口: 我们不能覆盖接口内的 OBJECT CLASS 方法。
最后我要注意:
接口中的默认方法concepts/static方法概念只是为了保存实现classes,而不是提供有意义的有用实现。默认 methods/static 方法是一种虚拟实现,"if you want you can use them or you can override them (in case of default methods) in implementation class" 因此,无论何时在接口中添加新方法时,我们都无需在实现 classes 中实现新方法。 因此接口永远不能等于抽象 classes.
由于 Java 9 将允许我们在接口中定义 private
和 private static
方法,所以 interface
和 class
?
而且,Java是不是慢慢走向多重继承?
子类不继承私有方法,因此该特性不影响实现类。我相信接口中的私有方法允许我们在默认方法之间共享代码。
Java 接口仍然不能有非静态成员。这是一个很大的区别,而不是多重继承 IMO。
Java9个接口仍然不能包含字段和构造函数。这使得 类 和接口之间存在巨大差异,因此 Java 9 与多重继承相去甚远。
Java9 中的私有接口方法与其他私有方法完全一样:它们必须有一个主体(即使是抽象的类)并且不能被子[=46=调用或覆盖].因此,它们并不真正与继承交互。说到哪个(尤其是多重继承),有(至少?)三种:
- 类型的继承意味着一种类型可以成为另一种类型,例如
String
是一个Object
。 Java 从第一天起就允许类型的多重继承(通过接口)。 - 行为的继承表示一种类型可以继承另一种类型的行为。在Java8之前,只有类可以实现方法,所以只有这种单继承。使用 Java 8 个默认方法,允许接口实现方法,从而提供 Java 多重行为继承。
- 状态的继承意味着一个类型继承另一个类型的内部状态(即字段)。就目前而言(Java 9 和目前为未来 Java 版本提出的所有建议),只有 类 可以有状态,所以只有这种类型的单一继承。
如您所见,私有接口方法不要在此处添加任何内容。
关于你的接口和类如何比较的问题,有两个主要区别:多重继承和状态。接口支持前者,类可以有后者。由于状态在典型的 OOP 中有点重要,因此 类 将保持相关性。
如果接口有办法强制实现具有特定的非 public 字段或直接定义一个本身,那么游戏将会改变并且接口可以与 [=46= 竞争].
Java 版本 9 中的接口具有私有方法但静态私有。引入该功能以允许模块化方法。一个函数应该承担一个责任,而不是使用冗长的默认方法。它与多重继承无关。 私有静态方法越多,你就越能写出干净且可重用的代码。无论如何,无论是public还是受保护的静态方法都不能被覆盖。
虽然这是一个老问题,但让我也提供我的意见:)
abstract class: 在abstract里面class我们可以声明实例 child class
所需的变量接口:接口内部每个变量总是public静态 最后我们不能声明实例变量
摘要class:摘要class可以谈谈object
的状态接口:接口永远不能谈论object
的状态
abstract class: 在 Abstract class 中我们可以声明构造函数
接口:在接口内部我们不能声明构造函数作为
的目的 constructors是初始化实例变量。所以呢 如果我们没有实例,是否需要构造函数 接口中的变量.抽象class: 在抽象里面class我们可以声明实例和静态块
接口:接口不能有实例块和静态块。
摘要class:摘要class不能引用lambda表达式
接口:只有一个抽象方法的接口可以引用lambda表达式
abstract class:在抽象class内部我们可以覆盖OBJECTCLASS方法
接口: 我们不能覆盖接口内的 OBJECT CLASS 方法。
最后我要注意:
接口中的默认方法concepts/static方法概念只是为了保存实现classes,而不是提供有意义的有用实现。默认 methods/static 方法是一种虚拟实现,"if you want you can use them or you can override them (in case of default methods) in implementation class" 因此,无论何时在接口中添加新方法时,我们都无需在实现 classes 中实现新方法。 因此接口永远不能等于抽象 classes.