1

据说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() 方法。

4

4 回答 4

3

我的问题是我怎么知道被覆盖的 show() 方法。

你无法区分这一点。该方法只有一个实现show(),可以通过任一接口调用。

于 2013-04-05T13:55:11.617 回答
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'svoid show()满足两个接口的方法声明,所以一切正常,控制台中出现两行(一行用于通过 A 引用的调用,一行用于 B 调用)。

现在,说你有

interface A { public void show(); }
interface B { public int show(); }  <-- different return type!

class C implements A, B { public void show(); }

尝试实施哪种方法有点明显。但是,这是行不通的——而且不能,因为 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); }
}

这很好。由于两个接口声明只共享一个名称而不共享 arg 类型,Java 允许它们在C. 但它也要求您为每个接口实现一种方法。

于 2013-04-05T13:57:46.223 回答
2

由于接口没有方法定义。您覆盖哪个接口的 show 方法并不重要。

在具有相同方法的类中实现 2 个接口。覆盖哪个接口方法?

如果一个类型实现了两个接口,并且每个接口定义了一个签名相同的方法,那么实际上只有一个方法,并且它们是不可区分的。比如说,如果这两个方法的返回类型有冲突,那么这将是一个编译错误。这是继承、方法覆盖、隐藏和声明的一般规则,不仅适用于两个继承的接口方法之间可能发生的冲突,还适用于接口和超类方法之间的冲突,甚至只是由于泛型的类型擦除引起的冲突.

于 2013-04-05T13:56:51.040 回答
0

没关系。想想这两个接口碰巧有相同的方法声明。

于 2013-04-05T13:57:53.487 回答