类实现含相同方法签名但修饰符为default和static的两个接口时会怎样?
当类实现的两个接口分别有default和static的同名同签名方法时,会发生什么?
嘿,这个问题问得很到位!咱们先看你给出的代码示例:
interface A { default void m1() {} } interface B{ static void m1() {} } class C implements A,B { }
其实这种情况完全不会产生编译冲突,原因很简单:default方法和接口static方法的归属、调用逻辑完全是两回事:
- 接口A的
m1()是default实例方法,它会被实现类C继承下来,属于C的实例成员,你可以直接通过C的对象调用它:new C().m1(); - 接口B的
m1()是static方法,它只属于B接口本身,和实现类C没有继承关系,你只能通过B.m1()来调用,C的实例或者C类本身都没法直接访问这个方法。
Java编译器会把这两个方法当成完全独立的成员处理,所以你的代码可以正常编译运行。咱们可以写个测试代码验证一下:
public class Test { public static void main(String[] args) { C c = new C(); c.m1(); // 这里调用的是接口A的default m1() B.m1(); // 这里调用的是接口B的static m1() // C.m1(); 这行代码会编译报错,因为C并没有继承B的static方法 } }
内容的提问来源于stack exchange,提问作者Pavankant
相关产品推荐
相关产品推荐

