Java 8新特性——default方法(defender方法)介绍
我们都知道在Java语言的接口中只能定义方法名,而不能包含方法的具体实现代码。接口中定义的方法必须在接口的非抽象子类中实现。下面就是关于接口的一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public interface SimpleInterface { public void doSomeWork(); } class SimpleInterfaceImpl implements SimpleInterface{ @Override public void doSomeWork() { System.out.println( "Do Some Work implementation in the class" ); } public static void main(String[] args) { SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl(); simpObj.doSomeWork(); } } |
那么,如果我们在SimpleInterface里面添加一个新方法,会怎样呢?
1
2
3
4
|
public interface SimpleInterface { public void doSomeWork(); public void doSomeOtherWork(); } |
如果我们尝试编译上面的这段代码,会得到如下结果:
1
2
3
4
5
6
|
$javac .\SimpleInterface.java .\SimpleInterface.java:18: error: SimpleInterfaceImpl is not abstract and does not override abstract method doSomeOtherWork() in SimpleInterface class SimpleInterfaceImpl implements SimpleInterface{ ^ 1 error |
因为接口有这个语法限制,所以要直接改变/扩展接口内的方法变得非常困难。我们在尝试强化Java 8 Collections API,让其支持lambda表达式的时候,就面临了这样的挑战。为了克服这个困难,Java 8中引入了一个新的概念,叫做default方法,也可以称为Defender方法,或者虚拟扩展方法(Virtual extension methods)。
Default方法是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。接下来,让我们看一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public interface SimpleInterface { public void doSomeWork(); //A default method in the interface created using "default" keyword //使用default关键字创在interface中直接创建一个default方法,该方法包含了具体的实现代码 default public void doSomeOtherWork(){ System.out.println( "DoSomeOtherWork implementation in the interface" ); } } class SimpleInterfaceImpl implements SimpleInterface{ @Override public void doSomeWork() { System.out.println( "Do Some Work implementation in the class" ); } /* * Not required to override to provide an implementation * for doSomeOtherWork. * 在SimpleInterfaceImpl里,不需要再去实现接口中定义的doSomeOtherWork方法 */ public static void main( String [] args) { SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl(); simpObj.doSomeWork(); simpObj.doSomeOtherWork(); } } |
该程序的输出是:
1
2
|
Do Some Work implementation in the class DoSomeOtherWork implementation in the interface |
以上是对default方法的一个非常简要的介绍。如果有兴趣的话,还可以通过看这篇文档,来获取更深层次的理解。
更新:
现在大家问得比较多的一个问题是:如果一个类实现了两个接口(可以看做是“多继承”),这两个接口又同时都包含了一个名字相同的default方法,那么会发生什么情况? 在这样的情况下,编译器会报错。让我用例子来解释一下:
1
2
3
4
5
6
7
8
9
10
11
|
public interface InterfaceWithDefaultMethod { public void someMethod(); default public void someOtherMethod(){ System.out.println( "Default method implementation in the interface" ); } } public interface InterfaceWithAnotherDefMethod { default public void someOtherMethod(){ System.out.println( "Default method implementation in the interface" ); } } |
然后我们定义一个类,同时实现以上两个接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class DefaultMethodSample implements InterfaceWithDefaultMethod, InterfaceWithAnotherDefMethod{ @Override public void someMethod(){ System.out.println( "Some method implementation in the class" ); } public static void main(String[] args) { DefaultMethodSample def1 = new DefaultMethodSample(); def1.someMethod(); def1.someOtherMethod(); } } |
如果编译以上的代码,会得到一个编译器错误,如下所示。因为编译器不知道应该在两个同名的default方法中选择哪一个,因此产生了二义性。
原文链接: blog.sanaulla.info 翻译: ImportNew.com - 黄小非
译文链接: http://www.importnew.com/7302.html
[ 转载请保留原文出处、译者和译文链接。]
相关文章
- linux安装MAT(MemoryAnalyzerTool),并且分析java dump的方法
- Java 函数(方法)
- java基础—自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序(java集合六)
- Java enum枚举的使用方法
- Linux 有问必答:如何在debian及其衍生发行版中改变默认的 Java 版本
- 深入理解Java内存模型(三)——顺序一致性
- 【java细节】Java代码忽略https证书:No subject alternative names present
- java TreeMap 源代码分析 平衡二叉树
- Java 字符串常量池 及 intern 方法的使用
- Java final方法
- Java反射学习总结二(用反射调用对象的私有属性和方法)
- Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
- java IO的概述和File方法
- Java中方法的格式
- Java通过接口或者抽象类调用方法的时候,怎么知道调用的是哪个实现类里的方法?
- JAVA 安装Springboot后,run as 没有 spring boot app 选项
- java.lang.OutOfMemoryError: Java heap space解决方法
- java高级用法之:在JNA中将本地方法映射到JAVA代码中
- java中Scanner类nextLine()和next()的区别和使用方法
- Java_类似java.lang.VerifyError: Expecting a stackmap frame at branch target 22 in method的解决方法
- java学习-MD5消息摘要算法
- Java设计模式之行为型:迭代器模式
- JAVA学习.java.sql.date 与java.util.date以及gettime()方法的分析
- Android(java)同步方法synchronized
- Java数据结构与算法 day06 查找算法与哈希表
- java 枚举(二) 级联关系
- Java关键字final学习(变量、方法、类,final域重排序语义介绍)
- Java的枚举类型使用方法详解