logo
Хабибуллин

Переопределение методов

Если же записать метод в подклассе с тем же именем, параметрами и типом возвращаемого значения, что и в суперклассе, например:

class Truck extends Automobile{ void moveTo(int x, int y){

// Какие-то действия...

}

// Что-то еще, содержащееся в классе Truck...

}

то он перекроет метод суперкласса. Определив экземпляр класса Truck, например:

Truck gazel = new Truck();

и записав gazel.moveTo(25, 150), мы обратимся к методу класса Truck. Произойдет пере-

определение (overriding) метода.

При переопределении метода его сигнатура и тип возвращаемого значения должны полностью сохраняться. Если в подклассе мы изменим тип, количество или порядок следования параметров, то получим новый метод, не переопределяющий метод суперкласса. Если изменим только тип возвращаемого значения, то получим ошибку, которую "заметит" компилятор.

Проверку соответствия сигнатуры переопределяемого метода можно возложить на компилятор, записав перед методом подкласса аннотацию @Override, как это сделано в листинге 2.2. В этом случае компилятор пошлет на консоль сообщение об ошибке, если сигнатура помеченного метода не будет соответствовать сигнатуре ни одного метода суперкласса с тем же именем.

При переопределении метода права доступа к нему можно только расширить, но не сузить. Открытый метод public должен остаться открытым, защищенный protected может стать открытым, но не может стать закрытым.