二、Java 8特性 深入解析默认方法

xiaoxiao2025-07-16  14

一、定义

什么是默认方法,为什么要有默认方法:

简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。 

简单的例子

一个接口A,Clazz类实现了接口A。

public interface A {     default void foo(){        System.out.println("Calling A.foo()");     } }    public class Clazz implements A {     public static void main(String[] args){        Clazz clazz = new Clazz();        clazz.foo();//调用A.foo()     } }

 

代码是可以编译的,即使Clazz类并没有实现foo()方法。在接口A中提供了foo()方法的默认实现。

java 8抽象类与接口对比

这一个功能特性出来后,很多同学都反应了,java 8的接口都有实现方法了,跟抽象类还有什么区别?其实还是有的,请看下表对比。。

相同点不同点

1.都是抽象类型;

2.都可以有实现方法(以前接口不行);

3.都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)

1.抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);

2.抽象类和接口所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,接口表示的是"like-a"关系;

3.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

多重继承的冲突说明

由于同一个方法可以从不同接口引入,自然而然的会有冲突的现象,默认方法判断冲突的规则如下:

1.一个声明在类里面的方法优先于任何默认方法(classes always win)

2.否则,则会优先选取最具体的实现,比如下面的例子 B重写了A的hello方法。

输出结果是:Hello World from B

多重继承的冲突说明

由于同一个方法可以从不同接口引入,自然而然的会有冲突的现象,默认方法判断冲突的规则如下:

1.一个声明在类里面的方法优先于任何默认方法(classes always win)

2.否则,则会优先选取最具体的实现,比如下面的例子 B重写了A的hello方法。

输出结果是:Hello World from B

查看原文

转载请注明原文地址: https://www.6miu.com/read-5033190.html

最新回复(0)