Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的多重继承问题_Java - Fatal编程技术网

java中的多重继承问题

java中的多重继承问题,java,Java,据说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 } }

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

我的问题是如何知道被重写的show()方法

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

我的问题是如何知道被重写的show()方法


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

因为接口没有方法定义。覆盖哪个接口的show方法无关紧要

如果一个类型实现两个接口,并且每个接口定义一个 方法,则实际上只有一个签名 方法,它们是不可区分的。如果说这两种方法 如果存在冲突的返回类型,则这将是一个编译错误。 这是继承、方法重写、隐藏的一般规则, 和声明,并且不仅适用于可能的冲突 在2个继承的接口方法之间,但也在一个接口和 超级类方法,甚至只是由于 仿制药


As接口没有方法定义。覆盖哪个接口的show方法无关紧要

如果一个类型实现两个接口,并且每个接口定义一个 方法,则实际上只有一个签名 方法,它们是不可区分的。如果说这两种方法 如果存在冲突的返回类型,则这将是一个编译错误。 这是继承、方法重写、隐藏的一般规则, 和声明,并且不仅适用于可能的冲突 在2个继承的接口方法之间,但也在一个接口和 超级类方法,甚至只是由于 仿制药


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
void show()
满足两个接口的方法声明,因此一切正常,控制台中出现两行代码(一行用于通过A引用的调用,一行用于B调用)

现在,假设你有

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

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

接口B{public int show()}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
void show()
满足两个接口的方法声明,因此一切正常,控制台中出现两行代码(一行用于通过A引用的调用,一行用于B调用)

现在,假设你有

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

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

接口B{public int show();}很好。想想这两个接口恰好有相同的方法声明。

没关系。试想一下,这两个接口恰好有相同的方法声明。

它是否符合要求?(在Java SE 8中,将有一些规则覆盖默认方法实现。)@partlov,如果一个接口应该显示大象,而另一个接口应该在屏幕上显示窗口,这肯定很重要。例如,这就是为什么C#在这种情况下提供了一种分离实现的方法。它是否符合要求?(在Java SE 8中,将有一些规则覆盖默认方法实现。)@partlov,如果一个接口应该显示大象,而另一个接口应该在屏幕上显示窗口,这肯定很重要。这就是为什么C#在这种情况下提供了一种分离实现的方法。这个解释太棒了。这个解释太棒了。