Super słowo kluczowe Java (z przykładami)

W tym samouczku dowiemy się o słowie kluczowym super w Javie na podstawie przykładów.

Słowo superkluczowe w Javie jest używane w podklasach w celu uzyskania dostępu do elementów składowych nadklasy (atrybutów, konstruktorów i metod).

Zanim poznamy supersłowo kluczowe, upewnij się, że wiesz o dziedziczeniu w Javie.

Wykorzystuje słowo kluczowe super

  1. Aby wywołać metody z nadklasy, która jest nadpisana w podklasie.
  2. Dostęp do atrybutów (pól) nadklasy, jeśli zarówno nadklasa, jak i podklasa mają atrybuty o tej samej nazwie.
  3. Do jawnego wywoływania superklasy no-arg (domyślne) lub konstruktora sparametryzowanego z konstruktora podklasy.

Rozumiemy każde z tych zastosowań.

1. Dostęp do metod nadpisanych klasy nadrzędnej

Jeśli metody o tej samej nazwie są zdefiniowane zarówno w nadklasie, jak i podklasie, metoda w podklasie zastępuje metodę w nadklasie. Nazywa się to przesłanianiem metody.

Przykład 1: Nadpisywanie metody

 class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) ) 

Wynik

 jestem psem 

W tym przykładzie, tworząc obiekt dog1 klasy Dog, możemy wywołać jego metodę printMessage (), która następnie wykonuje display()instrukcję.

Ponieważ display()jest zdefiniowana w obu klasach, metoda podklasy Dog zastępuje metodę nadklasy Animal. Stąd display()nazwa podklasy.

A jeśli trzeba będzie wywołać nadpisaną metodę superklasy?

Używamy, super.display()jeśli display()ma zostać wywołana nadpisana metoda superklasy Animal.

Przykład 2: super do wywołania metody nadklasy

 class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( // this calls overriding method display(); // this calls overridden method super.display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) ) 

Wynik

 Jestem psem Jestem zwierzęciem 

Oto jak działa powyższy program.

2. Dostęp do atrybutów superklasy

Nadklasa i podklasa mogą mieć atrybuty o tej samej nazwie. Używamy supersłowa kluczowego, aby uzyskać dostęp do atrybutu nadklasy.

Przykład 3: Dostęp do atrybutu nadklasy

 class Animal ( protected String; ) class Dog extends Animal ( public String; public void printType() ( System.out.println("I am a " + type); System.out.println("I am an " + super.type); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printType(); ) ) 

Wyjście :

 Jestem ssakiem Jestem zwierzęciem 

W tym przykładzie zdefiniowaliśmy ten sam typ pola instancji zarówno w nadklasie Animal, jak i podklasie Dog.

Następnie stworzyliśmy obiekt dog1 z klasy Dog. Następnie printType()metoda jest wywoływana przy użyciu tego obiektu.

Wewnątrz printType()funkcji

  • typ odnosi się do atrybutu podklasy Dog.
  • super.type odnosi się do atrybutu superklasy Animal.

Stąd System.out.println("I am a " + type);odciski Jestem ssakiem. I System.out.println("I am an " + super.type);odciski Jestem zwierzęciem.

3. Użycie super () w celu uzyskania dostępu do konstruktora nadklasy

Jak wiemy, gdy tworzony jest obiekt klasy, automatycznie wywoływany jest jego domyślny konstruktor.

Aby jawnie wywołać konstruktor nadklasy z konstruktora podklasy, używamy super(). To specjalna forma supersłowa kluczowego.

super() może być używany tylko wewnątrz konstruktora podklasy i musi być pierwszą instrukcją.

Przykład 4: Użycie super ()

 class Animal ( // default or no-arg constructor of class Animal Animal() ( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // default or no-arg constructor of class Dog Dog() ( // calling default constructor of the superclass super(); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) ) 

Wynik

 Jestem zwierzęciem Jestem psem 

Tutaj, kiedy tworzony jest obiekt dog1 klasy Dog, automatycznie wywołuje domyślny konstruktor lub konstruktor no-arg tej klasy.

Wewnątrz konstruktora podklasy super()instrukcja wywołuje konstruktora nadklasy i wykonuje zawarte w niej instrukcje. W ten sposób otrzymujemy wynik Jestem zwierzęciem.

Następnie przepływ programu wraca do konstruktora podklasy i wykonuje pozostałe instrukcje. Zatem jestem psem zostanie wydrukowany.

Jednak używanie super()nie jest obowiązkowe. Nawet jeśli super()nie jest używany w konstruktorze podklasy, kompilator niejawnie wywołuje domyślny konstruktor nadklasy.

Po co więc używać nadmiarowego kodu, jeśli kompilator automatycznie wywołuje super ()?

Jest to wymagane, jeśli sparametryzowany konstruktor (konstruktor pobierający argumenty) nadklasy ma być wywołany z konstruktora podklasy.

Sparametryzowana super()musi zawsze być pierwszą instrukcją w treści konstruktora podklasy, w przeciwnym razie otrzymamy błąd kompilacji.

Przykład 5: Wywołanie konstruktora sparametryzowanego przy użyciu super ()

 class Animal ( // default or no-arg constructor Animal() ( System.out.println("I am an animal"); ) // parameterized constructor Animal(String type) ( System.out.println("Type: "+type); ) ) class Dog extends Animal ( // default constructor Dog() ( // calling parameterized constructor of the superclass super("Animal"); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) ) 

Wynik

 Typ: Zwierzę Jestem psem 

Kompilator może automatycznie wywołać konstruktor no-arg. Jednak nie może wywoływać konstruktorów sparametryzowanych.

Jeśli ma zostać wywołany konstruktor sparametryzowany, musimy jawnie zdefiniować go w konstruktorze podklasy.

Zwróć uwagę, że w powyższym przykładzie jawnie nazwaliśmy sparametryzowany konstruktor super("Animal"). W tym przypadku kompilator nie wywołuje domyślnego konstruktora nadklasy.

Interesujące artykuły...