Overriding — переопределение — когда подкласс подсовывает свою реализацию метода вместо реализации в суперклассе. При вызове метода выбирается наиболее «специфическая» реализация, то есть реализация в подклассе, если она есть, приоритетнее реализации в суперклассе. В 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()); } }
Overloading — перегрузка — объявление методов (или конструкторов) с одинаковыми именами, но разными сигнатурами. Пример — все конструкторы любого класса, если их больше одного. В 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<Object>(); // prints "Collection" classifyCollection(c); } }