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是处于一个同级别的位置,距离相等,系统不知道该选谁,出现歧义报错。