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

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

В иерархии классов часто бывает так, что и в суперклассе, и в подклассе метод с одинаковой сигнатурой и одинаковым возвращаемым значением. В этом случае говорят, что метод суперкласса переопределяется в подклассе. Если переопределенный метод вызывается из подкласса, то получает управление тот вариант метода, который был определен в подклассе. Вариант метода, определенный в суперклассе, оказывается замаскированным. Рассмотрим листинг 3.14.

Листинг 3.14

// Переопределение метода

public class A {

private int i, j;

public A(int a, int b) {

i = a;

j = b;

}

// Отображение i и j

public void show() {

System.out.println("i and j: " + i + " " + j);

}

}

public class B extends A {

private int k;

public B(int a, int b, int c) {

super(a, b);

k = c;

}

// Отображение k; данный метод переопределяет

// метод show() из класса А

public void show() {

System.out.println("k: " + k);

}

}

public class Override {

public static void main(String args[]) {

B subOb = new B(1, 2, 3);

subOb.show(); // Вызов метода show() класса В

}

}

Когда метод show () вызывается посредством ссылки на объект В, управление получает вариант этого метода, определенный в классе В. Таким образом, метод show() в составе класса В переопределяет одноименный метод, определенный в классе А. Если вы хотите обратиться к исходному варианту переопределенного метода, тому, который определен в суперклассе, вам надо использовать ключевое слово super. Например, в приведенном ниже варианте класса В из метода show () взывается вариант того же метода, определенный в суперклассе. При этом отображаются все переменные экземпляра.

Листинг 3.15

public class B extends A {

private int k;

public B(int a, int b, int c) {

super(a, b);

k = c;

}

public void show() {

// Использование ключевого слова super для

// вызова метода show(), определенного в классе А

super.show();

System.out.println("k: " + k);

}

}

Если вы замените новой модификацией метода show() метод с тем же именем из предыдущей программы, то выходные данные изменятся и будут иметь следующий вид:

i and j: 1 2

k: 3

где super.show () – это вызов метода show(), определенного в суперклассе.

Переопределение метода происходит только в том случае, если сигнатуры переопределяемого и переопределяющего метода совпадают. В противном случае происходит обычная перегрузка методов. Рассмотрим приведенную ниже модификацию предыдущего примера(листинг 3.16).

Листинг 3.16

// Методы с разными сигнатурами не переопределяются, а перегружаются

public class A {

private int i, j;

public A(int a, int b) {

i = a;

j = b;

}

// Отображение i и j

public void show() {

System.out.println("i and j: " + i + " " + j);

}

}

// Создание подкласса, расширяющего класс А

public class B extends A {

private int k;

public B(int a, int b, int c) {

super(a, b);

k = c;

}

// Поскольку сигнатуры данного метода

// и метода show() из класса А различаются,

// вместо переопределения происходит перегрузка

public void show(String msg) {

System.out.println(msg + k);

}

}

public lass Overload {

public static void main(String args[]) {

B subOb = new B(1, 2, 3);

subOb.show("This is k: "); // Вызов метода show() из B

subOb.show(); // Вызов метода show() из A

}

}

На этот раз в варианте метода show(), принадлежащем классу В, предусмотрен строковой параметр. Сигнатура метода отличается от сигнатуры метода show() из класса А, для которого параметры не предусмотрены. В результате переопределение не происходит.

Задание:

Переопределите методы для вывода всех полей.