开发者社区> jieforest> 正文

不学Java8你就Out了—Java8的default方法详解

简介: 不学Java8你就Out了!——Java8的default方法详解 Java 8新增了default方法,它可以在接口添加新功能特性,而且还不影响接口的实现类。下面我们通过例子来说明这一点。
+关注继续查看

不学Java8你就Out了!——Java8的default方法详解

Java 8新增了default方法,它可以在接口添加新功能特性,而且还不影响接口的实现类。下面我们通过例子来说明这一点。

public class MyClass implements InterfaceA {
	public static void main(String[] args){
	}
	
	@Override
	public void saySomething() {
		// TODO Auto-generated method stub
	}
}

interface InterfaceA{
	public void saySomething();
}
上面的代码显示了MyClass类实现了InterfacesA接口的saySomething()方法。现在我们为InterfacesA接口新增一个sayHi()方法。这么做的话,MyClass类是无法通过编译的,除非我们提供了sayHi()的实现方法。
Default方法是非常有用的,通过在接口定义的方法的访问修饰符前加上关键字default,那么实现类就无需提供该方法的实现了。比如:
public class MyClass implements InterfaceA {
	public static void main(String[] args){
	}
	
	@Override
	public void saySomething() {
		// TODO Auto-generated method stub
	}
}

interface InterfaceA{
	public void saySomething();
	default public void sayHi(){
		System.out.println("Hi");
	}
}
要注意,我们必须提供所有的default方法的实现。因此,default方法使我们的代码更加灵活,在接口中也可以写方法实现了。实现的方法会作为默认的方法实现。

那么,多接口存在冲突该怎么办?

由于Java类可以实现多个接口,那么就可能存在这样的情况:两个或多个接口都有一个同名的default接口方法,从而造成冲突。因为Java虚拟机在程序运行时,并不清楚你要使用哪一个default方法。这会导致编译错误。

让我们来看看下面的例子。

public class MyClass implements InterfaceA, InterfaceB {
	public static void main(String[] args){
		MyClass mc = new MyClass();
		mc.sayHi();
	}
	
	@Override
	public void saySomething() {
		// TODO Auto-generated method stub
	}
}

interface InterfaceA{
	public void saySomething();
	default public void sayHi(){
		System.out.println("Hi from InterfaceA");
	}
}

interface InterfaceB{
	default public void sayHi(){
		System.out.println("Hi from InterfaceB");
	}
}
它是通不过编译的,会报以下错误:

“Duplicate default methods named sayHi with the parameters () and () are inherited from the types InterfaceB and InterfaceA.”

除非在MyClass类中重写了sayHi()方法:

public class MyClass implements InterfaceA, InterfaceB {
	public static void main(String[] args){
		MyClass mc = new MyClass();
		mc.sayHi();
	}
	
	@Override
	public void saySomething() {
		// TODO Auto-generated method stub
	}
	
	@Override
	public void sayHi(){
		System.out.println("implemetation of sayHi() in MyClass");
	}
}

interface InterfaceA{
	public void saySomething();
	default public void sayHi(){
		System.out.println("Hi from InterfaceA");
	}
}

interface InterfaceB{
	default public void sayHi(){
		System.out.println("Hi from InterfaceB");
	}
}
如果想指定调用哪一个接口的sayHi()方法,我们可以这么做:
public class MyClass implements InterfaceA, InterfaceB {
	public static void main(String[] args){
		MyClass mc = new MyClass();
		mc.sayHi();
	}
	
	@Override
	public void saySomething() {
		// TODO Auto-generated method stub
	}
	
	@Override
	public void sayHi(){
		InterfaceA.super.sayHi();
	}
}

interface InterfaceA{
	public void saySomething();
	default public void sayHi(){
		System.out.println("Hi from InterfaceA");
	}
}

interface InterfaceB{
	default public void sayHi(){
		System.out.println("Hi from InterfaceB");
	}
}
答案是不是很简单呢?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
java202302java学习笔记第七天-super详解2
java202302java学习笔记第七天-super详解2
11 0
java202302java学习笔记第七天-super详解
java202302java学习笔记第七天-super详解
10 0
java202303java学习笔记第二十一天-包和final之1
java202303java学习笔记第二十一天-包和final之1
11 0
java202303java学习笔记第二十一天-包和final之4
java202303java学习笔记第二十一天-包和final之4
13 0
java202303java学习笔记第二十一天-包和final之5
java202303java学习笔记第二十一天-包和final之5
14 0
Java 最常见的面试题:final 在 java 中有什么作用
Java 最常见的面试题:final 在 java 中有什么作用
40 0
Java 中关于 Null 的这些事儿你知道吗
对于 Java 程序员来说,null 一直是令人头疼的问题,经常会受到 NullPointerException 的蹂躏和壁咚。Java 的发明者也承认这是一个巨大的设计错误。
33 0
Java中new与null的不同
今天在写一个android的程序时,本来想初始化一个list的集合,以避免第二次的数据添加在第一次的后面,就直接使用了对象=null,发现在给list集合添加数据后运行出现了这样的错误。
59 0
Java权限修饰符(包括Java8 default介绍)
Java权限修饰符(包括Java8 default介绍)
130 0
+关注
jieforest
原ChinaUnix博客专家,见:http://blog.chinaunix.net/uid/301743.html
文章
问答
视频
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
Java 开发手册(华山版)
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多