Методы
Метод — именованный блок кода с параметрами на входе и результатом на выходе. Методы убирают повторы и дают куску логики имя, по которому его можно вызвать и проверить отдельно. Эта тема — о static-методах, которые вызываются без объекта, как main; методы объектов, перегрузка и переопределение разобраны в теме ООП.
Главная мысль темы — каждый вызов работает со своими копиями. Параметры получают копии аргументов, а локальные переменные живут в собственном кадре стека и исчезают после выхода из метода. Из этой модели следуют все ловушки: метод не может переприсвоить переменную вызывающего, рекурсия без базового случая переполняет стек, а одноимённая локальная переменная во вложенном блоке не компилируется.
Карта темы
- Объявление и вызов — сигнатура, параметры,
returnиvoid, вызов изmainи ошибкаmissing return statement. - Передача по значению — метод получает копию аргумента; для объекта это копия ссылки.
- Рекурсия — базовый случай, стек вызовов и
StackOverflowError. - Область видимости — где видна локальная переменная, блоки и запрет повторно объявлять имя.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Вернуть значение не на всех путях метода | Не компилируется: missing return statement |
Вызвать метод без static из main без объекта | Не компилируется: non-static method cannot be referenced from a static context |
| Менять параметр-примитив, чтобы изменить переменную вызывающего | Меняется копия, переменная снаружи остаётся прежней |
| Считать, что Java передаёт объекты по ссылке | Передаётся копия ссылки: изменения объекта видны, переприсваивание параметра — нет |
| Писать рекурсию без базового случая | Вызовы копятся на стеке до StackOverflowError |
| Объявить во вложенном блоке переменную с именем внешней | Не компилируется: variable is already defined |
Читать переменную, объявленную внутри if, после блока | Не компилируется: cannot find symbol |
Значение для собеседований
На собеседовании методы проверяют через передачу параметров: «что выведет код, если метод меняет параметр», «почему не работает swap», «передаёт ли Java объекты по ссылке». Правильный ответ всегда один — Java передаёт всё по значению, — но важно объяснить механизм: значение переменной объектного типа — это ссылка, и метод получает её копию.
Что обычно проверяют:
- Из чего состоит сигнатура метода и почему тип результата в неё не входит.
- Почему из
static-методаmainнельзя вызвать метод экземпляра без объекта. - Передачу по значению для примитивов, массивов и объектов и неработающий
swap. - Рекурсию: базовый случай, глубину стека,
StackOverflowErrorкакError, а неException. - Область видимости локальных переменных и запрет повторно объявлять их во вложенных блоках.
Типичный неверный ответ: «Примитивы передаются по значению, а объекты — по ссылке». Это открывает разговор о том, что при передаче по ссылке метод мог бы заменить объект у вызывающего, а в Java присваивание параметру p = new Point() снаружи не видно — виден только результат вызовов методов на том же объекте.