Философия Java


Скрытие имен


Только программисты C++ могут быть "обрадованы" скрытием имен, из-за того, что они работают по другому в этом языке (Java). Если базовый класс в Java имеет метод, который многократно перегружался, то при переопределении имени этого метода в классе потомке не будут скрыты методы в базовом классе. Поэтому перегрузка работает, не обращая,внимание на место определения метода, на этом уровне или в базовом классе:

//: c06:Hide.java

// Перегрузка имени базового класса в дочернем, не скрывает метод базового класса.

class Homer { char doh(char c) { System.out.println("doh(char)"); return 'd'; } float doh(float f) { System.out.println("doh(float)"); return 1.0f; } }

class Milhouse {}

class Bart extends Homer { void doh(Milhouse m) {} }

class Hide { public static void main(String[] args) { Bart b = new Bart(); b.doh(1); // doh(float) использован

b.doh('x'); b.doh(1.0f); b.doh(new Milhouse()); } } ///:~

Как Вы увидите в следующей главе, такой подход далек от наиболее частого использования при переопределении методов. Нужно использовать метод с тем же именем используя практически ту же сигнатуру и возвращая тот же тип в базовом классе. Если сделать по другому, то это уже не сработает (поэтому то C++ и запрещает такой прием, что бы ограничить программиста в создании новой возможной ошибки).




Начало  Назад  Вперед