java def_java 8 default关键字
java 8当中引入了一些新的特性,最近我们会陆续介绍这些特性,从default开始。
一直以来,我们有一个认识,interface当中是不能有方法实现的,但是从java 8开始,这个事变了,因为有了default这个关键字。直接来看一下代码:
public interfaceRichInterface {
default voidsayHello(){
System.out.println("Hello");
}
}
我们声明了一个RichInterface接口,在其中定义了一个sayHello方法,这个方法是有具体实现的。
然后,我们实现这个接口:
public classRichImpl implementsRichInterface {
public static voidmain(String[] args){
RichImpl ri = newRichImpl();
ri.sayHello();
}
}
我们不需要实现sayHello方法,而且可以直接使用它。
那么下一个问题,我可不可以override这个方法。
public classRichImpl implementsRichInterface {
public static voidmain(String[] args){
RichImpl ri = newRichImpl();
ri.sayHello();
}
@Overridepublic voidsayHello(){
System.out.println("Hello, I am RichImpl");
}
}
答案是肯定的。
继续下一个问题,java是不允许多重继承的,但是有了default这个关键字,貌似我们可以通过它来实现类似的多重继承。
再新建一个interface:
public interfaceRichInterface1 {
default voidsayByebye(){
System.out.println("Byebye");
}
}
同时实现这两个interface:
public classRichImpl implementsRichInterface, RichInterface1 {
public static voidmain(String[] args){
RichImpl ri = newRichImpl();
ri.sayHello();
ri.sayByebye();
}
}
很好,一切都跟我们想的一样。
继续~~~
如果2个interface有相同的default方法怎么办?
我们修改一下RichInterface1:
public interfaceRichInterface1 {
default voidsayByebye(){
System.out.println("Byebye");
}
default voidsayHello() {
System.out.println("Hello, Im another RichInterface");
}
}
这个时候,RichImpl一定会报错对不对(鬼知道我该用哪一个?),那么应该怎么办呢?没错,override一下就好了:
public classRichImpl implementsRichInterface, RichInterface1 {
public static voidmain(String[] args){
RichImpl ri = newRichImpl();
ri.sayHello();
}
@Overridepublic voidsayHello(){
System.out.println("Hello I am RichImpl");
}
}
继续~~~
我们可不可以在2个interface当中实现overload的效果,猜测是可以的,上代码:
public interfaceRichInterface {
default voidprintContent(String s){
System.out.println(s);
}
}
public interfaceRichInterface1 {
default voidprintContent(Double d){
System.out.println(d);
}
}
public classRichImpl implementsRichInterface, RichInterface1 {
public static voidmain(String[] args){
RichImpl ri = newRichImpl();
ri.printContent(0.0);
ri.printContent("0.0");
}
}
很好,一切都和我们的预想一样。
基本上,default的内容就这么多了,如果大家对scala有一定了解,或者读过我之前的scala基础的文章,会感觉,这个东西其实跟scala当中的trait有点像了,没错,而且,随着你越来越多的了解java 8的新特性,这样的感觉会经常出现的。