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. 一键搭建dns

    #!/bin/bash DOMAIN=wang.orgHOST=wwwHOST_IP=10.0.0.100LOCALHOST=`hostname -I | awk '{print $1}'` . /e ...

  2. char和int的类型转换

    char类型是16位的,底层采用unicode编码保存.char类型是可以直接赋值给int类型的,因为是16位到32位低到高.举个例子比如int i='1';打印i的值是49.char类型跟int类型 ...

  3. SpringIOC以及AOP注解开发

    和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作. 本质上:所有一切的操作都是 Java ...

  4. centos7 安装 elasticsearch 7.15

    下载 elasticsearch wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.2-linu ...

  5. Windows 解决teamview远程必须mstsc连接

    真实原因是你的TeamViewer一直在用远程桌面的ID进行登录,所以一旦远程桌面断开,TeamViewer就无法连接了.因此我们只需要切换为服务器的TeamViewer ID即可,服务器的TeamV ...

  6. python,数据类型和变量,数据类型和变量,集合,字符串拼接

    可不可变: 可变:列表,字典 不可变:字符串,数字,元祖 访问顺序: 直接访问:数字 顺序访问:字符串,列表,元祖 映射:字典 存放元素个数 容器类型:列表,元祖,字典 原子:数字,字符串 集合 1. ...

  7. OSS 解锁

    一.解开LSKEYF00的编辑锁定  进入SE30,点击Tips & Tricks按钮,输入以下代码     UPDATE PROGDIR SET EDTX = ''       WHERE ...

  8. vue中小写数字转大写汉字

    numTocoggle(money){ //汉字的数字 var cnNums = new Array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖') ...

  9. stm32 USART

    stm32 USART 1 USART基础知识 三种模式:轮询模式.中断模式.DMA模式 轮询模式属于阻塞模式 中断模式和DMA模式属于非阻塞模式 发送数据 接收数据 1.1 Polling mode ...

  10. JSP基础语法笔记一

    JSP是一种脚本语言. 代码片段,方法内容: <% 代码片段 %> <jsp:scriptlet> 代码片段 </jsp:scriptlet> 设置编码格式,正常显 ...