mlb1253 发表于 2017-3-13 11:19

子类b到底重写了谁的m方法

文件名:Test.java

源代码:
public class Test {
        public static void main(String[] args) {
                b a = new b();
                k(a);
        }

        public static void k(A a) {
                a.m();
        }
}

interface A {
        public void m();
}

interface t {
        public void m();
}

class b implements t,A {
        public void m() {
                System.out.println("T");
        }//到底是重写了t的方法还是重写了A的方法
}

备注:该代码可以通过编译可以运行 就是不知道是重写了谁的m方法

Atian52 发表于 2017-3-13 23:30

1 首先以一个java 程序来说,这个肯定能运行的,并且是一个很典型的多态的例子
2 已经解决请楼主把思路说一下。因为我也想知道和我想的有什么不一样
3b a = new b();这个本身与接口无关,因为只实例与声明了自己 你接口是什么,在这里是没有什么关系。那怕你没有实现 这个也是可以的。
4k(A a)方法这个方法的入参,接收了一个接口的实现类(b),因为你传入进去是B所以,这时的说法是实现了A接口的m方法,但如果你入参的类型 声明为T时 那这时,是实现 的T接口的M方法
5 为什么有4这个说法。因为接口是被现实了。你的方法名相同而已,但在声明时表示那个类型,这个对象将会归属那个类型 A a = new B() 这时就是B实现了A接口   如果 T a = new B()这里是B实现了T接口, 因为二个接口是无关联一起的。只是有同一个实现类而已。

mlb1253 发表于 2017-3-13 16:38

aaron1430 发表于 2017-3-13 13:33
两个都被重写了

是的 这个问题已经解决了 感谢 不过还有个有意思的问题不知你有没有高见
interface A{
    public double a();
}

interface B extends A {
   public void a();
}

class Test implementsB {
public void a() {
}

public double a() {
   }
}

重点在于class Test 实现了接口B 那么B中有两个不同返回类型的同名称的方法 如果new Test的对象 引用a这个方法到底引用的是哪个方法呢 其次这样写class Test 通不过编译的

mlb1253 发表于 2017-3-13 11:22

图里的代码t和T有点问题运行时会报错 改成其他就没问题了 因此各位可以看我贴的代码

悲剧小白 发表于 2017-3-13 12:51

楼主的第4行代码一定会报错的,不可能通过编译
您的代码中变量 a 是 b 类型的,方法 k 需要一个 A 类型的参数
第4行代码调用方法 k ,却传递了一个 b 类型的参数,所以不可能通过编译。

至于你的问题,我认为是两个方法都被重写了 (个人观点)

ArrayList 发表于 2017-3-13 13:38

由于接口中的类,一定被其子类实现,所以接口A和接口t的m方法均被重写过。

mlb1253 发表于 2017-3-13 16:33

悲剧小白 发表于 2017-3-13 12:51
楼主的第4行代码一定会报错的,不可能通过编译
您的代码中变量 a 是 b 类型的,方法 k 需要一个 A 类型的 ...

b继承自A 所以这是一个父类引用指向子类对象,也是多态三个条件 继承 重写 父类引用指向之类对象中的最后一个。其次这个问题已经解决了 是两个接口共享这一方法,最后谢谢你的回复,最后的最后如果你是java开发你需要补补java知识了

悲剧小白 发表于 2017-3-13 19:34

mlb1253 发表于 2017-3-13 16:33
b继承自A 所以这是一个父类引用指向子类对象,也是多态三个条件 继承 重写 父类引用指向之类对象中的最后 ...

你这个不是继承而是实现,继承是可以这样传递的,实现可以吗?我不清楚唉

悲剧小白 发表于 2017-3-13 19:57

mlb1253 发表于 2017-3-13 16:33
b继承自A 所以这是一个父类引用指向子类对象,也是多态三个条件 继承 重写 父类引用指向之类对象中的最后 ...

嗯,我刚刚测试了一下,是可以这样传参的

aristotllgood 发表于 2017-3-13 22:13

本帖最后由 aristotllgood 于 2017-3-13 22:14 编辑

接口是实现 不是继承的吧

如果楼主知道 Cpp 多继承 就没这个困扰了 为了防止多继承不知道到底继承类谁的方法 搞了个虚类
Java 的接口本质是为了实现多继承 的一个折中 不能说继承类谁的 m方法 只能说实现

Atian52 发表于 2017-3-13 22:51

1首先,你只new b() 的实例。声明的也只是B所以 代码上与接口上是无关的
2你再传送进去。因为方法入参的类型是A,所以 输出 的M只是实现了A接口的M方法,不是T接口的
3 你可以试一下 使用A 或T接口接收对象,这个能得到干什么结果
页: [1] 2
查看完整版本: 子类b到底重写了谁的m方法