Java: руководство для начинающих (ЛП) - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Если конструктор определен только в подклассе, то все происходит очень просто: конструируется объект подкласса, а родительская часть объекта автоматически конструируется конструктором суперкласса, используемым по умолчанию. В качестве примера ниже приведен переработанный вариант класса Triangle, в котором определяется конструктор, а член style этого класса делается закрытым, так как теперь он устанавливается конструктором.// Добавление конструктора в класс Triangle.// Класс, описывающий двумерные объекты,class TwoDShape { private double width; // Теперь эти переменные private double height; // объявлены как закрытые. // Методы доступа к переменным экземпляра width и height. double getWidth() { return width; } double getHeight() { return height; } void setWidth(double w) { width = w; } void setHeight(double h) { height = h; } void showDim() { System.out.println("Width and height are " + width + " and " + height); }}// Подкласс, производный от класса TwoDShape,// для представления треугольников,class Triangle extends TwoDShape { private String style; // Конструктор. Triangle(String s, double w, double h) { // Инициализация родительской части объекта, // соответствующей классу TwoDShape. setWidth(w); setHeight(h); style = s; } double area() { return getWidth() * getHeightO / 2; } void showStyle() { System.out.println("Triangle is " + style); }}class Shapes3 { public static void main(String args[]) { Triangle tl = new Triangle("isosceles", 4.0, 4.0); Triangle t2 = new Triangle("right", 8.0, 12.0); System.out.println("Info for tl: "); tl.showStyle(); tl.showDim(); System.out.println ("Area is " + tl.areaO); 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.Применение ключевого слова super для вызова конструктора суперкласса
Для вызова конструктора суперкласса служит следующая общая форма ключевого слова super:super (список_параметров);
где список_параметров обозначает параметры, необходимые для нормальной работы конструктора суперкласса. Вызов конструктора super () должен быть первым оператором в теле конструктора подкласса. Для того чтобы лучше понять особенности вызова super (), рассмотрим вариант класса TwoDShape из следующего примера программы, где определен конструктор, инициализирующий переменные экземпляра width и height:// Добавление конструкторов в класс TwoDShape.class TwoDShape { private double width; private double height; // Параметризированный конструктор объектов класса TwoDShape. TwoDShape(double w, double h) { width = w; height = h; } // Методы доступа к переменным экземпляра width и height. double getWidth() { return width; } double getHeight() { return height; } void setWidth(double w) { width = w; } void setHeight(double h) { height = h; } void showDim() { System.out.println("Width and height are " + width + " and " + height); }}// Подкласс, производный от класса TwoDShape,// для представления треугольников,class Triangle extends TwoDShape { private String style; Triangle(String s, double w, double h) { // Использование оператора super () для вызова // конструктора класса TwoDShape. super(w, h); // вызвать конструктор суперкласса style = s; } double area() { return getWidth() * getHeight() / 2; } void showStyle() { System.out.println("Triangle is " + style); }}class Shapes4 { public static void main(String args[]) { Triangle tl = new Triangle("isosceles", 4.0, 4.0); Triangle t2 = new Triangle("right", 8.0, 12.0); System.out.println("Info for tl: ") ; tl.showStyle(); tl.showDim(); System.out.println ("Area is " + tl.areaO); 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, содержащих конструкторы по умолчанию и конструкторы, принимающие один или более аргумент.// Добавление дополнительных конструкторов в класс TwoDShape.class TwoDShape { private double width; private double height; // Конструктор по умолчанию. TwoDShape() { width = height = 0.0; } // Параметризированный конструктор. TwoDShape(double w, double h) { width = w; height = h; } // Конструирование объекта с одинаковыми значениями // переменных экземпляра width и height. TwoDShape(double х) { width = height = x; } // Методы доступа к переменным экземпляра width и height. double getWidth() { return width; } double getHeight() { return height; } void setWidth(double w) { width = w; } void setHeight(double h) { height = h; } void showDim() { System.out.println("Width and height are " + width + " and " + height); }}// Подкласс, производный от класса TwoDShape,.// для представления треугольников,class Triangle extends TwoDShape { private String style; // Использование оператора super () для вызова // разных вариантов конструктора TwoDShape() . // Конструктор по умолчанию. Triangle() { super(); // вызвать конструктор суперкласса по умолчанию style = "null"; } // Параметризированный конструктор. Triangle(String s, double w, double h) { super(w, h); // вызвать конструктор суперкласса с двумя аргументами style = s; } // Конструктор с одним аргументом. Triangle(double х) { super(х); // вызвать конструктор суперкласса с одним аргументом style = "isosceles" } double area() { return getWidth() * getHeight() / 2; } void showStyle() { System.out.println("Triangle is " + style); }}class Shapes5 { public static void main(String args[]) { Triangle tl = new Triangle(); Triangle t2 = new Triangle("right", 8.0, 12.0); Triangle t3 = new Triangle(4.0); tl = t2; System.out.println("Info for tl: "); tl.showStyle(); tl.showDim(); System.out.println ("Area is " + tl.areaO); 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(); }}
Выполнение этой версии программы дает следующий результат:Info for tl:Triangle is rightWidth and height are 8.0 and 12.0Area is 48.0Info for t2:Triangle is rightWidth and height are 8.0 and 12.0Area is 48.0Info for t3:Triangle is isoscelesWidth and height are 4.0 and 4.0Area is 8.0