Из подкласса можно вызывать конструктор, определенный в его суперклассе, используя следующую форму ключевого слова super:
1 |
super(список_аргументов); |
где список_аргументов определяет любые аргументы, требующиеся конструктору в суперклассе. Вызов метода super() всегда должен быть первым оператором, выполняемым в конструкторе подкласса.
В качестве примера, демонстрирующего применение метода super(), рассмотрим следующую версию класса BoxWeight:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
// В этой программе наследование применяется // для расширения класса Box class Box { double width; double height; double depth; // сконструировать клон объекта Box(Box ob) { // передать объект конструктору width = ob.width; height = ob.height; depth = ob.depth; } // конструктор, применяемый при указании всех размеров Box(double w, double h, double d) { width = w; height = h; depth = d; } // конструктор, применяемый в отсутствие размеров Box() { width = -1; // значение -1 служит для обозначения height = -1; // неинициализированного depth = -1; // параллелепипеда } // конструктор, применяемый при создании куба Box(double len) { width = height = depth = len; } // рассчитать и возратить объекм double volume() { return width * height * depth; } } // теперь в классе BoxWeight ключевое слово super используется // для инициализации собственных свойств объекта типа Box class BoxWeight extends Box { double weight; // вес параллелепипеда // инициализировать поля width, height и depth // с помощью метода super() BoxWeight(double w, double h, double d, double m) { super(w, h, d); // вызвать конструктор суперкласса weight = m; } } |
В данном примере метод super() вызывается с аргументами w, h и d из метода BoxWeight(). Это приводит к вызову конструктора Вох(), в котором поля width, height и depth инициализируются передаваемыми ему значениями соответствующих параметров.
Теперь эти значения не инициализируются в самом классе BoxWeight. В нем остается только инициализировать его собственное поле weight. В итоге эти поля могут, если требуется, оставаться закрытыми в классе Вох.
В приведенном выше примере метод super() вызывался с тремя аргументами. Конструкторы могут быть перегружаемыми, и поэтому метод super() можно вызывать, используя любую форму, определяемую в суперклассе.
Выполнен будет тот конструктор, который соответствует указанным аргументам. В качестве примера ниже приведена полная реализация класса BoxWeight, предоставляющая конструкторы для разных способов создания параллелепипедов.
В каждом случае метод super() вызывается с соответствующими аргументами. Обратите внимание на то, что члены width, height и depth объявлены в классе Вох как закрытые.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
// Полная версия класса BoxWeight class Box { private double width; private double height; private double depth; // сконструировать клон объекта Box(Box ob) { // передать объект конструктору width = ob.width; height = ob.height; depth = ob.depth; } // конструктор, применяемый при указании всех размеров Box(double w, double h, double d) { width = w; height = h; depth = d; } // конструктор, применяемый в отсутствие размеров Box() { width = -1; // значение -1 служит для обозначения height = -1; // неинициализированного depth = -1; // параллелепипеда } // конструктор, применяемый при создании куба Box(double len) { width = height = depth = len; } // рассчитать и возратить объекм double volume() { return width * height * depth; } } // теперь в классе BoxWeight ключевое слово super используется // для инициализации собственных свойств объекта типа Box class BoxWeight extends Box { double weight; // вес параллелепипеда // сконструировать клон объекта BoxWeight(BoxWeight ob) { // передать объект конструктору super(ob); weight = ob.weight; } // конструктор, применяемый при указании всех параметров BoxWeight(double w, double h, double d, double m) { super(w, h, d); // вызвать конструктор из суперкласса weight = m; } // конструктор, применяемый по умолчанию BoxWeight() { super(); weight = -1; } // конструктор, применяемый при создании куба BoxWeight(double len, double m) { super(len); weight = m; } } class DemoSuper { public static void main(String args[]) { BoxWeight mbox1 = new BoxWeight(15, 18, 23, 455.4); BoxWeight mbox2 = new BoxWeight(1, 4, 9, 0.0333); BoxWeight mbox3 = new BoxWeight(); // вызывается конструктор по умолчанию BoxWeight mboxcube = new BoxWeight(5, 9); BoxWeight mboxclone = new BoxWeight(mbox2); double vol; vol = mbox1.volume(); System.out.println("Объем mbox1 равен " + vol); System.out.println("Вес mbox1 равен " + mbox1.weight); System.out.println(); vol = mbox2.volume(); System.out.println("Объем mbox2 равен " + vol); System.out.println("Вес mbox2 равен " + mbox2.weight); System.out.println(); vol = mbox3.volume(); System.out.println("Объем mbox3 равен " + vol); System.out.println("Вес mbox3 равен " + mbox3.weight); System.out.println(); vol = mboxclone.volume(); System.out.println("Объем mboxclone равен " + vol); System.out.println("Вес mboxclone равен " + mboxclone.weight); System.out.println(); vol = mboxcube.volume(); System.out.println("Объем mboxcube равен " + vol); System.out.println("Вес mboxcube равен " + mboxcube.weight); System.out.println(); } } |
Эта программа выводит следующий результат:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
pro-jav.ru@admin:~$ javac box.java pro-jav.ru@admin:~$ java DemoSuper Объем mbox1 равен 6210.0 Вес mbox1 равен 455.4 Объем mbox2 равен 36.0 Вес mbox2 равен 0.0333 Объем mbox3 равен -1.0 Вес mbox3 равен -1.0 Объем mboxclone равен 36.0 Вес mboxclone равен 0.0333 Объем mboxcube равен 125.0 Вес mboxcube равен 9.0 pro-jav.ru@admin:~$ |
Обратите особое внимание на следующий конструктор из класса BoxWeight:
1 2 3 4 5 |
// сконструировать клон объекта BoxWeight(BoxWeight ob) { // передать объект конструктору super(ob); weight = ob.weight; } |
Обратите также внимание на то, что методу super() передается объект типа BoxWeight, а не Вох. Но это все равно приводит к вызову конструктора Вох(Вox.ob).
Как отмечалось ранее, переменную из суперкласса можно использоватьдля ссылки на любой объект, унаследованный от этого класса.
Таким образом, объект класса BoxWeight можно передать конструктору Вох(). Разумеется, классу Вох будут доступны только его собственные члены.