[JAVA] Kopieren Sie die Quelle und fügen Sie sie in die Klassenentwicklung ein ...? Das ist nein! Lassen Sie uns über "Vererbung" wissen!

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.

Grundlagen der Vererbung

1. Das Problem des Kopierens bei der Entwicklung einer ähnlichen Klasse

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.

2. Auflösung durch Vererbung

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.

3. Wie man eine Vererbungsbeziehung ausdrückt

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)

4. Vererbungsschwankungen

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). ** ** **

5. Überschreiben

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.

6. Verbot der Vererbung und Außerkraftsetzung

--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()....

Aussehen der Instanz

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.

1. Eine Methode aufrufen

2. Zugriff auf den übergeordneten Instanzteil

◎ 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

Kopieren Sie die Quelle und fügen Sie sie in die Klassenentwicklung ein ...? Das ist nein! Lassen Sie uns über "Vererbung" wissen!
Informationen zu next () und nextLine () der Scannerklasse
Informationen zur Klassenvererbung.
Unterschiede zwischen Klassen und Instanzen in Ruby
Informationen zum Laden und Initialisieren von Klassen beim Start der JVM
[Ruby] Klassenverschachtelung, Vererbung und die Grundlagen des Selbst