[Java SE]Java8新特性——默认方法
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新特性——默认方法的更多相关文章
- java8新特性-默认方法
作为一个java程序猿,经常会被问基础怎么样,对于这个问题,我理解的有两方面:一是对于java基础的理解和掌握,比如JDK的相关特性:二是工作的经历,毕竟,语言编程是一门实战性质的艺术,就算掌握了千万 ...
- Java8 新特性 默认方法
默认方法为什么出现 默认方法的出现是因为在java8设计的过程中,因为加入了Lamdba表达式,和函数式接口,所以在非常多的接口里面要加入新的方法,但是如果在接口里面直接加入新的方法,那么以前写的所有 ...
- java8新特性- 默认方法 在接口中有具体的实现
案例分析 在java8中在对list循环的时候,我们可以使用forEach这个方法对list进行遍历,具体代码如下demo所示 public static void main(String[] arg ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
- Java8新特性之方法引用&Stream流
Java8新特性 方法引用 前言 什么是函数式接口 只包含一个抽象方法的接口,称为函数式接口. 可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即:非运行 ...
- 【Java】Java8新特性
文章目录 Java8新特性 Lambda表达式的使用 语法格式一:无参,无返回值 语法格式二:Lambda 需要一个参数,但是没有返回值. 语法格式三:数据类型可以省略,因为可由编译器推断得出,称为& ...
- Java SE 6 新特性: Java DB 和 JDBC 4.0
http://www.ibm.com/developerworks/cn/java/j-lo-jse65/index.html 长久以来,由于大量(甚至几乎所有)的 Java 应用都依赖于数据库,如何 ...
- Java SE 6 新特性: 对脚本语言的支持
2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Musta ...
- Java SE 6 新特性: HTTP 增强--转
概述 Java 语言从诞生的那天起,就非常注重网络编程方面的应用.随着互联网应用的飞速发展,Java 的基础类库也不断地对网络相关的 API 进行加强和扩展.在 Java SE 6 当中,围绕着 HT ...
- Java SE 6 新特性: 编译器 API
新 API 功能简介 JDK 6 提供了在运行时调用编译器的 API,后面我们将假设把此 API 应用在 JSP 技术中.在传统的 JSP 技术中,服务器处理 JSP 通常需要进行下面 6 个步骤: ...
随机推荐
- div 自动滚轮2
HTML: <div class="cal_bottom" style="height:78%;margin-top:2%;overflow:auto;" ...
- 最重要的Git命令行
git命令行记录 Git 如何删除本地分支和远程分支 git checkout master git branch -a git push origin --delete dev 删除后,再次查看分支 ...
- django_url反向解析
**************************************************************************************************** ...
- jdbc连接数据库access denied for user 'root'@'localhost'(using password:YES)
navicat可以进行连接,一般原因为mysql未启用远程连接 以下为解决方案 解决方法-更新用户加密方式: MySQL [mysql]> ALTER USER 'root'@'%' IDENT ...
- linux-minicom
q:只能发送不能接收 a:串口设置,硬件流控制=>NO
- nacos启停脚本
nacosServer.sh #!/bin/bash #auther by wangxp PWD=`pwd` #配置java环境变量 JAVA_HOME=/u01/java_home/jdk1.8.0 ...
- CV入坑
https://www.cnblogs.com/fldev/p/14360149.html
- 【Access】清空数据并重置自增主键
DELETE FROM tasks ALTER TABLE tasks ALTER COLUMN id COUNTER(1,1)
- 如何优化MySQL
1.MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化? a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率.b. 选择合适的表字段数据类型和存储 ...
- 用javassist和CGLIB 解决JDK动态代理的缺陷
用 javassist 解决 JDK 动态代理的缺陷 JDK动态代理的缺陷 要求目标类必须实现接口,否则产生不了代理.有些场景下,目标类也要产生代理类但是木有实现接口,这个时间 Java 中有两个常 ...