JDK8新特性:接口的静态方法和默认方法

2023-05-16

https://blog.csdn.net/aitangyong/article/details/54134385

在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的。由于这些修饰符都是默认的,所以在JDK8之前,下面的写法都是等价的。

public interface JDK8BeforeInterface {
    public static final int field1 = 0;
 
    int field2 = 0;
 
    public abstract void method1(int a) throws Exception;
 
    void method2(int a) throws Exception;
}


JDK8及以后,允许我们在接口中定义static方法和default方法。
public interface JDK8Interface {
 
    // static修饰符定义静态方法
    static void staticMethod() {
        System.out.println("接口中的静态方法");
    }
 
    // default修饰符定义默认方法
    default void defaultMethod() {
        System.out.println("接口中的默认方法");
    }
}

再定义一个接口的实现类:
public class JDK8InterfaceImpl implements JDK8Interface {
    //实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写
}


静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。default方法,只能通过接口实现类的对象来调用。
public class Main {
    public static void main(String[] args) {
        // static方法必须通过接口类调用
        JDK8Interface.staticMethod();
 
        //default方法必须通过实现类的对象调用
        new JDK8InterfaceImpl().defaultMethod();
    }
}

当然如果接口中的默认方法不能满足某个实现类需要,那么实现类可以覆盖默认方法。
public class AnotherJDK8InterfaceImpl implements JDK8Interface {
    
    // 签名跟接口default方法一致,但是不能再加default修饰符
    @Override
    public void defaultMethod() {
        System.out.println("接口实现类覆盖了接口中的default");
    }
}


由于java支持一个实现类可以实现多个接口,如果多个接口中存在同样的static和default方法会怎么样呢?如果有两个接口中的静态方法一模一样,并且一个实现类同时实现了这两个接口,此时并不会产生错误,因为jdk8只能通过接口类调用接口中的静态方法,所以对编译器来说是可以区分的。但是如果两个接口中定义了一模一样的默认方法,并且一个实现类同时实现了这两个接口,那么必须在实现类中重写默认方法,否则编译失败。

public interface JDK8Interface1 {
 
    // static修饰符定义静态方法
    static void staticMethod() {
        System.out.println("JDK8Interface1接口中的静态方法");
    }
 
    // default修饰符定义默认方法
    default void defaultMethod() {
        System.out.println("JDK8Interface1接口中的默认方法");
    }
 
}

public class JDK8InterfaceImpl implements JDK8Interface,JDK8Interface1 {
 
    // 由于JDK8Interface和JDK8Interface1中default方法一样,所以这里必须覆盖
    @Override
    public void defaultMethod() {
        System.out.println("接口实现类覆盖了接口中的default");
    }
}

public class Main {
    public static void main(String[] args) {
        JDK8Interface.staticMethod();
        JDK8Interface1.staticMethod();
        new JDK8InterfaceImpl().defaultMethod();
    }
}

--------------------- 
作者:aitangyong 
来源:CSDN 
原文:https://blog.csdn.net/aitangyong/article/details/54134385 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDK8新特性:接口的静态方法和默认方法 的相关文章

  • CentOS8 使用yum 安装 jdk8

    原文地址 1 安装方法 CentOS8上使用 yum 直接安装 xff0c 环境变量自动配置好 2 查看是否已安装 看到下面结果 xff0c 说明已经安装配置 jdk 1 2 3 4 root 64 localhost java versi
  • yum java8_CentOS8 安装 jdk8 / java8的教程(推荐)

    前言 最开始我是想在CentOS8上使用 wget 下载 xff0c 然后对它进行解压 xff0c 配置环境变量 xff0c 奈何搞了很长时间都没有搞好 xff0c 于是放弃 xff0c 使用yum直接安装 1 安装方法 CentOS8上使
  • Centos7安装jdk8

    Centos7安装jdk8 第一种方式 一 使用yum命令本地下载openjdk 1 查看当前是否安装了JDK 查看当前是否安装了JDK xff0c rpm qa grep i jdk 2 如果安装了就直接卸载 rpm ev 参数说明 q在
  • 下载JDK8 JVM源码

    性子急的可以直接看快速下载步骤 xff1a 目录 详细步骤快速下载步骤 详细步骤 打开openJDK官网 xff1a https openjdk org 找到左侧的Mercurial xff0c 点击进入新界面 选择jdk8 xff0c 点
  • centos7 yum安装jdk8

    1 安装之前先检查一下系统有没有自带open jdk 命令 xff1a rpm qa grep java rpm qa grep jdk rpm qa grep gcj 如果没有输入信息表示没有安装 2 首先检索包含java的列表 yum
  • jdk16正式发布,你还在用jdk8吗?jdk16有啥新特性?下载地址

    新特性 下载地址 官方 xff1a https www oracle com java technologies javase jdk16 downloads html csdn资源windows xff1a https download
  • debian10 安装jdk8

    下载Oracle JDK 8 在 Debian 上安装 Oracle JDK 需要从官网上下载可供安装的软件包 这里我们使用curl命令来从 Oracle 网站下载 Oracle Java 8 默认情况下curl命令工具并未在系统中安装可以
  • ubuntu1804源码编译jdk8

    这里纯粹自己弄着玩 xff0c 因为以前没有成功过 xff0c 这里记录一下 xff0c 就是让遇到问题的人可以规避问题 xff0c 快速编译自己的jdk 相信很多学java的人都看过或者了解过一本书 深入理解java虚拟机 xff0c 里
  • Deepin20.5安装JDK8

    1 下载OpenJDK Deepin20 5下安装jdk 这里使用AdoptOpenJDK xff0c 版本8 虚拟机使用HotSplot 首先进入AdoptOpenJDK官网进行下载 xff0c 官方地址为 xff1a https ado
  • Centos7 安装jdk8

    使用rpm方式安装 1 jdk下载地址 xff1a https www oracle com java technologies downloads java8 2 安装 检测当前系统是否存在java环境 xff01 java versio
  • 下载JDK8 JVM源码

    性子急的可以直接看快速下载步骤 xff1a 目录 详细步骤快速下载步骤 详细步骤 打开openJDK官网 xff1a https openjdk org 找到左侧的Mercurial xff0c 点击进入新界面 选择jdk8 xff0c 点
  • jdk8

    文章目录 1 场景再现 2 Supplier
  • JDK8新特性-Function接口与BiFunction接口

    Function 接口 JDK8新增的函数式接口 接口只有一个抽象方法apply 接受一个T类型参数 返回一个R类型参数 T R表示泛型 可以相同 除了一个抽象的apply方法之外 Function存在两个默认的default方法 comp
  • JDK8新特性详解Lambda、StreamAPI、Optional等

    JDK8学习笔记 学习视频地址 https www bilibili com video BV1k64y1R7sA 操作代码 https gitee com rederic study jdk8 git 一 JDK8新特性 1 Lambda
  • Java虚拟机:关于JDK8到JDK9-10的一点小变化(tools.jar、dt.jar)

    关于JDK8到JDK9 10的一点小变化 JDK在每一次版本升级中 或多或少都会有一些比较重要的变化 或许在你使用的过程中 你就很有可能遇到 一 Removed or Changed APIs JDK8在升级到9或者10的时候 有一些变化还
  • java8之Stream-Collect操作

    文章目录 collect Collector in Action 收集器 Collectors 常用规约操作 规约到一个单独的值 把数据装进一个list中 将数据收集到一个Set中 把数据收集到一个Map中 Using other coll
  • Jdk8 foreach语法需要break怎么办?

    forEach里的return只相当于continue 没有break语法 在这里我总结了3种解决方案供你选择 exception filter anyMatch forEach里的return只相当于continue 没有break语法
  • jdk13快来了,jdk8的这几点应该看看!

    说明 jdk8虽然出现很久了 但是可能我们还是有很多人并不太熟悉 本文主要就是介绍说明一些jdk8相关的内容 主要会讲解 lambda表达式 方法引用 默认方法 Stream 用Optional取代null 新的日志和时间 Completa
  • Lambda表达式使用详细讲解

    目录 1 新思想 1 1函数式编程思想 1 2 函数式接口 2 通往lambda之路 2 1 什么是lambda表示式 2 2 lambda表示式有哪些特点 2 3 lambda表示式使用场景 2 4 lambda表示式语法 2 5 Lam
  • JDK 8 List集合使用记录

    JDK8 的新特性给我们开发带来了很大的便利性 先声明 我没有系统的去学习 JDK8的这些所有新特性 本文只是记录一些我个人日常开发中常遇到的一些 JDK8 的新特性方法 1 提取对象集合中的某一属性集合 List lt 对象 gt gt

随机推荐