Java8新特性之接口defualt,static方法
简介
作用
Java8中接口引入了defualt,static两种方法提供默认实现,彻底打破了接口不能有默认实现的规定
- static
- 让接口类似于工具类,提供一些静态方法
- static方法不会被子类继承
- defualt
- 给接口加入了默认方法实现
- defualt方法会被子类继承
为什么
当我们写好一个库发布出去,很快收到了很多star,是不是开心的不行,可是有一天看到一个issue,确实最初有一个接口设计有缺陷,需要新加一个方法,这时怎么办呢?
- 直接在过去的接口中新增一个方法?
- 这是在犯罪!
- 使用defualt提供新增方法的默认实现?
- 没错,这就是defualt方法的重要运用场景,可以帮助我们向后兼容的同时,不断演进
影响
这一变动让接口和抽象类的区别越来越小了
- 一个类只能继承一个抽象类,但是可以实现多个接口
- 抽象类可以保存一些通用的成员属性,接口中不能有属性
也就是说除了我们需要抽象方法的同时还需要一些成员属性时我们使用抽象类,其他情况我们都应该使用接口。
同时我们应该发现这样一来Java也相当于有了部分多重继承的能力,那么我们会遇到臭名昭著的菱形继承问题么?让我们在实践中寻找答案
实践
static
工具接口
public interface Support {
static void weather(){
System.out.println("晴转多云");
}
}
public class Test {
public static void main(String[] args) {
Support.weather();
}
/**
* 输出:
* 晴转多云
*/
}
defualt
运动Sports接口,默认实现了打乒乓,然后Person实现这个接口
public interface Sports {
default void pingPong(){
System.out.println("打乒乓球");
}
}
public class Person implements Sports{
}
public class Test {
public static void main(String[] args) {
new Person().pingPong();
}
/**
* 输出:
* 打乒乓球
*/
}
多重继承
defualt的使用真的很简单,但是多重继承的情景下表现的如何呢,当多个接口有相同的方法时会如何执行呢,有三大规则,按顺序匹配,保证了可靠性。
规则1.类或者父类中声明的方法的优先级高于任何默认方法
我们新加一个接口有相同的函数签名
public interface Programs {
default void pingPong(){
System.out.println("观看乒乓球比赛");
}
}
然后再Person中提供具体实现
public class Person implements Sports{
@Override
public void pingPong() {
System.out.println("我在打乒乓球");
}
}
public class Chinese extends Person implements Programs, Sports{
}
public class Test {
public static void main(String[] args) {
new Chinese().pingPong();
}
/**
* 输出:
* 我在打乒乓球
*/
}
规则2.同函数签名的方法中实现得最具体的那个接口的方法
我们新增一个球类运动接口
public interface BallSports extends Sports{
@Override
default void pingPong() {
System.out.println("打乒乓球(球类运动)");
}
}
public class Person implements Sports, BallSports{
}
public class Test {
public static void main(String[] args) {
new Person().pingPong();
}
/**
* 输出:
* 打乒乓球(球类运动)
*/
}
规则3.显示声明
如果上面两条都不能满足,那就过不了编译需要我们显示声明怎么执行了,没有extend,同时Sports,Programs也没有继承关系,这时候就只能我们显示声明了
public class Person implements Sports, Programs {
@Override
public void pingPong() {
Programs.super.pingPong();
}
}
public class Test {
public static void main(String[] args) {
new Person().pingPong();
}
/**
* 输出:
* 观看乒乓球比赛
*/
}
Java8新特性之接口defualt,static方法的更多相关文章
- 【Java8新特性】- 接口中默认方法修饰为普通方法
Java8新特性 - 接口中默认方法修饰为普通方法 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学 ...
- java8新特性:接口的默认方法与静态方法
接口中一共可以定义三种方法: 1.抽象方法,也就是需要实现者必须实现的方法,最常见的那种 2.默认方法,不需要实现者实现 3.静态方法,不需要实现者实现 默认方法: 允许在已有的接口中添加新方法,而同 ...
- JDK1.8新特性(一): 接口的默认方法default
前言 今天在学习mysql分区优化时,发现一个博客专家大神,对其发布的文章简单学习一下: 一:简介 我们通常所说的接口的作用是用于定义一套标准.约束.规范等,接口中的方法只声明方法的签名,不提供相应的 ...
- 【Java8新特性】接口中的默认方法和静态方法,你都掌握了吗?
写在前面 在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法.而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法 ...
- Java8 新特性----函数式接口,以及和Lambda表达式的关系
这里来讲解一下Java8 新特性中的函数式接口, 以及和Lambda 表达式的关系.看到过很多不少介绍Java8特性的文章,都会介绍到函数式接口和lambda表达式,但是都是分别介绍,没有将两者的关系 ...
- Java8新特性interface中的static方法和default方法
static方法 java8中为接口新增了一项功能:定义一个或者更多个静态方法.用法和普通的static方法一样. 代码示例 public interface InterfaceA { /** * 静 ...
- Java8 新特性 函数式接口
什么是函数式接口 函数式接口是Java8引用的一个新特性,是一种特殊的接口:SAM类型的接口(Single Abstract Method).但是它还是一个接口,只是有些特殊罢了. 函数式接口的 ...
- Java8新特性_接口中的默认方法
默认方法由来猜想 1. Collection接口.Collections公共类. 同是操作集合,为啥要搞俩?没必要.在接口中搞一些默认实现,一个接口即搞定了. 2. Java8支持Lambda表达式 ...
- java8新特性-函数式接口详细讲解及案例
一.函数式接口 1.1 概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口.函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 以适 ...
随机推荐
- Android 子线程更新UI 异常
众所周知,Android是不可以在子线程中直接更新UI的,需要借助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runna ...
- STM32 GPIO口的配置和应用
STM32F103ZET6 一共有7组IO口(有FT的标识是可以识别5v的) 每组IO口有16个IO 一共16*7=112个IO 4种输入模式: (1) GPIO_Mode_AIN 模拟输入 (2) ...
- 使用Fiddler 对ios 设备进行HTTPS 的抓取
http://blog.csdn.net/skylin19840101/article/details/43485911 使用Fiddler 对ios 设备进行HTTPS 的抓取
- NSDateFormatter格式详细列表一览
转自:http://www.cnblogs.com/xinus/archive/2012/10/29/NSDateFormatter_samples.html 前言:iOS开发中NSDateForma ...
- go实践之swagger自动生成api文档
文章目录 go实践之swagger自动生成api文档 1.安装需要用到的包 2.接口代码支持swagger 3. 生成swagger接口 go实践之swagger自动生成api文档 作为一个后端开发, ...
- 压缩感知重构算法之IRLS算法python实现
压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...
- 数据库Oracle的select用法(部分)
Oracle的select用法(部分): 1.查询所有: select * from employees; 2.加上where子句:用选择限制行 select * from employees whe ...
- HDU 2444 The Accomodation of Students (二分图存在的判定以及最大匹配数)
There are a group of students. Some of them may know each other, while others don't. For example, A ...
- 洛谷 题解 P1351 【联合权值】
Problem P1351 [联合权值] record 用时: 99ms 空间: 13068KB(12.76MB) 代码长度: 3.96KB 提交记录: R9883701 注: 使用了 o1 优化 o ...
- Mybatis 报错 java.lang.IllegalArgumentException: Result Maps collection does not contain value for java.lang.Inte
like ‘%java.lang.IllegalArgumentException: Result Maps collection does not contain value for java.la ...