Java 接口中的静态方法和默认方法之间有什么区别?

2022-08-31 08:27:20

当我注意到现在可以在接口中定义静态和默认方法时,我正在通过接口学习。

public interface interfacesample2 {
    public static void method() {
        System.out.println("hello world");
    }

    public default void menthod3() {
        System.out.println("default print");
    }
}

请解释两者的区别,如果有一个我们何时使用它的例子,那就太好了。在接口上有点困惑。


答案 1

Java 8 中静态方法和缺省方法之间的区别:

1) 默认方法可以在实现类时重写,而静态方法不能

2) 静态方法属于接口类,所以你只能在接口类上调用静态方法,不能在实现这个接口的类上调用静态方法,参见:

public interface MyInterface {
    default void defaultMethod(){
        System.out.println("Default");
    }

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

public class MyClass implements MyInterface {

    public static void main(String[] args) {

        MyClass.staticMethod(); //not valid - static method may be invoked on containing interface class only
        MyInterface.staticMethod(); //valid
    }
}

3)类和接口都可以有同名的静态方法,并且都不能重写其他方法!

public class MyClass implements MyInterface {

    public static void main(String[] args) {

        //both are valid and have different behaviour
        MyClass.staticMethod();
        MyInterface.staticMethod();
    }

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

答案 2

可以说,静态方法是适用于类“命名空间”的方法。因此,接口的方法可通过 访问。请注意,函数调用不适用于接口的任何特定实例staticfooInterfaceInterface.foo()

另一方面,默认实现由bar

Interface x = new ConcreteClass();
x.bar();

接口方法无法知道变量,但默认实现可以。staticthis