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. ...
随机推荐
- 线程---Day22
并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生) 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单CPU系 ...
- Python基础9
Anacanda软件内更新的方法,而不是每次重装整个软件, 整体更新,省时省力. 但仍要掌握单个包更新的方法.
- 在centos下安装rar解压.rar压缩包
CentOS本身不自带rar环境,因此对于rar文件无法直接解压,需要先配置rar环境. 首先需要确定自己的系统是64位还是32位的,通过这个命令: [root@localhost]# uname - ...
- Apache ActiveMQ 远程代码执行漏洞 (CVE-2016-3088) 复现
漏洞复现 直接写 shell 写 shell 的话,需要写在 admin 或者 api 中,也就是需要登录,没有密码的话完成不了写 shell 操作. 该环境默认的口令为 admin/admin. 访 ...
- Android 中发送邮件
第一步.导入第三方jar包 Android实现发送邮件,首先需要依赖additional.jar.mail.jar和activation.jar这3个jar包. Google提供了下载地址:https ...
- Model 中的Meta类选项
通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model): bar = models.CharFi ...
- HDU 2612 Find a way 题解
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- MyBatisSystemException 【exception】
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: ...
- Hibernate框架学习1
框架是什么 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架可以理解成是一个半成品的项目.只要懂得如何驾驭这些功能即可. orm ...
- ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试MQTT连接阿里云物联网平台
前言 这节看一下在阿里云上实现MQTT通信是个怎样的流程 看了很多网上的教程,感觉讲的迷迷糊糊.... 其实感觉他们是对MQTT不够透彻,所以写的文章就是个比着葫芦画瓢的感觉 在我面前这东西就是玩具. ...