java方法重载

前不久分享了一篇文章,将的是java动态绑定和向上转型,说实话还没仔细看这篇文章,自己很懒。不过对于给的第一个程序,作者的解释是参数在编译阶段被匹配,得出的总结是重载函数的实际调用版本由编译器绑定决定,而覆盖函数的实际调用版本由动态绑定决定。还是有点道理,不过对于程序,我觉得刚开始看的时候,未免把他想的太复杂了。先贴上程序,我修改了点。

 

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");   
    }   
}   
public class Main{   
    public static void whichFoo(Base arg1, Base arg2){   
        arg1.foo(arg2); 
//	System.out.println();
	arg2.foo(arg1);  
	arg1.foo(arg1);
	arg2.foo(arg2);
    }   
   
    public static void main(String[] args){   
        Base b = new Base();   
        Derived d = new Derived();   
       
        whichFoo(b,b);   
//	b.foo(b);
	System.out.println();
        whichFoo(b,d);   
//	b.foo(d);
	System.out.println();
        whichFoo(d,b); 
//	d.foo(b);
	System.out.println();  
        whichFoo(d,d);       
//	d.foo(d);
	        
    }   
}


对于whichFoo中的参数,既然已经给定了是Base,那么在函数里调用xx.foo(argx)时,显然argx就是Base了,不会再动态改变了,不用想太复杂了!

如果将Base.foo(Base x)函数取消掉,那么编译时就给出错误:无法将foo(Derivide)应用于Base。

所以,对于调用重载的方法,编译器会根据参数决定调用哪个方法,所以作者总结的“重载函数的实际调用版本由编译器绑定决定,而覆盖函数的实际调用版本由动态绑定决定”还是比较容易理解的。但是也不应把参数传递想的太复杂了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值