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

Тема 3.3 Конструкторы и наследование

В иерархии наследования и суперклассы, и подклассы могут иметь конструкторы, В связи с этим возникает важный вопрос: какой из конструкторов отвечай за формирование экземпляра класса: конструктор этого класса, конструктор суперкласса или они оба? Ответ звучит так: конструктор суперкласса формирует часть объекта, соответствующую суперклассу, а конструктор подкласса – остальные части. Данное решение вполне оправдано, поскольку суперкласс не имеет сведений об элементах подкласса и не может обращаться к ним. Таким образом конструкторы должны работать независимо друг от друга. В примерах, рассмотренных выше, использовались конструкторы по умолчанию, автоматически создаваемые исполняющей системой Java, и их действия были скрыты от пользователя. Однако на практике для большинства классов конструкторы определяются явно. Сейчас мы рассмотрим, как следует поступать в подобных ситуациях.

Когда конструктор определен только в подклассе, его использование не вызывает вопросов: надо лишь обычным образом сформировать объект. При этом часть объекта, соответствующая суперклассу, будет создана автоматически с использованием конструктора по умолчанию. В качестве примера рассмотрим модифицированную версию класса Triangle, в котором определен конструктор, поскольку переменная style устанавливается конструктором, она объявлена как private(листинг 3.5).

Листинг 3.5

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

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

public class TwoDShape {

private double width; // Теперь эти переменные

private double height; // объявлены как private

// Методы доступа к переменным 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) {

// Инициализация части объекта,

// соответствующей классу TwoDShape

setWidth(w);

setHeight(h);

style = s;

}

public double area() {

return getWidth() * getHeight() / 2;

}

public void showStyle() {

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

}

}

public class Shapes3 {

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, помимо поля style, инициализирует также унаследованные члены класса TwoDClass.

Если конструктор объявлен и в подклассе, и в суперклассе, то процесс их использования несколько сложнее. Это связано с тем, что оба конструктора должны получить управление. В таком случае приходит на помощь ключевое слово super, которое используется в двух формах. С помощью первой формы вызывается конструктор суперкласса. Вторая форма используется для доступа к членам суперкласса, маскируемым членами подкласса. Рассмотрим первое применение ключевого слова super.

Задание:

Добавьте конструктор в класс Кот