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

Тема 3.4 Использование ключевого слова super для вызова конструктора суперкласса

Для вызова конструктора суперкласса применяется выражение следующего типа:

super (список_параметров);

где список параметров содержит параметры, необходимые для работы конструктора суперкласса. Вызов super () должен быть первым выражением в теле конструктора подкласса. Для того чтобы лучше понять особенности вызова super.

Рассмотрим вариант класса TwoDShape из следующей программы, в котором определен конструктор, инициализирующий переменные width и height(листинг 3.6).

Листинг 3.6

// Добавление конструкторов к классу TwoDShape

public class TwoDShape {

private double width;

private double height;

// Конструктор с параметрами

public TwoDShape(double w, double h) {

width = w;

height = h;

}

// методы доступа к переменным width и height

public double getWidth() {

return width;

}

public double getHeight() {

return height;

}

public void setWidth(double w) {

width = w;

}

public void setHeight(double h) {

height = h;

}

public void showDim() {

System.out.println("Width and height are "

+ width + " and " + height);

}

}

// Подкласс класса TwoDShape, представляющий треугольники

public class Triangle extends TwoDShape {

private String style;

public Triangle(String s, double w, double h) {

// Использование выражения super() для вызова

// конструктора TwoDShape

super(w, h); // Вызов конструктора суперкласса

style = s;

}

public double area() {

return getWidth() * getHeight() / 2;

}

public void showStyle() {

System.out.println("Triangle is " + style);

}

}

public class Shapes4 {

public static void main(String args[]) {

Triangle t1 = new Triangle("isosceles", 4.0, 4.0);

Triangle t2 = new Triangle("right", 8.0, 12.0);

System.out.println("Info for t1: ");

t1.showStyle();

t1.showDim();

System.out.println("Area is " + t1.area());

System.out.println();

System.out.println("Info for t2: ");

t2.showStyle();

t2.showDim();

System.out.println("Area is " + t2.area());

}

}

В конструкторе Triangle присутствует вызов super () с параметрами w и h. В результате управление получает конструктор TwoDShape(), инициализирующий переменные width и height значениями, переданными в качестве параметров. Теперь класс Triangle уже не занимается инициализацией элементов суперкласса. Он должен инициализировать только собственную переменную style. Конструктору TwoDShape() предоставляется возможность сформировать соответствующий подобъект так, как предусмотрено в данном классе. Более того, разработчик может реализовать в TwoDShape функциональность, о которой не будут знать существующие подклассы. Это делает код более устойчивым к ошибкам.

Любой конструктор суперкласса вызывается посредством ключевого слова super. При этом конкретный вариант конструктора выбирается по соответствию параметров. Например, ниже приведена расширенная версия классов TwoDShape и Triangle, содержащих конструктор по умолчанию и конструктор, получающий одно значение (листинг 3.7).

Листинг 3.7

/ Дальнейшее добавление конструкторов к классу TwoDShape

public class TwoDShape {

private double width;

private double height;

// Конструктор по умолчанию

public TwoDShape() {

width = height = 0.0;

}

// Конструктор с параметрами

public TwoDShape(double w, double h) {

width = w;

height = h;

}

// Конструирование объекта с одинаковыми

// Значениями width и height

public TwoDShape(double x) {

width = height = x;

}

// Методы доступа к переменным width и height

public double getWidth() {

return width;

}

public double getHeight() {

return height;

}

public void setWidth(double w) {

width = w;

}

public void setHeight(double h) {

height = h;

}

public void showDim() {

System.out.println("Width and height are "

+ width + " and " + height);

}

}

// Подкласс класса TwoDShape, представляющий треугольники

public class Triangle extends TwoDShape {

private String style;

// Конструктор по умолчанию

public Triangle() {

// Использование выражения super() для обращения

// к различным вариантам конструктора TwoDShape()

super();

style = "null";

}

// Конструктор

public Triangle(String s, double w, double h) {

// Использование выражения super() для обращения

// к различным вариантам конструктора TwoDShape()

super(w, h); // Вызов конструктора суперкласса

style = s;

}

// Конструктор, формирующий равнобедренный треугольник

public Triangle(double x) {

// Использование выражения super() для обращения

// к различным вариантам конструктора TwoDShape()

super(x); // Вызов конструктора суперкласса

style = "isosceles";

}

public double area() {

return getWidth() * getHeight() / 2;

}

public void showStyle() {

System.out.println("Triangle is " + style);

}

}

public class Shapes5 {

public static void main(String args[]) {

Triangle t1 = new Triangle();

Triangle t2 = new Triangle("right", 8.0, 12.0);

Triangle t3 = new Triangle(4.0);

t1 = t2;

System.out.println("Info for t1: ");

t1.showStyle();

t1.showDim();

System.out.println("Area is " + t1.area());

System.out.println();

System.out.println("Info for t2: ");

t2.showStyle();

t2.showDim();

System.out.println("Area is " + t2.area());

System.out.println();

System.out.println("Info for t3: ");

t3.showStyle();

t3.showDim();

System.out.println("Area is " + t3.area());

System.out.println();

}

}

Давайте еще раз вспомним основные свойства вызова super(). Когда данный вызов присутствует в конструкторе подкласса, управление получает конструктор его непосредственного суперкласса. Таким образом, вызывается конструктор того класса, который непосредственно породил вызывающий класс. Это справедливо и при многоуровневой иерархии. Кроме того, вызов super() должен быть первым выражением в теле конструктора подкласса.

Задание:

Добавьте конструктор в класс Животные и измените в классе Кот