Klassenvererbung und Verwendung des Super-Schlüsselworts (JAVA)

Inhaltsverzeichnis

erben

super 

 Unterklassenkonstruktor

Finale


 

erben

Alle OOP- Sprachen weisen drei Merkmale auf:

  1. Verpackung (zum Springen klicken)
  2. erben
  3. Polymorphismus (zum Springen klicken)

Warum gibt es eine Vererbung? Sie können sich zunächst das folgende Beispiel ansehen:

        Die Codes in den beiden oben genannten Klassen sind sehr ähnlich, da nur die letzte Methode unterschiedlich ist und die anderen gleich sind. Diese Definition führt nicht nur zu Coderedundanz, sondern ist auch sehr problematisch. In der OOP-Sprache wird die Vererbung speziell für die Extraktion von Gemeinsamkeiten und die Wiederverwendung von Code verwendet .


Vererbungsmechanismus : Dies ist das wichtigste Mittel für die objektorientierte Programmierung, um Code wiederverwendbar zu machen . Es ermöglicht Programmierern, neue Funktionen auf der Grundlage der Beibehaltung der Eigenschaften der ursprünglichen Klasse zu erweitern und hinzuzufügen und so neue Klassen zu generieren, die als Ableitung bezeichnet werden Art. Vererbung stellt die hierarchische Struktur der objektorientierten Programmierung dar und spiegelt den kognitiven Prozess von einfach bis komplex wider. Das Hauptproblem, das durch Vererbung gelöst wird, ist: die Extraktion von Gemeinsamkeiten und die Realisierung der Code-Wiederverwendung .

Um eine Vererbung in JAVA zu erreichen, müssen Sie das Schlüsselwort „extens“ verwenden .

Die Unterklasse der Modifikatorklasse erweitert die übergeordnete Klasse { // ... }

An dieser Stelle schauen wir uns das nächste Beispiel an. Lehrer und Schüler gehören zur großen Kategorie der Menschen, daher können wir separat eine Personenklasse definieren, um dieselben Attribute und Methoden zusammenzuführen, und dann erben die Schülerklasse und die Lehrerklasse dies Klasse bzw. Klasse. Kategorie:

class People{
    public String name;
    public int age;
    public void speak(){
        System.out.println(this.name+"正在说话");
    }
}

class Teacher extends People{
    public void work(){
        System.out.println(this.name+"正在教书");
    }
}

class Student extends People{
    public void study(){
        System.out.println(this.name+"正在学习");
    }
}
public class Test {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.name = "zhangsan";
        teacher.age = 24;
        teacher.speak();
        teacher.work();
        System.out.println("==========");
        Student student = new Student();
        student.name = "xiaoming";
        student.age = 15;
        student.speak();
        student.study();
    }
}

 Hinweis: Die Unterklasse erbt die Mitgliedsvariablen oder Mitgliedsmethoden in der übergeordneten Klasse an die Unterklasse.

Nun stellt sich also eine neue Frage: Was wird das System tun, wenn die Unterklasse dieselben Eigenschaften oder Methoden wie die übergeordnete Klasse hat?

class People{
    public String name;
    public int age = 25;
    public void speak(){
        System.out.println(this.name+"正在说话");
    }
}

class Teacher extends People{
    public int age = 20;
    public void work(){
        System.out.println(this.name+"正在教书"+"今年"+this.age);
    }
}

public class Test {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.name = "zhangsan";
        teacher.work();

    }
}

Zu diesem Zeitpunkt verfügen sowohl die übergeordnete Klasse als auch die untergeordnete Klasse über das Altersattribut. Nachdem der Code ausgeführt wurde, können Sie sehen, dass das Attribut der untergeordneten Klasse verwendet wird. 

 Zusammenfassen:

  1. Wenn Sie über das Unterklassenobjekt auf die Eigenschaften in der übergeordneten Klasse und der Unterklasse zugreifen , greifen Sie zuerst auf Ihr eigenes zu und suchen Sie dann in der übergeordneten Klasse danach, wenn Sie es nicht haben, und melden Sie einen Fehler, wenn Sie es nicht im haben Elternklasse.
  2. Wenn Sie über das Unterklassenobjekt auf eine Methode mit einem anderen Namen in der übergeordneten Klasse und der untergeordneten Klasse zugreifen, suchen Sie zunächst in der untergeordneten Klasse danach und greifen Sie darauf zu, wenn Sie sie finden. Andernfalls suchen Sie in der übergeordneten Klasse danach und greifen darauf zu, wenn Sie sie finden Finden Sie es, andernfalls kompilieren Sie es und melden Sie einen Fehler.
  3. Wenn Sie über das Unterklassenobjekt auf die Methode mit demselben Namen der übergeordneten Klasse und der Unterklasse zugreifen und die Parameterliste der Methode mit demselben Namen der übergeordneten Klasse und der Unterklasse unterschiedlich ist (Überladung), wählen Sie die entsprechende Methode für den Zugriff aus gemäß den von der aufrufenden Methode übergebenen Parametern und melden Sie einen Fehler, wenn keiner vorhanden ist.

Selbst wenn in der übergeordneten Klasse ein privates geändertes Attribut oder eine private geänderte Methode vorhanden ist, erbt die Unterklasse diese, kann jedoch nicht darauf zugreifen.


super 

Im obigen Beispiel erscheint ein neues Schlüsselwort super. Was macht das Schlüsselwort super?

Die Hauptfunktion dieses Schlüsselworts besteht darin, in der Methode der Unterklasse auf die Mitglieder der übergeordneten Klasse zuzugreifen.

class People{
    public String name;
    public int age = 25;
    public void speak(){
        System.out.println(this.name+"正在说话");
    }
}

class Teacher extends People{
    public int age = 20;
    public void work(){
        System.out.println(this.name+"正在教书"+"今年"+super.age);
    }
}

public class Test {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.name = "zhangsan";
        teacher.work();

    }
}

Da sowohl die übergeordnete Klasse als auch die untergeordnete Klasse über Altersattribute verfügen, können Sie, wenn Sie auf die Eigenschaften der übergeordneten Klasse zugreifen möchten, das Super-Schlüsselwort super+ verwenden, um auf die Eigenschaften und Methoden der übergeordneten Klasse zuzugreifen. (Die dritte Methode zur Verwendung von Super wird weiter unten vorgestellt.)


 

 Unterklassenkonstruktor

Wenn die übergeordnete Klasse zu diesem Zeitpunkt über einen Konstruktor mit Parametern verfügt, meldet das System einen Fehler.

Wenn der übergeordneten Klasse ein Konstruktor mit zwei Parametern hinzugefügt wird, meldet der Code einen Fehler.

Als nächstes möchte ich die dritte Methode zur Verwendung des Super-Schlüsselworts vorstellen:

super();

Es kann den Konstruktor der übergeordneten Klasse aufrufen.

Hinweis: Es muss in der ersten Zeile des Konstruktors platziert werden.

Denn beim Instanziieren eines Objekts gibt es noch zwei weitere wichtige Schritte :

  1. Speicher für das Objekt zuweisen;
  2. Rufen Sie den entsprechenden Konstruktor auf.

Der Grund , warum der obige Code einen Fehler gemeldet hat, nachdem wir den Konstruktor mit Parametern geschrieben haben, liegt darin, dass der Konstruktor der Unterklasse den Konstruktor der übergeordneten Klasse nicht aufgerufen hat. (Wenn wir die Konstruktionsmethode selbst schreiben, stellt uns das System die Konstruktionsmethode nicht mehr zur Verfügung. Wenn das Unterklassenobjekt erstellt wird, müssen wir zuerst die Konstruktionsmethode der übergeordneten Klasse aufrufen und dann die Konstruktionsmethode der Unterklasse ausführen. Wenn wir Wenn Sie die Konstruktionsmethode nicht schreiben, ruft das System standardmäßig die folgende Konstruktionsmethode auf: Wir haben die Konstruktion nur mit Parametern geschrieben, daher meldet das System einen Fehler, da es die Konstruktion ohne Parameter nicht finden kann und wir sie aufrufen müssen wir selbst :)

Die Mitglieder im Unterklassenobjekt bestehen aus zwei Teilen, die von der Basisklasse geerbt und von der Unterklasse neu hinzugefügt werden. Vater und Sohn müssen zuerst den Vater und dann den Sohn haben. Wenn Sie also ein Unterklassenobjekt erstellen, rufen Sie zuerst die Konstruktionsmethode der Basisklasse auf, um die Konstruktion der von der Basisklasse geerbten Mitglieder abzuschließen, und rufen Sie dann die Konstruktionsmethode der Unterklasse selbst auf , wodurch die neu hinzugefügten Mitglieder der Unterklasse vollständig initialisiert werden.

Beachten:

  1. Wenn die übergeordnete Klasse explizit eine Konstruktionsmethode ohne Argumente oder eine Standardkonstruktionsmethode definiert, gibt es in der ersten Zeile der Konstruktionsmethode der Unterklasse standardmäßig einen impliziten super ()-Aufruf, der die Konstruktionsmethode der Basisklasse aufruft.
  2. Wenn die Konstruktionsmethode der übergeordneten Klasse über Parameter verfügt, muss der Benutzer die Konstruktionsmethode für die Unterklasse explizit definieren und den entsprechenden Aufruf der Konstruktionsmethode der übergeordneten Klasse in der Konstruktionsmethode der Unterklasse auswählen, andernfalls schlägt die Kompilierung fehl.
  3. Wenn super(...) in der Unterklassenkonstruktionsmethode die übergeordnete Klassenkonstruktion aufruft, muss dies die erste Anweisung im Unterklassenkonstruktor sein.
  4. super(...) kann im Unterklassenkonstruktor nur einmal und nicht gleichzeitig damit erscheinen.
     

Finale

In JAVA werden nur die folgenden Vererbungsmethoden unterstützt:

  • Einzelvererbung;
  • mehrstufige Vererbung;
  • Verschiedene Klassen erben von derselben Klasse.

Im Allgemeinen möchten wir nicht mehr als drei Vererbungsebenen haben. Wenn es zu viele Vererbungsebenen gibt und diese zu kompliziert sind, müssen wir eine Umgestaltung des Codes in Betracht ziehen.

Wie können wir also verhindern, dass andere sie erben lassen?

JAVA stellt einen Endschlüssel bereit, der zum Ändern von Variablen, Mitgliedsmethoden und Klassen verwendet werden kann.

  • Geänderte Variablen oder Felder, die Konstanten darstellen (d. h. nicht geändert werden können)
  • Geänderte Klasse: Zeigt an, dass diese Klasse nicht vererbt werden kann
  • Geänderte Methode: Zeigt an, dass die Methode nicht überschrieben werden kann

Wir müssen nur die letzte Änderung vor der Klasse verwenden, die nicht vererbt werden soll:



 

Supongo que te gusta

Origin blog.csdn.net/2302_76339343/article/details/132042898
Recomendado
Clasificación