关于动态绑定和静态绑定?

关于动态绑定和静态绑定?

下面的代码,为什么第二个参数即便是Derived的对象调用的也是第二个参数是Base对象的方法?whichfoo实现的究竟是静态绑定还是动态绑定?

public class Test {
public static void main(String[] args) {
Base b=new Base();
Derived d=new Derived();

//测试传入不同参数时会调用哪个foo函数
whichFoo(b, b);//Base.Base
whichFoo(b, d);//Base.Base??
whichFoo(d, b);//Derived.Base
whichFoo(d, d);//Derived.Base??
}

public static void whichFoo(Base arg1,Base arg2){//static方法静态绑定???
arg1.foo(arg2);
}

class Base{
public void foo(Base x){
System.out.println("Base.Base");
}

public void foo(Derived x){
System.out.println("Base.Derived");
}
}

class Derived extends Base{
public void foo(Base x){
System.out.println("Derived.Base");
}

public void foo(Derived x){
System.out.println("Derived.Derived");
}
}
}

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

你把Base中的foo(Base x){中增加boolean flag=x instanceof Derived;看一下结果。“whichFoo(b, d);//Base.Base??  ”其实那个x还是子类Derived。多态时的参数,与子类父类中的多态还是不一样的。祝:学习愉快

  • 慕的地8575795 提问者 #1
    谢谢,可能我没表述清楚,就是我知道x其实是子类Derived,我不明白的是为什么x是Derived,输出的却是Base,Base,也就是我不明白为什么输出的不是Base,Derived,也就是此时为什么会调用Base类中含Base参数的foo方法?
    2018-07-18 20:40:09
  • 好帮手慕雪 回复 提问者 慕的地8575795 #2
    因为你参数传递的是Base 类型啊,在 whichFoo(Base arg1,Base arg2)中,arg1.foo(arg2);时就已经注定要走public void foo(Base x)了,虽然x依然是子类Derived。方法的重载就是样一个规则
    2018-07-19 09:47:54
  • 慕的地8575795 提问者 回复 好帮手慕雪 #3
    非常感谢!
    2018-07-19 10:04:28
Tender10 2018-07-18 15:57:59

你是对??那两行代码的输出结果有疑问吗?你可以在具体详细的描述一下你的问题。

  • 提问者 慕的地8575795 #1
    是这样的,打问号的那两行,第一行whichFoo(b,d)为什么第二个参数是Derived对象,结果运行时调用的是参数为两个Base对象的Foo方法?第二行whichFoo(d,d)也是一样的问题。还有就是我的whichFoo方法实现的是动态绑定吗?还是静态绑定?
    2018-07-18 16:10:22
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师