JDK8--接口中的默认方法与静态方法学习笔记

本文深入探讨了Java8中接口的新特性,包括默认方法和静态方法的引入,及其对现有代码的影响和如何解决接口冲突问题。通过示例代码详细解释了如何在接口中添加具体实现,以及实现类如何处理多个接口的默认方法冲突。

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

在jdk1.8之前,接口中的方法默认都是abstract的,变量都是默认 public static final,也就是接口中只存在常量,但是在jdk1.8中,允许接口中包含具有具体实现的方法和静态方法

一、默认方法

Java 8 允许给接口添加一个非抽象的方法实现,只需要使用 default 关键字修饰,该方法可以在接口中自己实现,实现类中调用

public interface x1 {
    public default void a(){
        System.out.println("这是x1");
    }
  
}

public class xx implements x1{
    public static void main(String[] args) {
        xx xx = new xx();
        xx.a();
    }
}
//输出“这是x1”

1、接口冲突

如果实现类实现了两个接口,而两个接口中都存在相同的default方法,则必须在实现类中重写该方法

public interface x2  {
    public default void a(){
        System.out.println("这是x2");
    }
}


public interface x1 {
    public default void a(){
        System.out.println("这是x1");
    }
}

public class xx implements x1,x2{
    @Override
    public void a() {
        System.out.println("这是重写的a方法");
    }
    public static void main(String[] args) {
        xx xx = new xx();
        xx.a();
    }
}
//输出 “这是重写的a方法"”

2、优先级

1、如果一个父类提供了具体的实现,那么 接口中具有相同名称和参数的默认方法会被忽略

public interface MyFun {
    default void test(){
        System.out.println("接口中的方法");
    }
}

public class MyFunImpl implements MyFun {
    @Override
    public void test() {
        System.out.println("实现类方法");
    }
    public static void main(String[] args) {
        MyFun myFun=new MyFunImpl();
        myFun.test();
    }
    //输出 :实现类方法
}

2、如果实现类在实现两个接口的同时还继承了一个拥有相同方法的父类,则不需要重写,默认继承父类

public class x3 {
    public void a(){
        System.out.println("这是继承a方法");
    }
}

public interface x1 {
    public default void a(){
        System.out.println("这是x1");
    }
}

public interface x2  {
    public default void a(){
        System.out.println("这是x2");
    }
}

public class xx extends x3 implements x1,x2{
    public static void main(String[] args) {
        xx xx = new xx();
        xx.a();
    }
}
//  输出 “这是继承a方法”

结论:

默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。

注意点:默认方法不能够重写object的方法,但是可以重载,因为在使用时将无法确定方法的调用,因为类优先的原则,所有接口的实例都是Object的子类,所有接口实例都已经有对equals/hashCode/toString等方法非默认 实现。因此,一个在接口上的这些默认方法都是无效的,它也不会被编译。

优点:如果在多个实现类实现该接口时,如果在接口中增加一个方法,就要去修改其实现类,如果实现类过多,操作太过麻烦,所以在接口中新增default方法可以在不破坏代码的前提下扩展原有库的功能。

二、静态方法

static方法也是可以在接口中自己实现的方法,拥有自己方法体,和普通类一样,可通过接口.方法调用

public interface x1 {
    public static void b(){
        System.out.println("静态b");
    }
}

public class xx implements x1{
    public static void main(String[] args) {
       x1.b();
    }
}

//输出“静态b”

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值