Java8新特性之接口defualt,static方法

时间:2022-09-24 12:35:46

简介

作用

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方法的更多相关文章

  1. java8新特性:接口的默认方法与静态方法

    接口中一共可以定义三种方法: 1.抽象方法,也就是需要实现者必须实现的方法,最常见的那种 2.默认方法,不需要实现者实现 3.静态方法,不需要实现者实现 默认方法: 允许在已有的接口中添加新方法,而同 ...

  2. JDK1.8新特性(一): 接口的默认方法default

    前言 今天在学习mysql分区优化时,发现一个博客专家大神,对其发布的文章简单学习一下: 一:简介 我们通常所说的接口的作用是用于定义一套标准.约束.规范等,接口中的方法只声明方法的签名,不提供相应的 ...

  3. 【Java8新特性】接口中的默认方法和静态方法,你都掌握了吗?

    写在前面 在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法.而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法 ...

  4. Java8 新特性----函数式接口,以及和Lambda表达式的关系

    这里来讲解一下Java8 新特性中的函数式接口, 以及和Lambda 表达式的关系.看到过很多不少介绍Java8特性的文章,都会介绍到函数式接口和lambda表达式,但是都是分别介绍,没有将两者的关系 ...

  5. Java8新特性interface中的static方法和default方法

    static方法 java8中为接口新增了一项功能:定义一个或者更多个静态方法.用法和普通的static方法一样. 代码示例 public interface InterfaceA { /** * 静 ...

  6. Java8 新特性 函数式接口

    什么是函数式接口   函数式接口是Java8引用的一个新特性,是一种特殊的接口:SAM类型的接口(Single Abstract Method).但是它还是一个接口,只是有些特殊罢了.  函数式接口的 ...

  7. Java8新特性_接口中的默认方法

    默认方法由来猜想 1. Collection接口.Collections公共类.  同是操作集合,为啥要搞俩?没必要.在接口中搞一些默认实现,一个接口即搞定了. 2. Java8支持Lambda表达式 ...

  8. java8新特性-函数式接口详细讲解及案例

    一.函数式接口 1.1 概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口.函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 以适 ...

  9. Java8新特性:接口

    Java接口本身没有任何实现,因为Java接口不涉及表象,而只描述public行为,所以Java接口比Java抽象类更抽象化. 以上是百度百科中对接口的定义,这个定义已经不准确. Java8对接口做了 ...

随机推荐

  1. ADO.NET 中的新增功能

    ADO.NET 中的新增功能: .NET Framework (current version) 以下是 .NET Framework 4.5 中 ADO.NET 的新增功能. SqlClient D ...

  2. Object-C Categories和Protocols

    Category 要扩展一个不可修改的类,通常的做法是为该类创建一个子类,在子类中实现想要实现的方法,在Object-C中,可以通过category来实现,并且实现方式更为简单. 现在有如下定义:一个 ...

  3. 使用MegaCli和Smartctl获取普通磁盘

    设备名称: [root@DB232 shell]# cat /proc/scsi/scsi Attached devices:Host: scsi0 Channel: 02 Id: 00 Lun: 0 ...

  4. 《Java程序设计》第4周学习总结

    学号20145220 <Java程序设计>第4周学习总结 6.1.1 继承共同行为 •定义:继承基本上就是避免多个类间重复定义共同行为. •优点:1.提高了代码的复用性.2.让类与类之间产 ...

  5. freeCodeCamp&colon;GO BYBY GO!

    千里之行,始于足下. 今天是2016年10月26日, 写前端代码有一年多了, 渐渐找到了一些方向, 知道该往哪里努力, 也慢慢开始总结自己的工作和学习. 希望在这里记录下的点点滴滴, 成为我日后学习的 ...

  6. poj1190 生日蛋糕 dfs

    题意:生日蛋糕有m层,总体积是V.从下向上,每一层的半径r和高度h都是递减的. 给m.v,求最小的表面积s.(不算底面接地的面积) 题目链接:poj1190 剪枝都还没加..样例输出都是错的...还没 ...

  7. CCF-201403-3-命令行选项

    问题描述 试题编号: 201403-3 试题名称: 命令行选项 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项.每 ...

  8. class&comma; classloder&comma; dex 详解

    class与dex文件 什么是class文件 class文件是一种能够被JVM识别,加载并且执行的文件格式. class文件的作用 class文件的作用是记录一个类文件的所有信息. 例如记住了当前类的 ...

  9. SpringBoot集成redis,使用&commat;Cachexxxx

    一.引入相关依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  10. 真正理解红黑树,真正的&lpar;Linux内核里大量用到的数据结构,且常被二货问到&rpar;

    作为一种数据结构.红黑树可谓不算朴素.由于各种宣传让它过于神奇,网上搜罗了一大堆的关于红黑树的文章,不外乎千篇一律,介绍概念,分析性能,贴上代码,然后给上罪恶的一句话.它最坏情况怎么怎么地...    ...