【问题标题】:class A extends B implements CA 类扩展 B 实现 C
【发布时间】:2016-10-24 12:24:42
【问题描述】:

问题: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();
    }

以下代码的输出是:Show1

【问题讨论】:

  • 为了让Test16实现My3,它必须提供一个方法public void show()。确实如此,因为这样的方法是在其超类中定义的。所以Test17.showTest16类中提供了My3.show的实现。
  • 请特别注意,虽然,是的,变量m1 引用的对象是Test17,但更具体地说,它是Test16。这就是将Test17.show()My3.show() 联系起来的原因。
  • 谢谢大家..我现在明白了。

标签: java interface


【解决方案1】:

Test17实现My3没关系,方法签名都是一样的,所以可以!该方法被继承到其实现接口的子代。

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

  • m1 的实现是 Test16。

  • Test16 继承 Test17(及其方法)

调用 show 时,show() 的唯一实现在 Test16 的父级:Test17 中。

【讨论】:

    【解决方案2】:

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

        public void show(){
            System.out.println("Show1");
        }
    

    现在,当你实现接口 My3 时,它也有一个签名相同的方法,在 Class Test17( with body ) 中,由于扩展,现在这个方法在 Class Test16 中。

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

    【讨论】: