Java8 新特性 默认方法
默认方法为什么出现
默认方法的出现是因为在java8设计的过程中,因为加入了Lamdba表达式,和函数式接口,所以在非常多的接口里面要加入新的方法,但是如果在接口里面直接加入新的方法,那么以前写的所有的当前接口的现在类,全部都要加上新的实现。那么这对以前等于说就不兼容了,所以当时就产生了默认方法(Default Methods),默认方法就是为了解决这个问题的。
默认方法是什么
默认方法就是接口里面可以有实现的方法,并且不需要实现类去实现其方法。并且默认方法允许你添加新的方法到现在的接口中,并且确保与旧版本的兼容性。
默认方法怎么用
默认方法就是在接口签名前面加入default关键字就是默认方法了。
一个简单的小例子
public interface Test {
default void sout() {
System.out.println("调用Test里面的默认方法!");
}
}
- 实现类自动继承接口的默认方法,并且不用实现默认方法,就可以直接调用
public class TestDefaultMethod{
public static void main(String[] args) {
test1 test1 = new test1();
test1.sout();
}
}
class test1 implements Test{
}
输出:调用Test里面的默认方法!
- 默认方法也可以重写
class test1 implements Test{
@Override
public void sout() {
System.out.println("默认方法也可以继承!");
}
}
并且就像你用List集合的Foreach方法一样,也是Iterable里面的默认方法,List集合就可以直接调用而不用自己实现。
//Iterable类里面的默认方法
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
//集合直接调用,并且List里面并没有这个方法,他是继承自Iterable类的
list.forEach(System.out::println);
- 实现多个接口的时候,且有相同方法的调用问题的解决
public class TestDefaultMethod {
public static void main(String[] args) {
IntTest test = new test();
test.sout();
}
}
interface IntTest {
default void sout() {
System.out.println("调用Test里面的默认方法!");
}
static void syso() {
System.out.println("调用Test里面的静态方法!");
}
}
interface IntTest2 {
default void sout() {
System.out.println("调用Test2里面的默认方法!");
}
}
class test implements IntTest, IntTest2 {
public void sout() {
IntTest2.super.sout();
IntTest.super.sout();
IntTest.syso();
System.out.println("本方法里面的输出!");
}
}
可以看一下,这里面有两个接口,并且两个接口中都有sout方法,然后test把两个都实现了,但是如果只调用一个方法,会报错,所以想要调用接口里面的默认方法就可以用接口名.super.方法名。用这个方法不会出现冲突。
并且上面还有一个新特性,接口可以声明静态方法 并且有实现类。
上面的代码中已经用到了:
static void syso() {
System.out.println("调用Test里面的静态方法!");
}
- 还有就是接口和抽象类的比较
这里有一个更加好的抽象类和接口的比较 https://www.cnblogs.com/sidesky/p/9287710.html
下面是接口和实现类的对比:
1、接口可以被类多实现(被其他接口多继承),抽象类只能被单继承。
2、接口中没有 this指针,没有构造函数,不能拥有实例字段(实例变量)或实例方法,无法保存 状态(state),抽象方法中可以。
3、抽象类不能在 java 8 的 lambda 表达式中使用。
4、从设计理念上,接口反映的是 “like-a” 关系,抽象类反映的是 “is-a” 关系。
本篇文章的引用:
Java 8 (8) 默认方法
Java 8 默认方法(Default Methods)
Java 8 默认方法(菜鸟教程)
细节决定成败!
个人愚见,如有不对,恳请扶正!
Java8 新特性 默认方法的更多相关文章
- java8新特性-默认方法
作为一个java程序猿,经常会被问基础怎么样,对于这个问题,我理解的有两方面:一是对于java基础的理解和掌握,比如JDK的相关特性:二是工作的经历,毕竟,语言编程是一门实战性质的艺术,就算掌握了千万 ...
- java8新特性- 默认方法 在接口中有具体的实现
案例分析 在java8中在对list循环的时候,我们可以使用forEach这个方法对list进行遍历,具体代码如下demo所示 public static void main(String[] arg ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
- Java8新特性之方法引用&Stream流
Java8新特性 方法引用 前言 什么是函数式接口 只包含一个抽象方法的接口,称为函数式接口. 可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即:非运行 ...
- 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)
方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...
- Java8新特性 -- Lambda 方法引用和构造器引用
一. 方法引用: 若Lambda体中的内容有方法已经实现了,我们可以使用“方法引用” 要求 方法的参数和返回值类型 和 函数式接口中的参数类型和返回值类型保持一致. 主要有三种语法格式: 对象 :: ...
- Java8新特性之方法引用
<Java 8 实战>学习笔记系列 定义 方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它,可以把方法引用看作针对仅仅涉及单一方法的Lambda的语法糖,使用它将减少自己 ...
- 2020你还不会Java8新特性?
Java8(1)新特性介绍及Lambda表达式 前言: 跟大娃一块看,把原来的电脑拿出来放中间看视频用 --- 以后会有的课程 难度 深入Java 8 难度1 并发与netty 难度3 JVM 难度4 ...
- Java8 新特性_Lambda 表达式
1. Java8新特性_简介 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 减少空指针异常的容器 Optional 2. ...
随机推荐
- PIE SDK栅格矢量化算法
1.算法功能简介 栅格数据矢量化较为复杂,如果由一幅扫描的数字化地图来建立矢量数据库,则需要经过数字图象处理,如边缘增强.细化.二值化.特征提取及模式识别才能获得矢量数据.人们通常将多色地图分色后逐个 ...
- Windows怎么安装配置Elasticsearch
进入Elasticsearch官网,点击Download,Elasticsearch默认端口9200 然后进入下图:有各种版本,我选择windows版本 下载之后,解压得到Elasticsearch文 ...
- linux系统shell基础知识入门二
条件判断语句 test或[],这两是等价的.但用[]这种可能看起来更简洁 必须在[符号和检查条件之间留出空格,而test命令之后也总是应该有一个空格 如果要把test 和then 放一行上,那么必须在 ...
- python 学习之 基础篇三 流程控制
前言: 一. python中有严格的格式缩进,因为其在语法中摒弃了“{}”来包含代码块,使用严格的缩进来体现代码层次所以在编写代码的时候项目组要严格的统一器缩进语法,一个tab按键设置为四个空格来缩进 ...
- linux sed、awk、grep同时匹配多个条(并且 or 或者)
同时匹配ABC 和 abc: sed -n '/ABC/{/abc/p}' awk '/ABC/&&/abc/{ print $0 }' grep -E '(ABC.*abc|abc. ...
- SpringBoot自动装配原理解析
本文包含:SpringBoot的自动配置原理及如何自定义SpringBootStar等 我们知道,在使用SpringBoot的时候,我们只需要如下方式即可直接启动一个Web程序: @SpringBoo ...
- 前端Q的小小小里程碑
很多关注我的人都不太了解前端Q这个名字的由来,这篇文章就来讲讲前端Q的前世今生,顺便送大大福利(文末有惊喜),哈哈-- 恭喜!前端Q总用户数突破千啦~~ 前端Q前世 前端Q这个公众号,其实很早很早的时 ...
- js中的原型,原型链和继承
在传统的基于Class的语言如Java.C++中,继承的本质是扩展一个已有的Class,并生成新的Subclass. 由于这类语言严格区分类和实例,继承实际上是类型的扩展.但是,JavaScript最 ...
- element表格的滚动条在合计上边
默认滚动条是在下边的,不好看,这里改一下 修改样式.完美解决: .el-table { overflow-x: auto; } .el-table__header-wrapper, .el-table ...
- sqli-libs笔记Page-1(Basic Challenges)
0X00:前言 sqli-libs是一个学习SQL注入的开源平台,共有75中不同类型的注入.源码可到github上搜索sqli-libs找到 0X01:Page-1基础挑战 0X02:每一关的payl ...