interface中定义default方法和static方法

本文详细解析了Java接口中的default方法和static方法的区别与应用。default方法为接口提供了默认实现,子类可选择是否重写;static方法则不可被重写,由接口直接调用。当多个接口中有相同签名的default方法时,实现类必须重写此方法。

interface的default方法和static方法

  • 接口中可以定义static方法,可通过接口名称.方法名()调用,实现类不能继承static方法;
  • 接口中可以定义default方法,default修饰的方法有方法体,表示这个方法的默认实现,子类可以直接调用,可以选择重写或者不重写;
  • 当实现类实现的多个接口中,有方法签名相同的default方法时,必须重写该方法;

  接口一:

package com.skd.interfacemethod;

/**
 * @Description
 * @Author virgosnail
 * @Date 2018/12/12
 */

public interface Human {

    /**
     * 必须被重写
     */
    void oldMethod();

    /**
     * 实现类可以选择重写,也可以不重写
     */
    default void hi(){
        System.out.println("interface default method");
    }

    /**
     * 不能被实现类重写
     */
    static void hello(){
        System.out.println("interface static method");
    }
}

  接口二:

package com.skd.interfacemethod;

/**
 * @Description
 * @Author virgosnail
 * @Date 2018/12/12 20:59
 */

public interface Humen {

    default void hi(String aa){
        System.out.println("interface default method");
    }
}

  实现类:

package com.skd.interfacemethod;

/**
 * @Description
 * @Author virgosnail
 * @Date 2018/12/12
 */

public class Person implements Human,Humen {

    @Override
    public void oldMethod() {

    }

    /**
     * 实现的多个接口中有方法签名相同的default 方法时,实现类必须重写该方法
     */
    @Override
    public void hi() {

    }
    /**
     * 实现类不能继承接口的static 方法
     */
}

  测试类:

package com.skd.interfacemethod;

/**
 * @Description
 * @Author virgosnail
 * @Date 2018/12/12
 */

public class Test {
    public static void main(String[] args) {
        // interface 的 default 方法通过实现类的实例对象调用
        new Person().hi();
        // interface 的 static 方法通过 接口名称.方法名称直接调用
        Human.hello();

    }
}

 

转载于:https://www.cnblogs.com/virgosnail/p/10111075.html

### 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`方法并不具备这样的灵活性,因为它是基于编译期解析出来的固定入口地址进行调用的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值