Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие Java .pdf
Скачиваний:
118
Добавлен:
16.03.2015
Размер:
1.32 Mб
Скачать

4.6 Возможность доступа и переопределение

Метод может быть переопределён только в том случае, если он доступен. Метод, имеющий модификатор private, не виден за пределами класса. Если в производном классе объявлен метод с теми же сигнатурой и типом возвращаемого значения, что и приватный метод базового класса, это будут два совершенно разных и не связанных между собой метода – метод производного класса

вэтой ситуации нельзя квалифицировать как переопределённый.

Вчастности, обращение к приватному методу всегда приводит к вызову метода, объявленного в текущем классе.

4.7 Сокрытие статических членов

Статические члены класса не могут быть переопределены, поскольку всегда скрыты – как поля, так и методы. Обращение к каждому статическому полю или методу чаще всего осуществляется посредством задания имени класса, в котором они объявлены. Из факта сокрытия статического поля или метода в результате объявления одноимённого члена производного класса вытекает одно следствие – если для доступа к статическому члену используется ссылка, то, как и в ситуации с сокрытием полей, при выборе подходящей альтернативы компилятор учитывает объявленный тип ссылки, а не тип объекта, на который она указывает.

4.8 Служебное слово super

Служебное слово super может быть использовано в теле любого нестатического члена класса. При доступе к полю или вызове метода выражение super действует как ссылка на текущий объект, представленный как экземпляр базового класса. Применение super – это единственный вариант, когда выбор метода обусловливается типом ссылки. Вызов super.method() всегда означает обращение к методу method базового класса – никакие возможные переопределённые

144

реализации метода в производных классах в расчёт не принимаются. При этом вызываемый метод может быть не описан в непосредственномродительском классе, аунаследован имот своих родителей.

Т.е. слово super позволяет вызвать метод, который присутствует в непосредственном родительском классе. Оно не позволяет вызвать метод, если он отсутствует в родительском классе, и не позволяет вызвать более раннюю версию метода, чем описанная в непосредственном родительском классе.

Пример 64 показывает действие ключевого слова super.

Пример 64. Ключевое слово super class That {

// возврат строки с именем класса protected String nm() {

return "That";

}

}

class More extends That { protected String nm() {

return "More";

}

protected void printNM() { That sref = (That) this;

System.out.println("this.nm() = " + this.nm()); System.out.println("sref.nm() = " + sref.nm()); System.out.println("super.nm() = " + super.nm());

}

}

Хотя sref и super, как кажется, ссылаются на один и тот же объект типа That, только при использовании super компилятор игнорирует тип текущего объекта, обращаясь к методу nm() базового класса. Ссылка sref действует точно так же, как и this,

145

Соседние файлы в предмете Программирование на Java