Java 类A扩展B实现C

Java 类A扩展B实现C,java,interface,Java,Interface,问题:Test16的引用放在My3类型的变量m1中(A行),Test17类中的函数show()与接口My3中的函数show()没有关系; 那么类Test17中的show()函数是如何由m1执行的呢。 代码如下: class Test17{ public void show(){ System.out.println("Show1"); } } class Test16 extends Test17 implement

问题:Test16的引用放在My3类型的变量m1中(A行),Test17类中的函数show()与接口My3中的函数show()没有关系; 那么类Test17中的show()函数是如何由m1执行的呢。 代码如下:

    class Test17{
        public void show(){
            System.out.println("Show1");
        }
    }
    class Test16 extends Test17 implements My3 {
        public static void main(String[] args){
            My3 m1=new Test16();//<----Line A
            m1.show();
        }
    }
    interface My3{
        public abstract void show();
    }
classtest17{
公开展览({
System.out.println(“Show1”);
}
}
类Test16扩展了Test17,实现了My3{
公共静态void main(字符串[]args){

My3 m1=new Test16();//Test17实现My3并不重要,方法签名是相同的,所以它可以工作!方法被继承到它的子级,子级实现接口

  • My3是一个接口,它定义show()

  • m1的实现是Test16

  • Test16继承Test17(及其方法)


调用show时,show()的唯一实现是在Test16的父类Test17中找到的。

因为类Test16扩展了类Test17,所以现在类Test16是-A Test17意味着类Test16是类Test17的子类,它继承了Test17的所有属性和行为。现在Test16有了一个方法

    public void show(){
        System.out.println("Show1");
    }
现在,当您实现接口My3时,它也有一个具有相同签名的方法,它位于类Test17(带body)中,由于扩展,现在这个方法位于类Test16中


因此,默认情况下,通过扩展类Test17,您可以在类Test16中通过类Test17提供接口方法的实现。因为接口方法和类Test17方法都具有相同的签名

,所以
Test16
要实现
My3
,它必须提供一个方法
public void show()
。确实如此,因为这样的方法是在其超类中定义的。因此
Test17.show
在类
Test16
中提供了
My3.show
的实现。请特别注意,尽管变量
m1
引用的对象是
Test17
,但它更具体地说是
Test16
。这就是将
Test17.show()
My3.show()
连接起来的地方。谢谢各位。我现在就知道了。