[Java SE]Java8新特性——默认方法
2023-09-27 14:24:41 时间
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 参考文献
相关文章
- Java 循环结构 - for, while 及 do...while
- mysql错误:java.sql.SQLException: The server time zone value ‘xxx‘ is unrecognized or represents 解决方法
- 利用Java中的现有方法实现对集合元素进行排序
- 【Harmony OS】【JAVA UI】鸿蒙怎么实现无限轮播功能
- 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)
- Java实现数组反转翻转的方法
- Java程序监控指标
- java 流
- Java 8 + 10 = Java 18
- Java 8新特性——default方法(defender方法)介绍
- java中相同名字不同返回类型的方法
- java中方法的递归调用
- tomcat+java的web程序持续占cpu问题调试
- 一些关于Java的琐碎知识点
- Java 位运算符 深入理解
- java完美equals方法代码段
- Java小白入门200例11之求最小值