当一个类实现两个具有相同方法签名但不同修饰符默认和静态的接口时会发生什么

时间:2018-01-25 09:41:54

标签: java java-8

interface A {
    default void m1() {}
}

interface B{
    static void m1() {}
}

class C implements A,B {
}

3 个答案:

答案 0 :(得分:7)

接口和类中的静态方法之间的区别在于,static methods在接口的情况下继承。

他们在类的情况下继承(但不可覆盖)。

另一方面,默认方法可由C覆盖并由接口A继承。因此,由于m1中的static被声明为B,因此C不会继承private static int myProperty; public static int MyProperty { get { myProperty++; return myProperty; } set { myProperty = value; } } static void Main(string[] args) { if (MyProperty == 1 && MyProperty == 2 && MyProperty == 3) { Console.WriteLine("yohhooo"); } } ,因此不会发生冲突

答案 1 :(得分:4)

除了到目前为止给出的答案,我还会添加一些正式的解释。

JLS 8.4.8

  

类不会从其超接口继承静态方法。

但是

  

C类从其直接超类继承所有具体方法m   (超强类 静态 和实例)所有的超类   以下是真实的:

     

m是C的直接超类的成员。

     

m是公共的,受保护的,或者在包含访问权限的情况下声明   打包为C.

     

在C中声明的方法没有签名是一个子签名   (§8.4.2)签名的m。

类似

class Super{
   public static void stM(){ }
}

interface Super2{
   static void stMFromInterface(){ }
}

class Sub extends Super implements Super2{ }

现在

Sub.stM(); // fine
Sub.stMFromInterface(); // compile error, interface static method not visible

对于接口,静态方法也不会被继承。

JLS 9.4.1

  

接口不会从其超接口继承静态方法。

public interface Super {
    static void st(){ }
}

public interface Sub extends Super {
}

Sub.st(); //compile error

答案 2 :(得分:3)

您可以调用这两种方法:

class C implements A,B {   
    public void test ()
    {
        B.m1(); // calls the static method of interface B
        m1(); // calls the default method of interface A
    }
}

当然,即使课程B.m1()没有实现C,也可以调用B