据说Java不支持多重继承,但可以实现多个接口。因此,在下面的片段的情况下,将实现show()方法。
public interface I1{
public void show();
}
public interface I2{
public void show();
}
class mine implements I1, I2{
@override
public void show(){
//do something
}
}
我的问题是如何知道被覆盖的show()方法。
答案 0 :(得分:3)
我的问题是如何知道被覆盖的show()方法。
你无法区分这一点。 show()
方法只有一个实现,可以通过任一接口调用。
答案 1 :(得分:3)
Java没有等同于C#的public void A.show()
,因为它不会让接口以这种方式发生冲突。如果实现两个声明具有相同名称和相同参数类型的方法的接口,它们也具有相同的返回类型,或者Java甚至不会编译代码。一旦返回类型也相同,实现一个或另一个的类实际上同时实现两者,因为签名满足两个接口的要求。
当然,如果你想验证......
public class Example {
interface A { public void show(); }
interface B { public void show(); }
class C implements A, B {
public void show() { System.out.println("show()ing"); }
}
public static void main(String[] args) {
C c = new C();
A a = c;
a.show(); // does something, trust me :P
B b = c;
b.show(); // does something too
}
}
C
的{{1}}满足两个接口的方法声明,所以一切顺利,控制台中出现两行(一个用于通过A引用调用,一个用于B调用)。
现在,说你有
void show()
您尝试实施哪种方法有点明显。但这不起作用 - 而且不能,因为Java不会让这两个接口的方法存在于同一个类中。
现在,最后一个例子。
interface A { public void show(); }
interface B { public int show(); } <-- different return type!
class C implements A, B { public void show(); }
这很好。由于两个接口声明只共享一个名称而不是arg类型,因此Java允许它们在interface A { public void show(); }
interface B { public int show(int); } <-- different return type!
class C implements A, B {
public void show() { System.out.println("Showing..."); }
public int show(int i) { System.out.println(i); }
}
中共存。但它还要求您为每个接口实现一种方法。
答案 2 :(得分:2)
由于接口没有方法定义。你覆盖哪个界面的show方法无关紧要。
Implemeting 2 interfaces in a class with same method.Which interface method is overridden?
如果一个类型实现两个接口,并且每个接口定义一个 具有相同签名的方法,则实际上只有一个 方法,它们是无法区分的。比方说,如果是这两种方法 有冲突的返回类型,那么它将是一个编译错误。 这是继承,方法覆盖,隐藏的一般规则, 和声明,不仅适用于可能的冲突 2个继承的接口方法之间,还有一个接口和一个 超类方法,甚至只是由于类型擦除引起的冲突 泛型。
答案 3 :(得分:0)
没关系。想想这两个接口碰巧有相同的方法声明。