首页 > 编程语言 >Java8新特性之接口的默认方法和静态方法(四)

Java8新特性之接口的默认方法和静态方法(四)

时间:2023-10-12 18:11:33浏览次数:41  
标签:静态方法 defaultMethod void 默认 public InterfaceTest InterfaceA Java8

1. 背景介绍

在Java8之前,接口中定义的方法都是抽象方法,即默认都是被public abstract修饰的;但从Java8开始,允许在接口中定义带有方法体的默认方法和静态方法;

public class InterfaceTest {

    public static void main(String[] args) {

    }
}

interface InterfaceA {

    /**
     * 接口的默认方法
     */
    default void defaultMethod() {
        System.out.println("InterfaceA defaultMethod");
    }
}

interface InterfaceB {

    /**
     * 接口的静态方法
     */
    static void staticMethod() {
        System.out.println("InterfaceB staticMethod");
    }
}

2. 接口的默认方法介绍

  1. 使用default关键字修饰,实现类对父类接口的默认方法可选择性重写,且接口的默认方法只能通过实现类对象调用;
public class InterfaceTest implements InterfaceA {

    public static void main(String[] args) {
        InterfaceA a1 = new InterfaceTest();
        // 通过接口的实现类对象调用默认方法
        a1.defaultMethod();
        InterfaceA a2 = new InterfaceAImpl();
        a2.defaultMethod();
    }
    
    /**
     * 重写父类接口的默认方法
     */
    @Override
    public void defaultMethod() {
        System.out.println("InterfaceTest defaultMethod");
    }
}

/**
 * 不重写父类接口的默认方法
 */
class InterfaceAImpl implements InterfaceA {
    
}

interface InterfaceA {

    /**
     * 默认方法
     */
    default void defaultMethod() {
        System.out.println("InterfaceA defaultMethod");
    }
}

// 运行结果
InterfaceTest defaultMethod
InterfaceA defaultMethod

当实现类拥有多个父类接口,且多个父类接口含有相同的默认方法时,实现类则必须重写该默认方法,否则会出现编译错误;

public class InterfaceTest implements InterfaceA, InterfaceB {

    public static void main(String[] args) {
        InterfaceA a = new InterfaceTest();
        a.defaultMethod();
        InterfaceB b = new InterfaceTest();
        b.defaultMethod();
        InterfaceTest test = new InterfaceTest();
        test.defaultMethod();
    }

    /**
     * 两个父类接口存在相同的默认方法, 实现类则必须重写该默认方法
     */
    @Override
    public void defaultMethod() {
        System.out.println("InterfaceTest defaultMethod");
    }
}

interface InterfaceA {

    default void defaultMethod() {
        System.out.println("InterfaceA defaultMethod");
    }
}

interface InterfaceB {

    default void defaultMethod() {
        System.out.println("InterfaceB defaultMethod");
    }
}

// 运行结果
InterfaceTest defaultMethod
InterfaceTest defaultMethod
InterfaceTest defaultMethod

实现类对于多层父类接口的默认方法采用就近原则继承;

public class InterfaceTest implements InterfaceA, InterfaceSuper {

    public static void main(String[] args) {
        // 子类将继承InterfaceA的默认方法
        InterfaceSuper i = new InterfaceTest();
        i.defaultMethod();
    }
}

interface InterfaceA extends InterfaceSuper {

    default void defaultMethod() {
        System.out.println("InterfaceA defaultMethod");
    }
}

interface InterfaceSuper {

    default void defaultMethod() {
        System.out.println("InterfaceSuper defaultMethod");
    }
}

// 运行结果
InterfaceA defaultMethod

3. 接口的静态方法介绍

使用static关键字修饰,访问控制修饰符默认是public的,且静态方法的调用只能通过接口类;

public class InterfaceTest {

    public static void main(String[] args) {
        // 通过接口类调用静态方法
        InterfaceB.staticMethod();
    }
}

/**
 * 含有静态方法的接口
 */
interface InterfaceB {

    static void staticMethod() {
        System.out.println("InterfaceB staticMethod");
    }
}

// 运行结果
InterfaceB staticMethod

来源:https://blog.csdn.net/gu19930914/article/details/115718050

标签:静态方法,defaultMethod,void,默认,public,InterfaceTest,InterfaceA,Java8
From: https://www.cnblogs.com/hefeng2014/p/17760222.html

相关文章

  • Java8新特性之函数式接口(二)
    1,函数式接口介绍前言:由于Java8中引入了lambda表达式语法,但该语法需要配合一种特定的接口才能使用,由此产生出了函数式接口;函数式接口指有且仅有一个抽象方法(由Object对象继承的方法不算)(但可以有多个默认方法和静态方法)的接口,当这样的接口在作为方法参数时可以隐式的转换为lambda......
  • Java8新特性之Lambda表达式(一)
    Java8新特性之Lambda表达式(一)文章目录1.lambda表达式介绍2.lambda表达式的重要特征3.lambda表达式对域外变量的限制4.lambda表达式的优缺点5.lambda表达式的使用场景6.lambda表达式的实现原理7.相关链接1.lambda表达式介绍lambda表达式是Java8提供的新特......
  • cpp中函数参数的默认值
    title:aliases:tags:-cpp/函数category:-方法stars:url:creation-time:2023-10-0919:24modification-time:2023-10-1014:20:19[[Cpp]]函数的默认值写法:voidDemo(intx,inty=1;intz=2);由于cpp中函数可能存在声明和定义,如果同时在声明和定......
  • 修改docker默认存储路径方法总结
    默认情况下,docker镜像的默认存储路径是/var/lib/docker或其他根目录,有的服务器本身硬盘容量不足需要挂载到数据盘中,所以总结一下修改docker的默认路径,方法如下:先创建新的docker目录mkdir/home/docker以挂载home目录为例,此处也可另外挂载一块磁盘,把新的docker目录建在新磁盘上......
  • geonetwork更改默认数据库配置
    默认情况下,H2数据库是在GeoNetwork应用程序首次启动时配置和创建的。本文介绍如何将默认数据库更改为PostgreSQL数据库。本文使用环境:操作系统:Windows11JDK版本:jdk-8u381-windows-x64.exeElasticsearch版本:elasticsearch-7.9.2-windows-x86_64.zipGeoNetwork版本:geonetwork......
  • Windows更换默认远程端口3389
    直接上方法:1、打开注册表2、打开路径“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\Wds\rdpwd\Tds\tcp”,修改“PortNumber”4、打开路径“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp”,修改“Port......
  • 插槽、默认插槽
    插槽的作用:让组件内部的一些结构支持自定义应用场景eg:将对话框封装成组件,对话框的内容部分不希望写死,希望能使用的时候自定义。 插槽的基本语法:1.组件内需要定制的结构部分 改用<slot></slot>占位2.使用组件时,<MyDialog></MyDialog>标签内部,传入结构替换slot(......
  • linux默认设置默认JDK(ubuntu)
    sudoupdate-alternatives--install/usr/bin/javajava/tmp/jdk1.8.0/bin/java300sudoupdate-alternatives--install/usr/bin/javacjavac/tmp/jdk1.8.0/bin/javac300 设置:#setjavaenvironmentexportJAVA_HOME=/tmp/jdk1.8.0exportJRE_HOME=${JAVA_HOME}/jree......
  • Ftp基础(三):修改默认端口(Vsftpd)
      做个笔记  一般个人使用的时候,我们不需要修改Ftp默认端口,但是它具备通用性,生成环境下可能存在一些风险,所以如果需要,我们需要修改它。  命令控制默认端口是21,数据传输默认端口是20    修改默认端口很简单,修改vsftpd.conf中的两个配置即可(没有则添加):  #修改......
  • 【Azure 容器应用】在中国区Azure上创建的容器服务默认应用域名不全
    问题描述在中国区Azure上,创建ContainerApp服务,发现默认的应用程序URL只有前半段,并不是一个完整的域名。这是什么情况呢?正常的ContainerApp的URL格式为:<containerappname>.<environment>.<region>.azurecontainerapps.cn。如:mymoreappinone04.icysand-c9bc5d4e.chinanorth3.......