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 SE]Java8新特性——默认方法的更多相关文章

  1. java8新特性-默认方法

    作为一个java程序猿,经常会被问基础怎么样,对于这个问题,我理解的有两方面:一是对于java基础的理解和掌握,比如JDK的相关特性:二是工作的经历,毕竟,语言编程是一门实战性质的艺术,就算掌握了千万 ...

  2. Java8 新特性 默认方法

    默认方法为什么出现 默认方法的出现是因为在java8设计的过程中,因为加入了Lamdba表达式,和函数式接口,所以在非常多的接口里面要加入新的方法,但是如果在接口里面直接加入新的方法,那么以前写的所有 ...

  3. java8新特性- 默认方法 在接口中有具体的实现

    案例分析 在java8中在对list循环的时候,我们可以使用forEach这个方法对list进行遍历,具体代码如下demo所示 public static void main(String[] arg ...

  4. 乐字节-Java8新特性之方法引用

    上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...

  5. Java8新特性之方法引用&Stream流

    Java8新特性 方法引用 前言 什么是函数式接口 只包含一个抽象方法的接口,称为函数式接口. 可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即:非运行 ...

  6. 【Java】Java8新特性

    文章目录 Java8新特性 Lambda表达式的使用 语法格式一:无参,无返回值 语法格式二:Lambda 需要一个参数,但是没有返回值. 语法格式三:数据类型可以省略,因为可由编译器推断得出,称为& ...

  7. Java SE 6 新特性: Java DB 和 JDBC 4.0

    http://www.ibm.com/developerworks/cn/java/j-lo-jse65/index.html 长久以来,由于大量(甚至几乎所有)的 Java 应用都依赖于数据库,如何 ...

  8. Java SE 6 新特性: 对脚本语言的支持

    2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Musta ...

  9. Java SE 6 新特性: HTTP 增强--转

    概述 Java 语言从诞生的那天起,就非常注重网络编程方面的应用.随着互联网应用的飞速发展,Java 的基础类库也不断地对网络相关的 API 进行加强和扩展.在 Java SE 6 当中,围绕着 HT ...

  10. Java SE 6 新特性: 编译器 API

    新 API 功能简介 JDK 6 提供了在运行时调用编译器的 API,后面我们将假设把此 API 应用在 JSP 技术中.在传统的 JSP 技术中,服务器处理 JSP 通常需要进行下面 6 个步骤: ...

随机推荐

  1. PyQt5 & PySide2信号与槽机制1

    pyside2&pyqt5的信号与槽机制 1.信号与槽的两种写法 第一种情况: from PySide2 import QtWidgets, QtCore import sys if __na ...

  2. unity shader 描边

    https://zhuanlan.zhihu.com/p/66282034   这个是将整个模型放大 在世界坐标操作 https://blog.csdn.net/ToToTofu/article/de ...

  3. python跨文件之全局变量

    Python中的global关键字,你了解吗? - 知乎 (zhihu.com)  global 关键字 python跟C不一样,c是在一个文件定义后在另一个文件声明下是extern变量就好.pyth ...

  4. 线上Java调优-Arthas入门

    1.SSH连接目标主机,找到对应容器ID docker ps | grep eam 2.进入容器,并启用bash docker exec -it 01c6ab243ff4 /bin/bash 3.按A ...

  5. junit单元测试踩过的坑

    1.测试方法不能直接获取到系统初始化的配置信息,需要专门读取 2.单元测试多线程子线程不执行,不会像主线程一样等待子线程退出而退出, 会直接退出. . https://blog.csdn.net/yu ...

  6. MSVC设置版本

    MSVC设置版本 在开发QT时,由于QT 5.12与MSVC 2017兼容,因此需要用MSVC 2017来编译使用QT 5.12的程序. 1 安装MSVC 2017 由于笔者电脑上安装的Visual ...

  7. PHP精度计算函数

    bcadd - 将两个高精度数字相加 bccomp - 比较两个高精度数字,返回-1, 0, 1 bcdiv - 将两个高精度数字相除 bcmod - 求高精度数字余数 bcmul - 将两个高精度数 ...

  8. 摘记:找到程式中 不會被執行到的 code

    定义 https://en.wikipedia.org/wiki/Unreachable_codeRemove unreachable code refactoringhttps://docs.mic ...

  9. cmd查看对应端口使用情况

    cmd查看端口号netstat -ano | findstr 80

  10. Solon2 分布式事件总线的技术价值?

    分布式事件总线在分布式开发(或微服务开发)时,是极为重要的架构手段.它可以分解响应时长,可以削峰,可以做最终一致性的分布式事务,可以做业务水平扩展. 1.分解响应时长 比如我们的一个接口处理分为四段代 ...