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

其实并不是,输出的是:

java 重载和重写的区别(Java重载的一个小坑)(1)

图1 重载输出

为什么会这样呢?

因为classify()方法被重载(overload),而要调用哪个重载是在编译时做出决定的。对于for循环中的3次循环,参数的编译时类型都是相同的 -- Wine。

所以,要避免胡乱使用重载(overload),最好永远不要写出2个具有相同参数个数的重载(overload)。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页