Java中重载方法的使用原则


Java中重载方法的使用原则


今天看到个有趣的问题,这里主要是针对重载方法中形参间是有继承关系的,在选择重载方法时按什么方式选择,问题如下:

class Test3 
{
        public static void main(String[] args) 
        {
                Test3 t = new Test3();
                t.method(null);
        }

        public void method(Object obj)
        {
                System.out.println("Object");
        }

        public void method(String s)
        {
                System.out.println("String");
        }
}
// 以上编译通过,执行结果是String

/*
class Test4
{
        public static void main(String[] args) 
        {
                Test4 t = new Test4();
                t.method(null);
        }

        // 其基类都是Object
        
        public void method(Integer in)
        {
                System.out.println("Object");
        }

        public void method(String s)
        {
                System.out.println("String");
        }
}
编译失败:
Test4.java:6: 错误: 对method的引用不明确, Test4中的方法 method(Integer)和Test4中
的方法 method(String)都匹配t.method(null);


如果改成一下方式:
class Test5
{
        public static void main(String[] args) 
        {
                Test5 t = new Test5();
                t.method(null);
        }
        public void method(Fu fu)
        {
                System.out.println("Fu");
        }
        public void method(Zi zi)
        {
                System.out.println("Zi");
        }
}
class Fu{}
class Zi extends Fu
{
        Zi(){System.out.println("Zi show run")}
}
编译通过,结果和Test3的如出一辙是 Zi.
*/


问题:即是问,Test3中选择了形参String的重载方法,Test4中出现二义性报错,Test5中为什么又选择了形参是Zi的?


主观小结:Java在选择重载方法时,是按照 就近原则,或说向上原则。

像Test5中,我们增加一个孙子类Sun,继承Zi类,在Test5类中增加一个重载方法method(Sun su),那么最终会选择该方法。但是我们若再增加一个子类Zi2,并增加相应形参的重载方法method(Zi2 z2),这时,将出现编译报错,说出现歧义。

那么我们就可以用这个就近原则来解释了,对于Test3中,String是Object的子类,就近选String形参的重载方法,对于Test4中,Integer和String是处于一个同级别的位置,距离相等,系统不知道该选谁,出现歧义报错。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值