Java接口的static方法和default方法

本文介绍了Java接口中的static方法和default方法的区别,包括static方法的调用方式、default方法的使用场景及注意事项。重点演示了如何在类中实现接口并处理多接口default方法的冲突。

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

Java接口中的static方法和default方法

一、static方法

二、default方法

三、default的注意事项

一、static方法

接口中的static方法与类中的static方法很像,都是直接调用:interface名.static方法静态方法必须写函数体,否则会报错

创建接口,定义静态方法:

public interface static_interface {
    static void print(){
        System.out.println("我是接口中的静态方法");
    }
}

实现接口并调用静态方法:

public class Test implements static_interface{

    public static void main(String[] args) {
        static_interface.print();
    }

}

在这里插入图片描述

二、default方法

接口中的default方法表示接口中默认的方法,必须写函数体,这种默认方法在实现类中不需要重写即可直接使用。

创建接口,定义default方法

public interface default_interface {
    default void print(){
        System.out.println("我是接口中的default方法");
    }
}

实现接口并调用default方法

public class Test2 implements default_interface{

    public static void main(String[] args) {
        new Test2().print();
    }
}

在这里插入图片描述

三、default的注意事项

  1. 实现类中default方法可以不重写直接使用

    • 上面已经介绍过
  2. 如果一个类同时实现了多个接口,并且这些接口中有相同的default方法,那么我们必须重写default方法才可以使用

    • 原理很简单,那么多相同的default方法,不重写程序怎么会知道运行哪个呢。
  3. 如果一个子类继承了父类,父类中有a()方法,同时这个子类又实现了一个接口,这个接口中也有a()方法(被default修饰),那么子类在调用a()方法的时候,会调用父类中的a()方法,而不调用接口中的a()方法

  4. 一个接口中可以写多个default

我们实际演示一下第3点,前两点很好理解

分别创建父类和接口

public class Parent {
    public void print(){
        System.out.println("我是父类中的print方法");
    }
}
public interface default_interface {
    default void print(){
        System.out.println("我是接口中的print方法");
    }
}

定义子类来继承父类并实现接口,调用print方法

public class Test3 extends Parent implements default_interface{

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

查看输出结果

在这里插入图片描述

这就是调用了父类中的print方法。

### Java `default` 方法与 `static` 方法区别 #### 区别 在Java中,`default`方法`static`方法都允许开发者向接口添加更多的功能而无需修改现有的实现类。然而两者之间存在显著差异。 - **定义位置**:`default`方法是在接口内部声明的方法,默认提供了一个具体实现;而`static`方法也是在接口内声明,但它属于接口本身而非其实现类实例[^2]。 - **调用方式**:对于`default`方法来说,可以通过实现了该接口的对象来进行调用;相反地,`static`方法则通过接口名称直接访问,不需要创建任何对象实例[^4]。 ```java public interface MyInterface { // Default method can be overridden by implementing classes. default void greet() { System.out.println("Hello from default method."); } // Static method belongs to the interface itself. static void sayHi() { System.out.println("Hi there!"); } } // Usage of methods defined above MyInterface myObj = new MyClass(); myObj.greet(); // Calls default method via object reference MyInterface.sayHi(); // Calls static method using interface name directly ``` #### 使用场景 ##### `default` 方法 当希望给现有接口增加新功能而不破坏依赖此接口的已有代码时,可以选择使用`default`方法。这使得旧版本的实现类能够继续正常工作的同时享受新的特性[^1]。 另外,在多个接口拥有同名`default`方法的情况下,如果一个类同时实现了这些接口,则需对该冲突作出处理——要么显式覆盖这个方法给出自己的实现逻辑,要么选择其中一个作为实际执行者。 ##### `static` 方法 适合用于那些只与特定接口有关联但又没有必要让每个子类都要去重写的情况。比如工具函数、辅助操作等都可以考虑放在接口里作为一个静态成员来共享给所有使用者[^3]。 #### 特点 - **继承性**:`default`方法是可以被其派生类所继承并可能进一步改写的;但是`static`方法不具备这种性质因为它总是绑定于原始声明它的那个类型之上。 - **多态支持**:由于`default`方法关联到了具体的对象上,因此它们参与到了面向对象编程中的动态分发机制之中,即运行时刻决定哪个确切版本被执行;可是`static`方法并不具备这样的灵活性,因为它是基于编译期解析出来的固定入口地址进行调用的。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Neko1145

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

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

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

打赏作者

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

抵扣说明:

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

余额充值