1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-thinking-in-java-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
7.3 覆盖与重载.md 4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 11.03.2025 09:15 d56454c

7.3 Наследование и переопределение

Рассмотрим первый пример этой главы с другого ракурса. В следующем программном коде интерфейс метода play() изменяется в процессе его переопределения. Это означает, что мы фактически не "переопределяем" метод, а "перегружаем" его. Компилятор позволяет нам использовать перегрузку метода, не выдавая ошибку компиляции. Однако это поведение может не соответствовать нашим ожиданиям. Вот сам пример:

//: WindError.java
// Непреднамеренное изменение интерфейса

class NoteX {
  public static final int
    MIDDLE_C = 0, C_SHARP = 1, C_FLAT = 2;
}

class InstrumentX {
  public void play(int NoteX) {
    System.out.println("InstrumentX.play()");
  }
}

class WindX extends InstrumentX {
  // ОШИБКА! Изменяет интерфейс метода:
  public void play(NoteX n) {
    System.out.println("WindX.play(NoteX n)");
  }
}

public class WindError {
  public static void tune(InstrumentX i) {
    // ...
    i.play(NoteX.MIDDLE_C);
  }
  public static void main(String[] args) {
    WindX flute = new WindX();
    tune(flute); // Не желательное поведение!
  }
} ///:~
```Этот пример также демонстрирует ещё одну концепцию, которая может вызвать путаницу. В классе `InstrumentX`, метод `play()` принимает целое число (`int`) с идентификатором `NoteX`. То есть, даже если `NoteX` является именем класса, его можно использовать как идентификатор без ошибки компиляции. В классе `WindX`, метод `play()` принимает объект типа `NoteX` с идентификатором `n`. Даже если бы мы использовали `play(NoteX NoteX)`, компилятор всё равно не выдал бы ошибку. Таким образом, кажется, будто бы программист намеренно переопределил метод `play()`, но тип параметра был указан некорректно. Тем не менее, компилятор считает, что программист намеренно использует "перегрузку", а не "переопределение". Обратите внимание на различие между этими двумя терминами. "Перегрузка" означает использование одного имени для различных вариантов метода; "переопределение" же означает замену существующего метода новым, который имеет тот же самый интерфейс.Если придерживаться стандартной нотации Java, то идентификатор параметра должен быть `noteX`, чтобы отличать его от имени класса.

В методе `tune`, объект `InstrumentX i` отправляет сообщение `play()` и передает член класса `NoteX` (например, `MIDDLE_C`). Поскольку `NoteX` содержит определение типа `int`, версия перегруженного метода `play()` с параметром типа `int` будет вызываться. Так как этот метод ещё не был переопределен, используется версия базового класса.

Выходные данные будут следующими:

InstrumentX.play()


Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-thinking-in-java-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-thinking-in-java-zh.git
oschina-mirror
wizardforcel-thinking-in-java-zh
wizardforcel-thinking-in-java-zh
master