Java 中类的重载与覆盖之间的一点小区别
大的区分我想熟悉 Java 这门语言的人都知道,本文仅为记录在阅读《Effective Java》时所遇到的新知识。
在《Effective Java》中,Joshua Bloch提到:对于重载方法 (overloaded method) 的选择是静态的,而对于被改写的方法 (overridden method) 的选择是动态的。
对于被改写的方法,选择正确的方法版本是在运行时刻进行的,选择的依据是被调用方法所在对象的运行时类型。如果被改写方法是在子类实例上被调用,那么该子类实例中的方法将会执行。
而对于重载方法,则恰恰与改写方法的行为相反。
请看如下例子:
public class CollectionClassifier {
public static String classify(Set s) {
return "Set";
}
public static String classify(List l) {
return "List";
}
public static String classify(Collection c) {
return "Unknown Collection";
}
public static void main(String[] args) {
Collection[] cs = new Collection[] {
new HashSet(), new ArrayList(), new HashMap().values()
};
for (Collection c : cs) {
System.out.println(classify(c));
}
}
}
在这个例子中,将打印 “Unknown Collection” 三次。这是因为到底调用哪个重载方法是在编译时刻就做出决定的。在三次循环中,参数的编译类型都是:Collection。
By javafuns on July 8, 2009 at 22:54 ·
Views: 222 · Permalink
Categorized in: Java · Tagged with: Java
Categorized in: Java · Tagged with: Java


(