java 重载和重写的区别(Java重载的一个小坑)
Java中的重载(overload)和覆盖(override),相信很多Java工程师都知道概念,而且平时也经常在用。但你真的非常了解它们了吗?
好,先来举个覆盖(override)的例子:
1.
(1)
public class wine {
String name(){
return "Wine";
}
}
(2)
public class WhiteWine extends Wine {
@Override
String name(){
return "WhiteWine";
}
}
(3)
public class RedWine extends Wine {
@Override
String name(){
return "RedWine";
}
}
(4) 测试
public class MainTest {
public static void main(String[] args) {
Wine[] wines = {
new Wine(), new WhiteWine(), new RedWine()
};
for(Wine wine:wines){
System.out.println(wine.name());
}
}
}
这个例子简单,相信大家都猜到结果了,输出:
Wine
WhiteWine
RedWine
2. 下面这个例子呢?
public class OverloadTest {
public static String classify(Wine wine){
return "Wine";
}
public static String classify(WhiteWine wine){
return "WhiteWine";
}
public static String classify(RedWine wine){
return "RedWine";
}
public static void main(String[] args) {
Wine[] wines = {
new Wine(),new WhiteWine(),new RedWine()
};
for(Wine wine:wines){
System.out.println(classify(wine));
}
}
}
你是不是认为,也应该输出:
Wine
WhiteWine
RedWine
其实并不是,输出的是:
图1 重载输出
为什么会这样呢?
因为classify()方法被重载(overload),而要调用哪个重载是在编译时做出决定的。对于for循环中的3次循环,参数的编译时类型都是相同的 -- Wine。
所以,要避免胡乱使用重载(overload),最好永远不要写出2个具有相同参数个数的重载(overload)。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com