Вызов конструкторов суперкласса в Java с помощью ключевого слова super

Вызов конструкторов суперкласса в Java с помощью ключевого слова super

Из подкласса можно вызывать конструктор, определенный в его суперклассе, используя следующую форму ключевого слова super:

super(_);

где список_аргументов определяет любые аргументы, требующиеся конструкто­ру в суперклассе. Вызов метода super() всегда должен быть первым оператором, выполняемым в конструкторе подкласса.

В качестве примера, демонстрирующего применение метода super(), рассмо­трим следующую версию класса BoxWeight:

//     
//    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 объявлены в классе Вох как закрытые.

//    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();

    }
}

Эта программа выводит следующий результат:

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:

//   
BoxWeight(BoxWeight ob) { //   
    super(ob);
    weight = ob.weight;
}

Обратите также внимание на то, что методу super() передается объект типа BoxWeight, а не Вох. Но это все равно приводит к вызову конструктора Вох(Вox.ob).

Как отмечалось ранее, переменную из суперкласса можно использоватьдля ссылки на любой объект, унаследованный от этого класса.

Таким образом, объ­ект класса BoxWeight можно передать конструктору Вох(). Разумеется, классу Вох будут доступны только его собственные члены.

Советуем вам следующее видео для закреплении знаний:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *