吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3250|回复: 17
收起左侧

[Java 转载] 子类b到底重写了谁的m方法

[复制链接]
mlb1253 发表于 2017-3-13 11:19
文件名: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方法
4R_DDU{(9]1HQN{~79W)2B6.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Atian52 发表于 2017-3-13 23:30
1 首先以一个java 程序来说,这个肯定能运行的,并且是一个很典型的多态的例子
2 已经解决请楼主把思路说一下。因为我也想知道和我想的有什么不一样
3  b a = new b();  这个本身与接口无关,因为只实例与声明了自己 你接口是什么,在这里是没有什么关系。那怕你没有实现 这个也是可以的。
4  k(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

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

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

class Test implements  B {
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接口接收对象,这个能得到干什么结果
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-30 13:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表