Słowo kluczowe super jest używane w różnych sytuacjach. Aby lepiej zrozumieć ten post zachęcamy, żeby najpierw zapoznać się z dziedziczeniem w Javie.
Co robi słowo kluczowe Super w Java?
Super konstrukcja, której można użyć do wywołania przesłoniętych metod lub do odwoływania się do ukrytych pól klasy nadrzędnej (nadklasy).Dlaczego i kiedy używać słowa kluczowego super?
Słowo kluczowe super w Javie ma trzy konkretne zastosowania.- Dostęp do pól danych klasy nadrzędnej, gdy podklasa posiada pola o tej samej nazwie.
- Wywołanie domyślnych lub sparametryzowanych konstruktorów klasy nadrzędnej w podklasie.
- Wywołanie metod klasy nadrzędnej w podklasie, jeżeli klasa podrzędna przesłania metody.
Przykład 1. — Dostęp do pól danych nadklasy
Przykład 1. ilustruje jak z podklasy Car można uzyskać dostęp do atrybutów i pól danych nadklasy Vehicle. Uruchom poniższy fragment kodu, aby dobrze to zrozumieć.
class Vehicle {
String name = "vehicle";
}
class Car extends Vehicle {
String name = "car";
public void printMyName() {
System.out.println(name);
}
public void printParentName() {
// use super keyword to access
// parent's data member / attribute
System.out.println(super.name);
}
public static void main(String[] args) {
Car myCar = new Car();
System.out.print("My Car's Name: ");
myCar.printMyName();
// printing the parent's name
// using the super keyword
System.out.print("My Parent Vehicle's Name: ");
myCar.printParentName();
}
}
Wyjście:
Nazwa mojego samochodu: samochód
Nazwa mojego nadrzędnego pojazdu: pojazd
Przykład 2. — Dostęp do konstruktorów klasy nadrzędnej z podklasy
Jawne wywołanie super() pozwala uzyskać dostęp do domyślnych lub sparametryzowanych konstruktorów klasy nadrzędnej z poziomu podklasy. Oto przykład sparametryzowanego konstruktora. Konstruktor nadklasy Shape jest wywoływany (za pomocą super()) z podklasy Triangle, aby ustawić atrybuty. Uruchom poniższy program, aby samodzielnie przetestować dane wyjściowe.
public class Shape {
String name;
public Shape(String n) {
System.out.println("Shape() parameterized constructor called!");
name = n;
}
}
class Triangle extends Shape {
int sides = 3;
String color;
public Triangle(String n, String c) {
// The super keyword calls the parameterized
// constructor of the parent (Shape) with
// 'n' as a parameter
super(n);
System.out.println("Triangle() parameterized constructor called!");
this.color = c;
}
public static void main(String[] args) {
Triangle myTriangle = new Triangle("Triangle Alpha", "Yellow");
System.out.println(myTriangle.name);
System.out.println(myTriangle.color);
}
}
Wyjście:
Wywołano sparametryzowany konstruktor Shape()!
Wywołano sparametryzowany konstruktor Triangle()!
Trójkąt Alfa
Żółty
Szybkie wyzwanie: Przeprojektuj powyższy program używając domyślnego konstruktora, aby sprawdzić swoją wiedzę. Sprawdź też, czym różni się super() od super(arg).
Przykład 3. — Dostęp do przesłoniętych metod klasy nadrzędnej z podklasy
Przykład 3. pokazuje jak uzyskać dostęp do metod nadklasy, które są zdefiniowane również w podklasie. W poniższym programie nadklasa Sound ma zdefiniowaną metodę voice(). Podklasa Drum również posiada metodę o nazwie voice(). Oznacza to, że metoda voice jest przesłonięta przez podklasę. Uruchom poniższy program, aby dowiedzieć się, jak słowo kluczowe super pozwala wywołać metodę klasy nadrzędnej z poziomu podklasy.
public class Sound {
public void voice() {
System.out.println("Play sound!");
}
}
class Drum extends Sound {
public void voice() {
System.out.println("Play drums!");
}
public void play() {
// The super keyword calls the
// voice() method of the parent
super.voice();
voice();
}
public static void main(String[] args) {
Drum myDrum = new Drum();
myDrum.play();
}
}
Wyjście:
Play sound!
GO TO FULL VERSION