Перегрузка методов и конструкторов в Java - Вопросы
Всего: 3 вопросов
1. Что такое перегрузка методов в Java?
Что такое перегрузка методов в Java?
Перегрузка методов (method overloading) — это объявление в одном классе нескольких методов с одинаковым именем, но разными списками параметров. Параметры могут отличаться количеством (test(int a) и test(int a, int b)), типом (test(int a) и test(String a)) или порядком типов (test(int a, String b) и test(String a, int b)). Нужную версию выбирает компилятор по типам переданных аргументов, поэтому перегрузку называют статическим (compile-time) полиморфизмом.
2. Что такое сигнатура метода и почему нельзя перегрузить методы, отличающиеся только возвращаемым типом?
Что такое сигнатура метода и почему нельзя перегрузить методы, отличающиеся только возвращаемым типом?
Сигнатура метода — это его имя вместе с типами параметров. Внутри одного класса сигнатуры должны быть уникальными, и именно по сигнатуре различаются перегруженные варианты. Возвращаемый тип в сигнатуру не входит, поэтому void test() и int test() в одном классе дадут ошибку компиляции method test() is already defined. По той же причине не образуют перегрузку методы, различающиеся только именами параметров, модификатором доступа, static, final или списком throws. Разные возвращаемые типы допустимы только тогда, когда различаются ещё и параметры.
3. Как работает перегрузка конструкторов в Java и зачем нужен вызов this(...)?
Как работает перегрузка конструкторов в Java и зачем нужен вызов this(...)?
Конструкторы перегружаются по тем же правилам, что и методы: в классе можно объявить несколько конструкторов, различающихся количеством, типом или порядком параметров. При создании объекта выполняется ровно один из них — тот, чьи параметры соответствуют переданным аргументам, поэтому new Box(10, 20, 15), new Box() и new Box(7) попадают в разные версии. Чтобы не дублировать логику инициализации, общий конструктор вызывают из остальных через this(...): например, Box() { this(1, 1, 1); }. Такой приём называют делегированием (цепочкой) конструкторов; вызов this(...) должен быть первой инструкцией конструктора.