Ключевое слово super в Java

1. Использование ключевого слова super

Ключевое слово super в Java используется когда подклассу требуется сослаться на его непосредственный суперкласс.

У ключевого слова super имеются две общие формы:

  1. Для вызова конструктора суперкласса:
    super(списокАргументов);​
  2. Для обращения к члену суперкласса, скрываемому членом подкласса:
    suреr.member;​

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

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

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

В этом примере из конструктора класса HeavyBox1 вызываем конструктора класса Box6 c помощью super(), тем самым передавая необходимые значения:

public class Box6 {
    double width;
    double height;
    double depth;

    Box6(double w, double h, double d) {
        width = w;
        height = h;
        depth = d;
    }

    public Box6() {
    }
}
public class HeavyBox1 extends Box6 {
    int weight;

    public HeavyBox1(int width, int height, int depth, int weight) {
        super(width, height, depth);
        this.weight = weight;
    }

    public HeavyBox1() {
        this.weight = -1;
    }
}

Если в конструкторе наследника нет явного вызова super(), как например во втором конструкторе класса HeavyBox1, JVM сама его подставляет первой строкой:

public HeavyBox1() {
    super();
    this.weight = -1;
}

Из этого следует, что суперкласс должен иметь конструктор без параметров, иначе возникнет ошибка компиляции.

3. Обращения к члену суперкласса с помощью ключевого слова super

С помощью ключевого слова super можно обратиться к члену суперкласса из класса наследника. Чаще всего это можно сделать не используя super, но в этом примере рассмотрим случаи, когда без него не обойтись.

В классе С объявлена переменная i типа int. В его наследнике классе D, тоже объявлена переменная i, но типа String. (Сразу же предупредим - на практике не стоит так делать! Пример приводится с целью иллюстрирования применение ключевого слова super с переменными.) Из класса D мы можем напрямую обратиться только к переменной String i, которая перекрывает область видимости переменной int i. Для обращения же к int i, необходимо использовать слово super.

Похожая ситуация и с методами. В обоих классах определен метод print(). Если мы хотим из класса D вызвать метод print() класса С, используем слово super - super.print().

public class C {
    public int i;
    public void print() {
        System.out.println("C.i = " + i);
    }
}

public class D extends C {
    public String i;

    public D(String a, int b) {
        i = a;
        super.i = b;
    }

    public void print() {
        System.out.println("D.i = " + i);
        super.print();
    }
}


public class UseSuper {
    public static void main(String[] args) {
        D d = new D("someString", 2);
        d.print();
        System.out.println(d.i);
    }
}
Read also:
Comments