Java8新特性default关键字,引出Java多继承问题
概述
最近在看JDK集合的源码时,在Collection接口中发现了default关键字,并且惊奇的发现接口中的方法居然包含方法体,这顿时让我产生兴趣,为此我也稍微研究了一下default关键字。
很多同学都知道Java在创立之初就摒弃了C++多继承的套路,因为它实在难以学习与使用,在Java的世界中类只能继承一个父类,但是一个接口可以继承多个接口,就比如这样:
public interface A {
void hello();
}
public interface B {
void hello();
}
public interface C extends A,B {
}
但是Java8的新特性也使得Java也拥有了多继承的问题,想要了解的小伙伴就继续往下看吧。
引入default关键字
大家都知道Java中的接口都是抽象方法,也就是没有方法体,但是从Java8开始,如果接口中的方法被default关键字修饰后就必须为其加上方法体。某个类在实现该接口时,就不会强制实现被default修饰的方法,因为在接口中已经写好了方法体。从Java8开始,接口就开始类似于抽象类了,它们都可以含有普通方法和抽象方法了,唯一不同的就是一个类只能继承一个抽象类,而一个类却能实现多个接口。
default关键字示例:
public interface A {
default void sayHello(){
System.out.print("A.Hello");
}
}
default关键字的意义:default关键字的意义,default的意思就是为接口方法提供默认的实现,它的最终目的就是减少子类实现接口的工作量,,如果多个子类实现的某个接口方法,方法体都是一样的,这就会导致后期维护上的困难,如果在接口中定义默认的实现,那么既减少了子类实现的接口的工作量,也为后期的维护提供了方便(只需要更改接口中的默认实现即可)。
多继承问题的引入
但是default关键字的出现也顺带为java带来了多继承的问题,我现在来举一个栗子:
现有两个接口,A和B,这两个接口都有一个方法sayHello,并且都使用default关键字修饰后使其拥有了方法体,但是现在有接口C需要同时继承A,B,代码如下:
public interface A {
default void sayHello(){
System.out.print("A.Hello");
}
}
public interface B {
default void sayHello(){
System.out.print("B.Hello");
}
}
public interface C extends A,B{
}
此时多继承的问题就展现出来了,到底C接口是继承A接口的sayHello方法,还是继承B接口的sayHello方法,这也就是Java多继承的源头,允许接口有方法体,并且接口之间可以多继承。(上面代码由于有多继承问题,编译会报错!!)
多继承问题的解决
Java给出的解决方案就是:在出现多继承问题的时候必须手动覆写冲突方法,这种方式可谓是简单出爆,但很好理解。手动覆写后编译器就不纠结到底继承哪个父类的方法了,也就解决了多继承问题。
子接口在手动覆写父接口方法时可以手动调用冲突方法,调用格式如下:
public interface A {
default void sayHello(){
System.out.print("A.Hello");
}
}
public interface B {
default void sayHello(){
System.out.print("B.Hello");
}
}
public interface C extends A,B{
@Override
default void sayHello() {
A.super.sayHello();
}
}
public class Test impements A.B {//类的多实现本质上就是多继承
@Override
default void sayHello() {//因为接口A和接口B中的默认方法冲突,所以必须手动实现sayHello方法
A.super.sayHello();
}
}
另一种多继承
public interface A {
default void sayHello(){
System.out.print("A.Hello");
}
}
public interface B extends A{
default void sayHello(){
System.out.print("B.Hello");
}
}
public class Test impements A.B {
}
在上述代码中,接口B继承了接口A,如果Test类实现A,B接口是不存在冲突的,实际上在实际开发中通常也不会这个写,因为既然B继承了A接口,那么在实现的时候直接实现B接口就行了,显示实现A接口没有任何意义。
拓展:Java8的接口可以拥有静态方法
可以参考博主另一篇文章:《Java8新特性——接口静态方法》
走过路过不要错过,原创不易,帮忙点个赞撒!!!!
Java8新特性default关键字,引出Java多继承问题的更多相关文章
- Java8 新特性default
在JDK1.8的Iterator接口中 package java.util; import java.util.function.Consumer; public interface Iterator ...
- Java基础之java8新特性(1)Lambda
一.接口的默认方法.static方法.default方法. 1.接口的默认方法 在Java8之前,Java中接口里面的默认方法都是public abstract 修饰的抽象方法,抽象方法并没有方法实体 ...
- 【Java】Java8新特性
文章目录 Java8新特性 Lambda表达式的使用 语法格式一:无参,无返回值 语法格式二:Lambda 需要一个参数,但是没有返回值. 语法格式三:数据类型可以省略,因为可由编译器推断得出,称为& ...
- Java8新特性(一)_interface中的static方法和default方法
什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...
- 【Java基础】Java8 新特性
Java8 新特性 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).使用它可以写出更简洁.更灵活的代码. L ...
- Java系列 - 用Java8新特性进行Java开发太爽了
本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome/ 前言 从开始写博客到现在已经过去3个 ...
- java8新特性全面解析
在Java Code Geeks上有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Java ...
- Java8新特性【转】
地址:http://ifeve.com/java-8-features-tutorial/ 1.简介 毫无疑问,Java 8是自Java 5(2004年)发布以来Java语言最大的一次版本升级,Ja ...
- Java8新特性
Java8新特性 Java8主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等. 1.函数式接口 Java 8 引入 ...
- 干货 | Java8 新特性教程
本教程翻译整理自 https://github.com/winterbe/java8-tutorial 本教程首发自个人网站: https://www.exception.site/java8/jav ...
随机推荐
- 重新整理 .net core 实践篇———承载[外篇]
前言 简单介绍一下承载. 正文 名称叫做承载,其实就是.net core 定义的一套长期运行的服务的规范. 这个服务可以是web服务,也可以是其他服务,比如tcp,或者一些监控服务. 这里以监控服务为 ...
- ActiveMQ C#消息队列系列一(安装)
前言 我前面写过ActiveMQ 如何在windows 上安装,但是呢,一般公司都是在Linux 上跑的,所以就来安装一下吧. 正文 1.进入官网下载linux 版本. 2.然后放置到Linux上. ...
- 实训篇-Html-超链接练习
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Effective Python:简介
作者:布雷特·斯拉特金 本书的大部分范例代码都遵循Python 3.7版本的语法规范,Python 3.7发布于2018年6月.另外,书里还会给出一些采用Python 3.8语法规范所写的范例,让大家 ...
- TypeScript 中类的理解?应用场景?
一.是什么 类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础 ❝ 类是一种用户定义的引用数据类型,也称类类型 ❞ 传统的面向对象语 ...
- Jenkins实战系列(一)——Jenkins简介
Jenkins是一个开源的自动化构建工具,可以帮助开发人员自动构建.测试和部署软件.它支持多种编程语言.版本控制系统和构建工具,如Java.Git.Maven等.Jenkins的核心功能是通过一系列插 ...
- 【USENIX ATC】支持异构GPU集群的超大规模模型的高效的分布式训练框架Whale
简介: 高效大模型训练框架Whale(EPL)入选USENIX ATC 作者:张杰.贾贤艳 近日,阿里云机器学习PAI关于深度学习模型高效的分布式训练框架的论文< Whale: Efficien ...
- Apache Flink在 bilibili 的多元化探索与实践
简介: bilibili 万亿级传输分发架构的落地,以及 AI 领域如何基于 Flink 打造一套完善的预处理实时 Pipeline. 本文由 bilibili 大数据实时平台负责人郑志升分享,本次分 ...
- 阿里巴巴超大规模Kubernetes基础设施运维体系揭秘
简介:ASI:Alibaba Serverless infrastructure,阿里巴巴针对云原生应用设计的统一基础设施.ASI 基于阿里云公共云容器服务 ACK之上,支撑集团应用云原生化和云产品 ...
- Prometheus+Grafana+alertmanager构建企业级监控系统(二)
二.可视化UI界面Grafana的安装和配置 2.1 Grafana介绍 Grafana 是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通 知给告警接收方.它主要有以下 ...