Java 8|接口默认方法

本文主要介绍 Java 8 为接口引入的默认方法。在 Java 7 及之前,接口不能有具体方法实现,而 Java 8 允许接口方法有默认实现。文中阐述了默认方法的语法,即有具体实现且用特定关键字修饰,还介绍了其特征,并给出了代码范例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

在 Java 7 和之前的版本中,接口 interface 是不能包含具体的方法实现的。

对于一个接口有多个实现的时候,我们通常的做法就是让所有的实现继承另一个基础类,然后在这个基础类中实现这个方法。

Java 8 中为接口提供了一个新的功能,允许某个接口方法有个默认实现。

默认方法

Java 8 为 接口 ( interface ) 中引入了 「 默认方法 」( default method ) 实现这个新的概念。

default 关键字,用于标识这个方法是可以有具体的实现。有了 default 关键字,我们就可以在所有集合都实现的接口 Collection<E> 中添加一个 forEach 方法啦。

这是一个非常重要的新功能,它的出现,Java 8 及以后的版本,添加新功能的速度明显加快了很多。

默认方法语法
package com.sjh.test.java8.service;

public interface Greeter {

    default void method(){
        System.out.println(" Hello ,我是二哥!");
    }
}

从语法中可以看到,一个接口默认方法和普通的接口方法声明有两个不同点:

1、 接口默认方法可以有具体实现

2、 接口默认方法需要使用 default 关键字修饰。

默认方法特征

1、 一个接口可以有任意数量的默认方法,也可以没有默认方法

2、 如果一个类实现的两个接口都有一个同名的默认方法,那么该类必须自己实现同样的方法,然后在实现内部可以调用相应接口的方法

代码范例

接口默认方法

package com.sjh.test.java8.service;

public class Test1 {

    public static void main(String[] args)
    {
        Greeter gt = new Greeter(){};
        gt.greeter("二哥!");
    }

    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("Hello ," + name );
        }
    }
}

运行结果:

/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test1
Hello ,二哥!

Process finished with exit code 0

一个接口可以有多个默认方法

package com.sjh.test.java8.service;

public class Test2 {
    public static void main(String[] args)
    {
        Greeter gt = new Greeter(){};
        gt.greeter("二哥!");
        gt.greeterEn("JayLa!");
    }

    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("你好," + name );
        }

        default public void greeterEn(String name)
        {
            System.out.println("Hello," + name );
        }
    }
}

运行结果:

/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test2
你好,二哥!
Hello,JayLa!

Process finished with exit code 0

一个类实现了多个具有同名的默认方法接口

如果一个类实现了两个或两个以上的接口,而这些接口有两个或两个以上实现了相同的方法名的默认方法,最简单的方法就是类自己实现一个相同的方法。

package com.sjh.test.java8.service;

public class Test3 {

    public static void main(String[] args)
    {
        Test3 tester = new Test3();
        tester.run();
    }

    public void run()
    {
        Greeter gt = new Hello();
        gt.greeter("二哥!");
    }

    class Hello implements Greeter,GreeterEn {
        public void greeter(String name)
        {
            System.out.println("1、你好," + name );
        }
    }


    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("2、你好," + name );
        }
    }

    interface GreeterEn {

        default public void greeter(String name)
        {
            System.out.println("3、Hello," + name );
        }
    }
}

运行结果:

/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test3
1、你好,二哥!

Process finished with exit code 0

还可以调用相关接口的默认方法

package com.sjh.test.java8.service;

public class Test4 {
    public static void main(String[] args)
    {
        Test4 tester = new Test4();
        tester.run();
    }

    public void run()
    {
        Greeter gt = new Hello();
        gt.greeter("二哥!");
    }

    class Hello implements Greeter,GreeterEn {
        public void greeter(String name)
        {
            Greeter.super.greeter(name);
        }
    }


    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("1、你好," + name );
        }
    }

    interface GreeterEn {

        default public void greeter(String name)
        {
            System.out.println("2、Hello," + name );
        }
    }
}

运行结果:

/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test4
1、你好,二哥!

Process finished with exit code 0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java小技巧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值