子类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方法 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接口, 因为二个接口是无关联一起的。只是有同一个实现类而已。 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 通不过编译的 图里的代码t和T有点问题运行时会报错 改成其他就没问题了 因此各位可以看我贴的代码 楼主的第4行代码一定会报错的,不可能通过编译
您的代码中变量 a 是 b 类型的,方法 k 需要一个 A 类型的参数
第4行代码调用方法 k ,却传递了一个 b 类型的参数,所以不可能通过编译。
至于你的问题,我认为是两个方法都被重写了 (个人观点) 由于接口中的类,一定被其子类实现,所以接口A和接口t的m方法均被重写过。 悲剧小白 发表于 2017-3-13 12:51
楼主的第4行代码一定会报错的,不可能通过编译
您的代码中变量 a 是 b 类型的,方法 k 需要一个 A 类型的 ...
b继承自A 所以这是一个父类引用指向子类对象,也是多态三个条件 继承 重写 父类引用指向之类对象中的最后一个。其次这个问题已经解决了 是两个接口共享这一方法,最后谢谢你的回复,最后的最后如果你是java开发你需要补补java知识了 mlb1253 发表于 2017-3-13 16:33
b继承自A 所以这是一个父类引用指向子类对象,也是多态三个条件 继承 重写 父类引用指向之类对象中的最后 ...
你这个不是继承而是实现,继承是可以这样传递的,实现可以吗?我不清楚唉 mlb1253 发表于 2017-3-13 16:33
b继承自A 所以这是一个父类引用指向子类对象,也是多态三个条件 继承 重写 父类引用指向之类对象中的最后 ...
嗯,我刚刚测试了一下,是可以这样传参的 本帖最后由 aristotllgood 于 2017-3-13 22:14 编辑
接口是实现 不是继承的吧
如果楼主知道 Cpp 多继承 就没这个困扰了 为了防止多继承不知道到底继承类谁的方法 搞了个虚类
Java 的接口本质是为了实现多继承 的一个折中 不能说继承类谁的 m方法 只能说实现 1首先,你只new b() 的实例。声明的也只是B所以 代码上与接口上是无关的
2你再传送进去。因为方法入参的类型是A,所以 输出 的M只是实现了A接口的M方法,不是T接口的
3 你可以试一下 使用A 或T接口接收对象,这个能得到干什么结果
页:
[1]
2