Kon*_*ong 28 java abstract-class interface java-8
我正在研究Java 8接口中的新虚拟扩展方法:
public interface MyInterface {
default String myMethod() {
return "myImplementation";
}
}
Run Code Online (Sandbox Code Playgroud)
我的目的是允许接口随着时间的推移而发展,以及多重继承位,但它们看起来非常像我的抽象类.
如果你正在做新的工作,抽象类优先于扩展方法来提供"接口"的实现,还是这两种方法在概念上是等价的?
ars*_*jii 33
这种结构的一个主要目的是保持向后兼容性.为Java语言添加闭包是一个很大的改动,需要更新一些内容才能充分利用这一点.例如,Collection在Java 8中将有诸如forEach()与lambda一起使用的方法.简单地将这些方法添加到预先存在的Collection接口是不可行的,因为它会破坏向后兼容性.我在Java 7实现中编写的类Collection将不再编译,因为它缺少这些方法.因此,这些方法是通过"默认"实现引入的.如果您了解Scala,您会发现Java interface变得更像Scala trait.
至于接口与抽象类,这两者在Java 8 中仍然不同 ; 例如,您仍然无法在界面中拥有构造函数.因此,这两种方法本身并不是"概念上等同的".抽象类更结构化,可以具有与之关联的状态,而接口则不能.您应该在程序的上下文中使用更有意义的内容,就像在Java 7及更低版本中一样.
如果要编写允许用户使用lambda表达式的API,则应使用接口.
抽象类包含状态(实例字段),以便提供一些常见的行为(方法).
你通常不会(永远?)看到没有状态的抽象类.
接口指定功能.它们旨在将行为声明为合同,而不是实现它.
因此,任何指定为接口一部分的方法都是"辅助"方法 - 它们不会影响实现.