设为首页 加入收藏

TOP

Java 8的default方法详解
2015-03-06 01:05:36 来源: 作者: 【 】 浏览:40
Tags:Java 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");
?}
}


答案是不是很简单呢?


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java8读文件仅需一行代码 下一篇用Go语言绘制Go语言地鼠吉祥物

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: