taoyan261 2018-05-08 10:30 采纳率: 100%
浏览 685
已采纳

一个继承和多态的问题,有点无解

例子1:
class A {
public String show(D obj) {
return ("A and D");
}

public String show(A obj) {
    return ("A and A");
}

}

class B extends A{
public String show(B obj){
return ("B and B");
}

public String show(A obj){
    return ("B and A");
}

}

class C extends B{

}

class D extends B{

}

public class Demo {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();

    System.out.println("1--" + a1.show(b));
    System.out.println("2--" + a1.show(c));
    System.out.println("3--" + a1.show(d));
    System.out.println("4--" + a2.show(b));
    System.out.println("5--" + a2.show(c));
    System.out.println("6--" + a2.show(d));
    System.out.println("7--" + b.show(b));
    System.out.println("8--" + b.show(c));
    System.out.println("9--" + b.show(d));
}

}
//结果:
//1--A and A
//2--A and A
//3--A and D
//4--B and A
//5--B and A
//6--A and D
//7--B and B
//8--B and B
//9--A and D

例子2:
class X {
public void show(Y y){
System.out.println("x and y");
}

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

}

class Y extends X {
public void show(Y y){
System.out.println("y and y");
}
public void show(int i){

}

}

class main{
public static void main(String[] args) {
X x = new Y();
x.show(new Y());
x.show();
}
}
//结果
//y and y
//only x
第二个例子的结果是y and y,为什么第一个例子的第4行打印结果不是“B and B”而是B类里的show(A obj)里的结果?

  • 写回答

9条回答 默认 最新

  • qing_chen_wei 2018-05-08 11:08
    关注

    0
    java 执行方法时,是动态匹配的,在运行时才会决定用哪个方法。A ab = new B(); 你调用ab.show(b)时,会根据对象的类型A,去找方法,A中的show(A obj)匹配上,但是此方法在B中被覆盖了,所以会调用B中的show(A obj)。
    如果将代码改为:B ab = new B();,这个执行时:ab.show(b)会直接调用show(B obj);ab.show(c)会将c向上转型一次,然后调用show(B obj)。
    这样的话最后的结果就会是:
    B and B
    B and B
    总结:
    java执行方法时,会根据对象的类型得到相应的方法,如果不存在编译时会报错,真正执行时,会动态去匹配,如果真正的对象是子类的话,且此方法在子类中被覆盖的话,就会执行子类方法。
    java类型匹配时,如果不能匹配的话就做向上类型转换,转换为父类,直到能够匹配为止,若一直不能匹配在编译时会报错。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥20 matlab计算中误差
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊