Страницы

25 ноября 2012 г.

Перегрузка и переопределение: памятка

Override - переопределение - когда подкласс подсовывает свою реализацию метода вместо реализации в суперклассе. При вызове метода выбирается наиболее "специфическая" реализация, то есть реализация в подклассе, если она есть, приоритетнее реализации в суперклассе. В Java выбор выполняемого метода при переопределении происходит динамически (в рантайме) и не зависит от того, каким типом объявлена ссылка на объект:
public class TestOverriding {
    
    private static class Parent {
        String getName() { return "Parent"; }
    }

    private static class Child extends Parent {
        @Override
        String getName() { return "Child"; }
    }

    public static void main(String[] args) {
        Parent child = new Child();
        // Prints "Child"
        System.out.println(child.getName()); 
    }
}

Overload - перегрузка - объявление методов (или конструкторов) с одинаковыми именами, но разными с сигнатурами. Пример - все конструкторы любого класса, если их больше одного. В Java выбор выполняемого метода при перегрузке происходит статически (во время компиляции) и не зависит от типа объекта в рантайме:
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

public class TestOverloading {

    static void classifyCollection(Collection c) {
        System.out.println("Collection");
    }

    static void classifyCollection(Set s) {
        System.out.println("Set");
    }

    public static void main(String[] args) {
        Collection c = new HashSet