[Java SE]Java8新特性——默认方法

2023-06-13,,

1 简述

默认方法就是接口可以有实现方法,而且可以不需要实现类去实现其方法

默认方法(default void hello()) := 一个在接口里面有了一个(默认)实现的方法

1. 子类优先继承父类的方法。
如果父类没有相同签名的方法:
#1 子类才继承接口的默认方法;
#2 若子类实现了2个及以上的相同签名默认方法的接口时:
在子类中必须/强制 Override(重写) 默认方法; 否则,报编译错误
(因为:此时编译器无法判别,该调用哪个接口的默认方法)
如果父类中存在相同签名的方法:
#1 子类继承父类相同签名的方法;
#2 不论何种情况:
子类中不必再强制 Override(重写) 默认方法

为什么要有这个特性?

首先,之前的接口是个双刃剑。
好处是,面向抽象而不是面向具体编程;
缺陷是,当需要修改接口时候,需要修改全部实现该接口的类。 [针对其缺陷]
目前的 java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是: 在JDK里给相关的接口添加新的方法及实现。
然而,对于已经发布的版本,没法在给接口添加新方法的同时,不影响已有的实现。
所以,引进的默认方法。其目的是: 为了解决接口的修改与现有的实现不兼容的问题。

易错的使用场景:继承 或 实现具有相同默认方法的父类或接口问题

2 代码示例

interface A

public interface A {
String hi();
String greet();
default void hello() {
System.out.println("A.hello");
}
}

interface B

public interface B {
String hi();
String hh();
default void hello() {
System.out.println("B.hello");
}
}

class D

public class D {
public void hello() {//与接口 A / B 存在相同签名的方法
System.out.println("D.hello");
}
}

class C

情况1: public class C extends D implements A, B

public class C extends D implements A, B{
@Override
public String hi() {
return "C.hi";
}
@Override
public String greet() {
return "C.greet";
}
@Override
public String hh() {
return "C.hh";
}
/*
默认方法(default void hello()) := 一个在接口里面有了一个实现的方法
1. 子类优先继承父类的方法。
如果父类没有相同签名的方法:
#1 子类才继承接口的默认方法;
#2 若子类实现了2个及以上的相同签名默认方法的接口时:
在子类中必须/强制 Override(重写) 默认方法; 否则,报编译错误
如果父类中存在相同签名的方法:
#1 子类继承父类相同签名的方法;
#2 不论何种情况:
子类中不必再强制 Override(重写) 默认方法
*/
/**
* 重写 默认方法
* 若子类不处理默认方法hello时,类C将编译出错,解决方式: 要么重新覆盖,要么指定实现父接口的该方法
* 编译报错解决1:完全覆盖法
*/
/* @Override
public void hello() {
System.out.println("C.hello");
}*/
/**
* 重写 默认方法
* 编译报错解决2:指定实现的父接口
*/
/* @Override
public void hello() {
A.super.hello();
B.super.hello();
}*/
}

情况2: public class C implements A, B
情况3: public class C implements A

X 参考文献

java8 lambda表达式 - 博客园
Java 8 新特性——默认方法 – 菜鸟教程

[Java SE]Java8新特性——默认方法的相关教程结束。

《[Java SE]Java8新特性——默认方法.doc》

下载本文的Word格式文档,以方便收藏与打印。