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