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: 
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Leave a Reply


  • Highest Rated

  • My PicasaPhotos

    monkey.jpeg

    e5c5b0c34afb9546b219a8b5.jpg

    IMG_0689.JPG

  • RSS My del.icio.us

  • My RSS