从默认接口方法调用静态接口方法时为什么不能使用它?

时间:2018-02-01 20:42:41

标签: java interface

为什么在界面时,从默认界面方法调用静态界面方法我不能使用this.staticInterfaceMethod() 而在常规课时从实例方法调用静态类方法,使用 this.staticClassMethod()完全有效(虽然它是不好的样式)?

同时,在默认的界面方法中使用this是完全有效的 - 我可以合法地执行以下操作:

interface I {   
    int MY_CONST = 7;   
    static void st_f() {}       
    default void f1() {}

    default void f_demo() {
        this.f1();                  // fine!
        int locvar = this.MY_CONST; // also fine! 

        this.st_f(); // c.ERR:  static method of interface I can only be accessed as I.st_f 
    }
}

1 个答案:

答案 0 :(得分:2)

“仅在包含接口类时可以调用静态方法。”

静态方法不是由实现接口的类(§8.4.8)从接口继承的。 this关键字引用当前对象,因此尝试调用this.staticInterfaceMethod()意味着某种方式存在继承静态接口方法的Object。这不可能发生;接口不能自己实例化,接口的任何实现都不会继承静态方法。因此,this.staticInterfaceMethod()不存在,因此您需要在接口本身上调用该方法。

有关不继承静态方法的原因的简化说明如下:

public interface InterfaceA {
    public static void staticInterfaceMethod() {
        ...
    }
}

public interface InterfaceB {
    public static void staticInterfaceMethod() {
        ...
    }
}

public class ClassAB implements InterfaceA, InterfaceB {
    ...
}

ClassAB会继承什么静态方法?这两种静态方法具有相同的签名,因此在呼叫时无法识别;也不会隐藏另一个。

  

同时,在默认的界面方法中使用它是完全有效的。

使用this关键字引用默认方法,变量等是允许的每个可以存在的从接口继承的对象将继承这些属性。