Dies ist der 4. Tag von Stylez Adventskalender 2016. Im Frühjahr 2016 war ich noch ein Java-Anfänger und habe zum ersten Mal etwas über Vererbung gelernt ... Dies ist der Artikel, den ich damals zusammengefasst habe.
Wenn Sie ein großes Programm schreiben, müssen Sie möglicherweise eine Klasse erstellen, die der zuvor erstellten ähnlich ist. In einem solchen Fall treten die folgenden Nachteile auf, wenn Sie den Originalcode kopieren und einfügen und eine neue Funktion hinzufügen.
Eine Funktion namens ** Vererbung ** ermöglicht es, ähnliche Klassen zu erstellen und gleichzeitig die Nachteile zu vermeiden, die beim Erstellen ähnlicher Klassen durch Kopieren und Einfügen auftreten.
Klasse erben und erstellen.java
//Klasse, die Sie erben möchten
Public class Hero {
private String name = "Mutig";
Private int hp = 100;
//Flucht
public void run(){
System.out.println(name + "Entkam!");
}
}
//Ich möchte die Heldenklasse erben und ein stärkerer Held werden ...
Public Class SuperHero extends Hero { //Punkt 1
public void attack(Matango m){
System.out.println(name + "Attacke!");
m.hp -= 5;
System.out.println("Verursachte 5 Schadenspunkte!");
}
}
Eine Klasse mit Vererbung definieren.java
Klasse Klassenname erweitert Ursprünglicher Klassenname{
Mit der Elternklasse"Unterschied"Mitglied
}
Daher kann in der SuperHero-Klasse, die die Hero-Klasse erbt, nicht nur die in der SuperHero-Klasse definierte attack () -Methode, sondern auch die run () -Methode der Hero-Klasse aufgerufen werden.
Im Beispiel wurde die SuperHero-Klasse durch Erben der Hero-Klasse erstellt. Die Beziehung zwischen diesen beiden Klassen wird als ** Vererbungsbeziehung ** bezeichnet, und die Vererbungsbeziehung kann wie folgt ausgedrückt werden.
Held (Elternklasse, Superklasse)
↑
Superheld (Kinderklasse, Unterklasse)
Vererbung kann auch viele untergeordnete Klassen basierend auf einer übergeordneten Klasse definieren. ** Es ist jedoch nicht möglich, eine untergeordnete Klasse zu definieren, die mehrere übergeordnete Klassen erbt (Mehrfachvererbung). ** ** **
Wenn Sie ein in der übergeordneten Klasse definiertes Mitglied in der untergeordneten Klasse neu definieren möchten, können Sie das Mitglied der übergeordneten Klasse mit der untergeordneten Klasse überschreiben. Es heißt ** überschreiben **.
** ◎ Mitglieder, die in Kinderklassen unter Verwendung der Vererbung deklariert wurden ** (1) Wenn die übergeordnete Klasse nicht dasselbe Mitglied hat, wird dieses Mitglied ein "hinzugefügtes" Mitglied. (2) Wenn die übergeordnete Klasse dasselbe Mitglied hat, wird dieses Mitglied zu einem Mitglied, das "überschrieben" werden soll.
--Klassen mit final zum Zeitpunkt der Deklaration können nicht vererbt werden.
Klassen, die nicht vererbt werden können.java
public final class String extends Object....
Methoden, die nicht überschrieben werden können.java
public final void slip()....
SuperHero-Klasse auf Basis der Vererbung erstellt ... Diese Instanz enthält eine Hero-Instanz und hat insgesamt eine ** Doppelstruktur **. Lassen Sie uns unter Berücksichtigung dieser Struktur verschiedene Aufrufe und Funktionsprinzipien verstehen.
Wenn eine Methode von außerhalb der Instanz aufgerufen wird, versucht die mehrstrukturierte Instanz, ** der Methode des untergeordneten Instanzteils zu entsprechen, der sich so weit wie möglich außerhalb befindet **. Beispiel) Wenn die Methode run () sowohl der übergeordneten Klasse Hero als auch der untergeordneten Klasse SuperHero entspricht, entspricht der Aufruf von run () SuperHeros run ().
Im obigen Beispiel funktioniert die run () -Methode von ** Hero nicht mit einem externen Aufruf **
◎ Verwenden Sie das Feld des übergeordneten Instanzteils
super.Feldname
◎ Rufen Sie die Methode des übergeordneten Instanzteils auf
#### **`super.Methodenname(Streit)`**
```Methodenname(Streit)
--super.run () ruft die run () -Methode des übergeordneten Instanzteils auf. Wenn Sie jedoch run () schreiben, hat dies dieselbe Bedeutung wie "this.run ()" und run (), die Sie selbst definiert haben. Rufen Sie die Methode auf.
* Wenn drei Klassen, A-Klasse (Großeltern), B-Klasse (Eltern) und C-Klasse (Selbst), eine Vererbungsbeziehung haben, kann die Klasse C auf die Klasse B der Elternklasse zugreifen, aber zur Klasse A wechseln, bei der es sich um die Großeltern handelt. Es kann nicht direkt zugegriffen werden.
# Vererbung und Konstruktor
### 1. So erstellen Sie eine Klasse mithilfe der Vererbung
Beim Erstellen einer Instanz der SuperHero-Klasse, die die Hero-Klasse erbt, wird der SuperHero-Konstruktor aufgerufen. Tatsächlich wird zu diesem Zeitpunkt auch der geerbte Hero-Konstruktor aufgerufen.
→ ** Java hat die Regel, dass "alle Konstruktoren am Anfang den Konstruktor des internen Instanzteils aufrufen müssen" **, sodass dieses Verhalten ausgeführt wird.
- Ursprünglich müssen Sie super (Argument) in die erste Zeile des Konstruktors schreiben.
--Wenn der Programmierer vergisst, super (Argument) zu schreiben, fügt der Compiler automatisch super () hinzu;
### 2. Situation, in der der übergeordnete Instanzteil nicht erstellt werden kann
Wie in "1. So erstellen Sie eine Klasse mithilfe der Vererbung" erläutert, wird super (); automatisch hinzugefügt, auch wenn Sie vergessen haben, sie zu schreiben.
Das automatisch generierte super () versucht jedoch, den Konstruktor der übergeordneten Klasse ohne Argumente aufzurufen.
Wenn zu diesem Zeitpunkt kein Konstruktor vorhanden ist, der ohne Argument im Konstruktor aufgerufen werden kann, der in der übergeordneten Instanz vorhanden ist, kann kein Konstruktor aufgerufen werden, und dies verursacht einen Fehler.
### 3. Geben Sie das Konstruktorargument der internen Instanz an.
Der Aufruf schlug fehl, weil es keinen Konstruktor gab, der ohne Argumente aufgerufen werden konnte. Was ist zu tun ...
◎ Geben Sie das Argument an, wenn Sie den Konstruktor aufrufen.
```public item (string name){ ```
Wenn Sie den Konstruktor aufrufen möchten, können Sie den Konstruktor korrekt aufrufen, indem Sie ein Argument wie super ("nur ein Balken") verwenden.
Achten Sie zu diesem Zeitpunkt auf die Art und Anzahl der Argumente des aufzurufenden Konstruktors.
# Richtige Vererbung, falsche Vererbung
### 1. ist ein Prinzip
Die korrekte Vererbung ist ** Vererbung, die einer Regel folgt, die als "Ist-Prinzip" bezeichnet wird **
◎ ist eine Beziehung
Untergeordnete Klasse ist eine übergeordnete Klasse (untergeordnete Klasse ist eine Art übergeordnete Klasse)
A ist-a B bedeutet "A ist eine Art von B"
Versuchen Sie, beim Erben einen Satz von is-a zu bilden, und wenn dies unnatürlich ist, ist die Vererbung falsch.
◎ Regeln für die Verwendung der Vererbung
Wenn das Prinzip von is-a nicht gilt, sollten Sie die Vererbung nicht verwenden, auch wenn Sie dies problemlos tun können.
### 2. Warum sollten Sie nicht die falsche Vererbung durchführen?
Es gibt zwei Gründe, warum Sie keine Vererbung verwenden sollten, die keine is-a-Beziehung ist.
- Wenn Sie in Zukunft die Klasse erweitern, wird es einen Konflikt mit der realen Welt geben.
――Weil Sie "Diversity", die letzte der drei wichtigsten objektorientierten Funktionen, nicht verwenden können.
### 3. Generalisierungs- / Spezialisierungsbeziehung
Durch die is-a-Beziehung verbunden zu sein bedeutet, dass je mehr Kinderklassen sind, desto "spezieller und konkreter" sie sind und je mehr Elternklassen sind, desto "allgemeiner, abstrakter und mehrdeutiger". Es wird auf "Dinge" verallgemeinert (verallgemeinert).
――Wenn Sie sich spezialisieren, können Sie Felder und Methoden detailliert definieren, und die Anzahl der Mitglieder erhöht sich.
――Es wird schwierig, detaillierte Felder und Methoden zu definieren.
Vererbung ist sowohl ein "Werkzeug zum Reduzieren doppelter Codebeschreibungen" als auch ein Werkzeug zum "Zeigen, dass zwei Klassen eine Spezialisierungs- / Generalisierungsbeziehung haben".
Recommended Posts