我知道已经有一个与此相关的问题,在Java 8中使用默认方法与抽象类的接口,但是在Java 8发布之前问了这个问题,它只是一个关于抽象类和接口之间有什么区别的要点.默认方法,它根本没有提供任何实际的例子,而是充满了冗长的解释.
我发布这个问题是因为我对一个实用的例子更感兴趣,它用Java 8中的默认方法清除了抽象类和接口之间的区别.
看看这个例子,
抽象类,
abstract class AbstractClass {
public int var = 0;
// These methods must be Overridden
abstract int x();
abstract int y();
// This method is optional
int z() {
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
接口(Java 8)
interface Interface {
public int var = 0;
// These methods must be Overridden
int x();
int y();
// This method is optional
default int z(){
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我想向一个新手Java程序员(比如我自己)解释它的实际区别,我怎么能区分上面两个?
这篇文章说,
默认方法带来的好处是,现在可以向接口添加新的默认方法,并且不会破坏实现.
这可能不是默认方法接口的唯一好处,或者是它?
首先,你应该了解它们之间的区别
abstract class AbstractClass {
public int var = 0;
…
Run Code Online (Sandbox Code Playgroud)
和
interface Interface {
public int var = 0;
…
Run Code Online (Sandbox Code Playgroud)
后者相当于
public static final int var = 0;
Run Code Online (Sandbox Code Playgroud)
这与写作完全不同
public int var = 0;
Run Code Online (Sandbox Code Playgroud)
在abstract课堂上.通过说"抽象类可以具有状态"链接的问题已经解释了这种差异.接口只能定义常量.这意味着您无法提供使用实例字段执行任何操作的default方法,interface因为interface无法定义实例字段.default方法只能在其他interface方法上工作.
有时,它确实有助于理解"理性的解释",而不是要求"一个实际的例子".换句话说,您链接的问题和答案仍然有效.
关于defaultJava 8 中方法的目的,之前也曾提出过这个问题.
总结一下abstract类和interfaces 之间的一些区别:
interface成员都是public,你不能定义private,protected或包私人成员; 当你省略public它隐含的修饰符时(从Java 9开始,private允许使用方法)interface字段仅用于定义常量; 他们含蓄地说static finalabstract类可以有static类初始化代码和实例构造函数abstract 类可以具有状态,即定义实例字段并提供使用它们的方法abstract类可以为方法的实现equals,hashCode并且toString在定义java.lang.Object同时default在指定的方法interfaces不能重写这些方法abstract类可以定义final,strictfp,synchronized,或native方法class只能扩展一个abstract或具体class但可以实现多个interface