Java 8 基础教程 - 默认方法
时间:2022-06-04
本文章向大家介绍Java 8 基础教程 - 默认方法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
什么是默认方法
正如其名,在Java 8中,默认方法就是使用default关键字标记的定义在接口中的方法。如果子类不重写这些方法,那么在子类调用这些方法的时候会直接调用接口中的默认方法。其形式如下:
public interfce Moveable{
default void move(){
System.out.println("move");
}
}
子类继承接口,无需重写这个方法即可调用
public class Animal implements Moveable{
public static void main(String[] args){
Animal tiger = new Animal();
tiger.move();
}
}
输出:
Move
如果子类想要重写这个默认方法,只需要和普通的重写接口一样
public class Animal implements Moveable{
public void move(){
System.out.println("I am running");
}
public static void main(String[] args){
Animal tiger = new Animal();
tiger.move();
}
}
使用默认方法的好处:
- 定义静态默认方法:在接口中定义静态默认方法,使得其所有继承接口的子类都可以调用这些静态方法,这样可以在接口中集中静态方法,其子类都可以分享,而无需将静态方法分开定义。
- 提供兼容性,如果已经发布的接口想要添加新的方法,只需要添加默认方法即可,子类无需做出任何改变。
为什么在Java 8 要引入默认方法
最简单的回单就是,为了支持Lambda表达式。因为Java 8中引入了Lambda表达式,所以很多Java的核心类都需要修改以便使用新的Lambda表达式,但是一些类例如,java.util.List,不仅仅是不JDK的类实现,同样被很多第三方的库继承,如果修改了java.util.List 接口,那么其他所有的第三方库都必须重新实现这些方法,最终导致无法兼容。所以就引入了默认方法。例如:java.lang.Iterable,添加的新方法。
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
使用
import java.util.ArrayList;
import java.util.List;
public class Animal implements Moveable{
public static void main(String[] args){
List<Animal> list = new ArrayList();
list.add(new Animal());
list.add(new Animal());
list.add(new Animal());
//Iterator code reduced to one line
list.forEach((Moveable p) -> p.move());
}
}
添加的默认方法,其所有的子类都默认继承,而无需重写。
默认方法继承发生冲突如何解决
在Java中接口是可以多继承的,当一个类继承多个接口,但是默认方法相同是处理的原则是:
- 如果子类覆盖,直接调用子类方法
- 如果函数有相同的签名,选择更加明确的默认方法,例如,Moveable和Walkable,Walkable继承与Moveable,那么就选择Walkable中的默认方法。
- 如果两个接口平级,没有继承关系,编译器报错。这个时候可以通过制定执行某个方法来确定
Walkable.super.move();
//or
Moveable.super.move();
- Linux基础(day64)
- 我的WCF之旅(9):如何在WCF中使用tcpTrace来进行Soap Trace
- 物联网设备已沦陷,咖啡机也不能例外
- 我的WCF之旅(13):创建基于MSMQ的Responsive Service
- 开发自己的Data Access Application Block[上篇]
- 18.9/18.10 LVS NAT模式搭建
- 谈谈WCF中的Data Contract (1):Data Contract Overview
- Linux基础(day66)
- 字符串的驻留(String Interning)
- 19.5 忘记Admin密码如何做
- 19.3/19.4/19.6 安装zabbix
- 欲火焚身,心静则凉--只靠冲动是不能长久地
- 深入理解C#3.x的新特性(4):Automatically Implemented Property
- 增加网卡注意点
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- python判断是空的实例分享
- keras绘制acc和loss曲线图实例
- 基于Python实现2种反转链表方法代码实例
- Python smtp邮件发送模块用法教程
- Python3基于print打印带颜色字符串
- Python StringIO及BytesIO包使用方法解析
- PHP设计模式之PHP迭代器模式讲解
- 简单实用的PHP文本缓存类实例
- Keras 实现加载预训练模型并冻结网络的层
- Django-imagekit的使用详解
- Python类super()及私有属性原理解析
- Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
- 简单了解Python多态与属性运行原理
- 树莓派升级python的具体步骤
- keras中的loss、optimizer、metrics用法