对象的运行时类型并不影响“哪个重载版本将被执行”;选择工作是在编译时候进行的,完全基于参数的编译时类型。
看个例子先:
package com.wjy.multithread; public class MainTest { public static void show(int a){ System.out.println("Integer"); } public static void show(double a){ System.out.println("Double"); } public static void show(Object a){ System.out.println("Object"); } public static void main(String args[]){ Object arr[]={2,22,2.5}; for(Object object : arr){ show(object); } } }
大家猜猜结果,可能认为首先会输出Integer,但实际上结果是:
Object
Object
Object
对,你没看错,输出了三遍Object.神马情况? 你可能认为show方法会自动识别元素类型,调用合适的重载方法。但实际上却不是,编译的时候决定的类型会发挥作用,无论运行时是什么类型都无所谓,编译时已经定了。无语吧。方法的重载机制是不完美的。他并没有提供这一功能。
//*********************************************************************************************************************
但是来看看类之间的覆盖例子:
package com.wjy.multithread; public class GrandFather { public void show(){ System.out.println("GrandFather"); } }
package com.wjy.multithread; public class Father extends GrandFather { @Override public void show(){ System.out.println("Father"); } }
package com.wjy.multithread; public class Son extends Father{ @Override public void show(){ System.out.println("Son"); } }
测试代码:
package com.wjy.multithread; public class MainTest { public static void main(String args[]){ GrandFather arr2[]={new GrandFather(),new Father(),new Son()}; for(GrandFather grandFather : arr2){ grandFather.show(); } } }
正如你所料,结果是:
GrandFather
Father
Son
这才是我们想要的答案,可见方法重载机制并没有覆盖机制的这些优势。所以,慎用重载。