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 Alpha通道数据渲染
1. 功能简介 在计算机图形学中,一个RGB颜色模型的真彩图形,用由红.绿.蓝三个色彩信息通道合成的,每个通道用了8位色彩深度,共计24位,包含了所有彩色信息.为实现图形的透明效果,采取在图形文件的 ...
- Java内功心法,创建型设计模式包括哪些
1. 单例(Singleton) Intent 确保一个类只有一个实例,并提供该实例的全局访问点. Class Diagram 使用一个私有构造函数.一个私有静态变量以及一个公有静态函数来实现. 私有 ...
- 左右对齐Justify遇到的坑
遇到的问题 这两天在开发一个病历的对外展示页面,设计稿上label是左右拉伸对齐的,显示效果如下: 怎么实现这种效果呢? 首先想到的是文字中间加空格,但是这种方式太low了,而且不太容易控制.网上查资 ...
- CSS和层叠
##常见的CSS属性## color:red 设置元素内容的颜色 <br>text-align:center 设置文字的对齐方式(例:centeer 居中) <br>fon ...
- Spring MVC + CXF实现webservice接口
本来都是WebAPI/RestfulAPI接口对外提供接口的,突然有个需求要提供WebService接口,本想着Spring和CXF这么成熟的两个产品,这么的也整不出什么幺蛾子来啊. 结果还真是出了几 ...
- jQuery实现的全选、反选和获取当前所有选中的值功能
链接: jQuery实现的全选.反选和获取当前所有选中的值功能 <ul id="list"> <li><label><input type ...
- ELK日志系统之说说logstash的各种配置
当我们在设置配置logstash的conf文件内容时,日志数据的来源有以下几种配置: tcp形式:一个项目或其他日志数据来源用tcp协议的远程传输方式,将日志数据传入logstash input { ...
- Linux自有服务(1)-Linux从入门到精通第五天(非原创)
文章大纲 一.运行模式二.用户与用户组管理(重点)三.网络设置四.ssh服务(重点)五.学习资料下载六.参考文章 自有服务,即不需要用户独立去安装的软件的服务,而是当系统安装好之后就可以直接使用的 ...
- mysql日期存储格式int,timestarmp,datetime
int (1).4个字节存储,INT的长度是4个字节,存储空间上比datatime少,int索引存储空间也相对较小,排序和查询效率相对较高一点点 (2)可读性极差,无法直观的看到数据. TIMESTA ...
- Odoo视图的共有标签
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826405.html 1)name (必选) 通过name值,查找标签 2)model 与view相关联的 ...