interface A {
default void m1() {}
}
interface B{
static void m1() {}
}
class C implements A,B {
}
答案 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)
除了到目前为止给出的答案,我还会添加一些正式的解释。
类不会从其超接口继承静态方法。
但是
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
对于接口,静态方法也不会被继承。
接口不会从其超接口继承静态方法。
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
。