java default默认,Java 八 之 默认方法(Default Methods)

Java 8 之 默认方法(Default Methods)

在Java的interface中一直只是包含方法的定义不能有实现,而且Java也不支持多继承。参考Why Multiple Inheritance is Not Supported in Java。Java 8开始提供在interface中可以有方法的实现,这个特性叫默认方法“Default Methods”。如此以来,interface有了方法实现,Java即可实现多继承,Java一贯提倡不支持多继承,为什么这次妥协了呢?

因为interface太过依赖于他们的实现类了,要往interface中添加一个方法就必须修改所有它的实现类。Java 8中为了配合增加的Lambda表达式特性需要修改java.util包的接口来添加方法,试想一下如果没有默认方法的话,是不是要修改所有集合类的实现啊。

List> list = …

list.forEach(…);

所以,在不破坏继承关系的前提下,引入“虚拟扩展方法”的概念,在接口中添加默认方法的实现,这也是很聪明的,虽然Java语言在被设计的时候一直强调不支持多继承,看来这次也是没有办法的了,Java也变得越来越像C++了。

interface Person {

// adds a java 8 default method

default void sayHello() {

System.out.println("Hello");

}

}

class Sam implements Person {

}

new Sam().sayHello();

interface Person {

// adds a java 8 default method

default void sayHello() {

System.out.println("Hello");

}

}

interface Male {

default void sayBye() {

System.out.println("Bye");

}

}

class Sam2 implements Person, Male {

}

new Sam2().sayHello();

new Sam2().sayBye();

interface Person {

// adds a java 8 default method

default void sayHello() {

System.out.println("Hello");

}

}

interface Male {

default void sayHello() {

System.out.println("Hi");

}

}

class Sam2 implements Person, Male {

// override the sayHello to resolve ambiguity

public void sayHello() {

Male.super.sayHello();

}

}

除过以前的那些区别外,带有默认方法的interface和抽象类的区别:

抽象类是有个状态的,它可以有构造函数和成员变量

抽象类不能用于lambda表达式中

默认方法不能覆盖 equals, hashCode, toString 方法!!!

原因可以参考Brian Goetz给出的回答:Allow default methods to override Object's methods

http://viralpatel.net/blogs/java-8-default-methods-tutorial/

http://zeroturnaround.com/rebellabs/java-8-explained-default-methods/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值