Ключевое слово super
1. Использование ключевого слова super
Ключевое слово super в Java используется тогда, когда подклассу требуется сослаться на его непосредственный супер класс.
У ключевого слова super имеются две общие формы:
- Для вызова конструктора супер класса:
super(списокАргументов);
- Для обращения к члену супер класса, скрываемому членом подкласса:
suреr.member;
2. Вызов конструкторов супер класса с помощью ключевого слова super
Если в иерархии классов требуется передать параметры конструктору супер класса, то все подклассы должны передавать эти параметры вверх по иерархии. То есть из конструктора подкласса надо вызвать конструктор супер класса с помощью super()
. Когда метод super()
вызывается из подкласса, вызывается конструктор его непосредственного супер класса. Это справедливо даже для многоуровневой иерархии.
Вызов метода super()
должен быть всегда в первом операторе, выполняемом в теле конструктора подкласса.
В этом примере из конструктора класса HeavyBox1
вызываем конструктора класса Box6
с помощью 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 UseSuperExample {
public static void main(String[] args) {
D d = new D("someString", 2);
d.print();
System.out.println(d.i);
}
}
Вывод на консоль:
D.i = someString
C.i = 2
someString
Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.