Fassen Sie die Java-Vererbung zusammen (Java Silver 8)

00. Einleitung

Ich wusste nicht viel über Java-Vererbung. Ich dachte, ich wüsste es irgendwie, aber ich habe es irgendwie nicht verstanden, ja. : unschuldig:

In diesem Artikel möchte ich die Java-Vererbung vorstellen, die ich persönlich erlebt habe: "Ich wusste", aber "Ich habe nicht". Ich hoffe, es hilft Ihnen, die Java-Vererbung zu verstehen.

Hinweis

    1. Dieser Artikel wurde als Teil Ihres Lernens geschrieben, um sich für Java Silver8 zu qualifizieren. Daher gibt es möglicherweise keine Beschreibung für Funktionen, die nicht dem Test unterzogen werden.
  1. In diesem Artikel wird derzeit keine Schnittstelle erwähnt (wird es sein).
    1. Der Ausdruck "Ich weiß nicht" kommt heraus, aber es geht nur darum, die Prüfungsfragen zu lösen [^ 5].

01. Zusammenfassung

coming soon

02. Was ist Vererbung überhaupt?

Vererbung ist ** "Erstellen (Definieren) einer neuen Klasse basierend auf einer vorhandenen Klasse" **. In diesem Moment, Vererbungsklasse: ** Superklasse ** oder ** Basisklasse ** -Ererbte Klasse: ** Unterklasse ** oder ** Abgeleitete Klasse ** (In diesem Artikel verwenden wir den Ausdruck Superklasse / Unterklasse).

Im folgenden Beispiel erstellen wir eine Cat-Klasse aus einer Mammals-Klasse.

//Super Klasse
class Mammals { }

//Unterklasse
class Cat extends Mammals { }

Das ist alles für die Vererbung. Es ist einfach!

... Ich weiß das! Ich weiß jedoch nicht, was mit der Vererbung passieren wird (besonders ich).

Ab dem nächsten Kapitel vier Perspektiven, auf die ich persönlich achte

    1. ** Grundregeln der Vererbung **
  1. ** Geerbte Klasse besetzen **
    1. ** Vererbung und Accessoren **
  2. ** Geerbter Klassenkonstruktor ** Ich werde die Vererbung separat einführen.

Teil 1: Grundregeln der Vererbung

1.1 Es kann nur eine Oberklasse geerbt werden

Beispielsweise führt eine Deklaration wie ↓ zu einem Kompilierungsfehler.

//Superklasse Teil 1
class Mammals { }

//Superklasse Teil 2
class Reptiles { }

//Unterklasse
class Cat extends Mammals, Reptiles { }

1.2 Abstrakte Methoden müssen in konkreten Klassen überschrieben werden

Siehe den Code unten. Die abstrakte Klasse Mammals verfügt über abstrakte Methoden zum Essen, Gehen und konkreten Schlafmethoden. Die Cat-Klasse, die Säugetiere erbt, überschreibt die Geh- und Schlafmethoden.

Mammals.java


public abstract class Mammals {
  public abstract void eat();
  public abstract void walk();
  public void sleep() {}
}

Cat.java


public class Cat extends Mammals {
  public void walk() {}
  public void sleep() {}
}

Nun, der Code in ↑, aber wenn ich ihn kompiliere, erhalte ich eine Fehlermeldung (wenn Sie ihn mit einem Editor wie Eclipse, VSCode betrachten, besteht kein Zweifel daran, dass er hellrot ist).

Der Grund ist, wie zu erwarten, dass ** die abstrakten Methoden der abstrakten Klasse in der konkreten Klasse nicht überschrieben werden **. Dieses Mal erhalte ich einen Kompilierungsfehler, weil ich Mammals 'eat () in Cat nicht überladen habe. Überschreiben Sie alle abstrakten Methoden [^ 20].

Teil 2: Besetzung der geerbten Klasse

2.1 Das Umwandeln in eine nicht geerbte Klasse führt zu einem Kompilierungsfehler

Der folgende Code erbt von der Mammals-Klasse, um die Cat- und Dog-Klassen zu erstellen.

class Mammals { }  //Säugetierklasse
class Cat extends Mammals { }  //Katzenklasse
class Dog extends Mammals { }  //Hundeklasse

public class Main {
  public static void main(String[] args) {
    Cat catA = new Cat();
    Dog dogA = new Dog();

    //Wirf eine Instanz vom Typ Katze in den Typ Säugetiere
    Mammals mammals = (Mammals) catA;  // OK
    //Wirf eine Instanz vom Typ Katze in den Typ Hund
    Dog dogB = (Dog) catA;  //NG-Kompilierungsfehler
  }
}

Java ** prüft auch **, ob es zur Kompilierungszeit umgewandelt werden kann (= Umwandlung in eine Klasse mit einer Vererbungsbeziehung) **. Es handelt sich also um einen Kompilierungsfehler, nicht um einen Laufzeitfehler!

Code, der im Allgemeinen nicht umgewandelt werden kann, nicht nur Vererbung, führt zu einem Kompilierungsfehler.

Teil 3: Vererbung und Accessoren

3.1 Vererbte Klassenmethoden können keinen engen Offenlegungsbereich haben

Der folgende Code führt zu einem Kompilierungsfehler. Wenn Sie die Mammals-Klasse erben und die Eat-Methode in der Cat-Klasse überschreiben, ist der Offenlegungsbereich strenger als die ursprüngliche Eat-Methode.

class Mammals { 
  void eat() {}
} 
class Cat extends Mammals {
  private void eat() {}
}

Informationen zu Accessor <Referenz 1 Zitiert von S. 175 mit einigen Änderungen>

Im Folgenden werden häufig verwendete Methodenzugriffsmethoden (Zugriffsmodifikatoren) aufgeführt.

//Streng ← Offenlegungsbereich → Lose
   private   protected   /*(Kein Accessor)*/   public
Accessor Erläuterung
private Nur innerhalb derselben Klasse verfügbar
protected Verfügbar für Klassen im selben Paket oder für Klassen, die die Zielklasse erben
(Kein Accessor) Nur in Klassen im selben Paket verfügbar
public Erhältlich in jeder Klasse

Teil 4: Vererbungsklassenkonstruktor (unerwartet beeindruckend)

4.1 Vererbung, die nicht von der Superklasse geerbt werden kann

Selbst wenn Sie es erben, können Sie es nicht erben ** Private Felder und Methoden (einschließlich Konstruktoren) ** ist!

4.2 Beachten Sie die Ausführungsreihenfolge des Konstruktors

Oben sagte ich: "Selbst wenn Sie erben, kann der Konstruktor nicht geerbt werden", aber es gibt etwas zu beachten. Das heißt, ** der Konstruktor der Oberklasse wird ausgeführt **, bevor der Konstruktor der Unterklasse ausgeführt wird.

Siehe den Code unten. Es gibt Klassen A, B, C, in denen C B und B A erbt. In jedem Konstruktor wird der Klassenname an die Konsole ausgegeben (der Code wird in einigen verschiedenen Formaten aus Referenz 2 zitiert).

A.java


class A {
  public A() { 
    System.out.print("A"); 
  }
}

class B extends A {
  public B() { 
    System.out.print("B"); 
  }
}

class C extends B {
  public C() { 
    System.out.print("C");
  }
}

public class Main {
  public static void main(String[] args) {
    new C();  // ABC
  }
}

Und hast du gesehen, was passiert, wenn du dieses main () ausführst ... Ja, ** A-, B-, C-Konstruktoren laufen alle! !! ** ** **

... Es tut mir leid, ich habe übertrieben [^ 30].

Die ganze Erklärung ist, warum dies passiert, aber ich möchte aus Referenz 3 S.429 zitieren.

In Java gilt die Regel:" Alle Konstruktoren müssen zu Beginn den Konstruktor des inneren Instanzteils (= übergeordnete Klasse) aufrufen. " [^ 35]

Mit anderen Worten, unter Berücksichtigung des tatsächlichen Erscheinungsbilds und der Ausführungsreihenfolge des vorherigen Codes

A.java


class A {
  public A() { 
    System.out.print("A");   //  3
  }
}

class B extends A {
  public B() { 
    super();  //Rufen Sie den Konstruktor von A 2 auf
    System.out.print("B");   //  4
  }
}

class C extends B {
  public C() { 
    super();  //Rufen Sie den Konstruktor 1 von B auf
    System.out.print("C");  // 5
  }
}

public class Main {
  public static void main(String[] args) {
    new C();  //C 0 instanziieren
  }
}

Wenn B () ausgeführt wird, wenn C () aufgerufen wird, wird A () innerhalb von B () usw. aufgerufen, und so erbt die erbende Klasse eine andere Klasse. Versuche zuerst, den Konstruktor der geerbten Klasse auszuführen.

Wenn Sie innerhalb der Unterklasse den Konstruktor der Oberklassenklasse nicht aufgerufen haben, fügt der Compiler automatisch super () [^ 37] [^ 40] hinzu!

Jedoch,

Unterklassenkonstruktoren nennen Superklassenkonstruktoren ... Selbst wenn Sie das wissen, werden Sie enttäuscht sein, wenn Sie den Konstruktor einer Klasse aufrufen, die oft so geerbt wird.

4.3 Ein solcher Konstruktoraufruf ist nutzlos

In Verbindung mit "02. Beachten Sie die Ausführungsreihenfolge der Konstruktoren" erscheint auch ein solcher Trigger. das ist, ** Code, der den Superklassenkonstruktor doppelt aufruft, führt zu einem Kompilierungsfehler ** darüber.

Schauen Sie sich zunächst den folgenden Code an! (Siehe Referenz 2, S. 362-363, mit einigen Formatänderungen)

Säugetierklasse


public class Mammals {
  String name;
  int age;
  public Mammals(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

Katzenklasse


class Cat extends Mammals {
  String color
  publip Cat(String color) {
    this.color = color;
  }
  public Cat(String name, int num, String color) {
    super(name, num);
    this(color);
  }
}

Hauptklasse


public class Main {
  public static void main(String[] args) {
    Cat cat1 = new Cat("white");
    Cat cat2 = new Cat("mike", 2, "Black");

   System.out.println(cat1.name + ", " + "" + "")

  }
}

Was halten Sie von diesem Code, dem Compiler? Die richtige Antwort ist ein Kompilierungsfehler in den Zeilen 3 und 8 der cat class!

Um zu sehen warum, nehmen wir an, dass dieser Code ausgeführt wurde und folgen dem Prozess für jede generierte Instanz!

① Prozess zum Generieren der cat1-Instanz Da es ein Argument wie "Cat cat1 = new Cat (" white ");" gibt, wird "publip Cat (String color)" ausgeführt. Vor ... erbt Cat von Mammals, sodass der Konstruktor von Mammals ausgeführt wird.

  String color
  publip Cat(String color) {
    super();  //Wird beim Kompilieren automatisch hinzugefügt
    this.color = color;
  }

Die Mammals-Klasse verfügt jedoch nicht über einen Konstruktor ohne Argumente public Mammals ();! Wenn Sie versuchen, eine nicht vorhandene Methode auszuführen, wird in der Zeile "publip Cat (String color)" [^ 45] ein Fehler angezeigt.

② Prozess zum Generieren der cat2-Instanz Dieses Mal erstellen wir eine Instanz mit 3 Argumenten. Daher wird der entsprechende Konstruktor unten ausgeführt!

  public Cat(String name, int num, String color) {
    super(name, num);
    this(color);
  }

Zunächst wird der Superklassenkonstruktor "publip Cat (String color)" ausgeführt. Dies ist kein Problem, wie es existiert.

Aber der Code in der nächsten Zeile, diesmal mit dem Cat-Klassenkonstruktor "publip Cat (String color)". Ich denke, dass der gleiche Fehler wie in ① auftreten wird, aber ich werde in eine andere Art von Kompilierungsfehler geraten.

Der Grund ist, dass Sie den Konstruktor der Oberklasse zweimal aufrufen werden.

In Java ist es nicht möglich, den überladenen Konstruktor nach dem Aufruf des Konstrukts der Oberklasse aufzurufen. `[^ 50]

Dieses Mal ist "publip Cat (String color)" der überladene Konstruktor. Dies geschah nach super ();, was zu einem Fehler führte.

Im eigentlichen Test im Konstruktor

super();
this();

Wenn ich mir den Code ansehe, erhalte ich einen Kompilierungsfehler im Teil this ();! Es scheint gut zu erinnern!

05. Endlich

Vielen Dank für das Lesen bis zum Ende.

06. Referenz

    1. Michiko Yamamoto (2015) "Java Programmer Silver SE 7 (5. Auflage)" Herausgegeben von Shosuisha Co., Ltd.
  1. Sumito Shiga (2019) "Gründliche Erfassung der Korrespondenz mit Java SE 8 Silver Problem Collection [1Z0-808]" Herausgegeben von Impress Co., Ltd.
    1. Kiyotaka Nakayama / Daigo Kunimoto (2018) "Einführung in Java, die klar verstanden werden kann 2. Auflage" Herausgegeben von Impress Co., Ltd.

[^ 5]: Normalerweise sagt es Ihnen der Editor oder Compiler, es spielt also keine Rolle, ob Sie es nicht verstehen, aber wenn Sie es selbst bemerken müssen, können Sie das nicht sagen! Es bedeutet. [^ 20]: Abgesehen davon können abstrakte Methoden nur in abstrakten Klassen definiert werden. Wenn Sie die Methode nicht in der Cat-Klasse implementieren, empfiehlt es sich, auch die Cat-Klasse anzuhängen. [^ 30]: Ich habe es übertrieben geschrieben. [^ 35]: Referenz 3 Ab S.429 [^ 37]: Es ist nicht so, dass der Code alleine erscheint. Der Code wird nur in dem in super () geschriebenen Text kompiliert. [^ 40]: Erstens handelt es sich um eine Interpretation, ob Sie den Konstruktor der Superklasse ausführen müssen. Wenn der Konstruktor jedoch eine Methode zum Generieren dieser Klasse ist, ist dies die Basis vor dem Erstellen der Unterklasse. Ist es ein Ort, an dem Sie sich auf die Klasse vorbereiten müssen, in der Sie sich befinden (= Superklasse)? [^ 45]: Der Java-Compiler prüft auch, ob die Methode, die Sie ausführen möchten, vorhanden ist, sodass sie als Kompilierungsfehler behandelt wird! [^ 50]: Referenz 2 Ab S.416

Recommended Posts

Fassen Sie die Java-Vererbung zusammen (Java Silver 8)
Informationen zur Vererbung (Java Silver)
[Java] Vererbung
Java-Vererbung
Java-Vererbung
Java (Vererbung)
[Java] Klassenvererbung
Java Silver Memo
Über Java-Vererbung
Studieren Sie Java Silver 1
[Java] Überladen / Überschreiben / Vererbung
Java SE8 Silver bestanden
Java Bronze Silber bestanden
Java Silver Study Day 1
Java Silver Passing Erfahrung
[Java] Java SE 8 Silver Note
[Java Silver] Informationen zur Initialisierung
Ein Memorandum der Java8 Silver-Prüfung
[Java] Implizites Vererbungsprotokoll
Java-Lernnotiz (Vererbung)
Zusammenfassung der erweiterten Vererbung, Schnittstelle -java
Vererbung der JAVA-Lernverlaufsschnittstelle
[Erfahrung] Java SE 8 Silver bestanden
JAVA Silver Qualifikationsprüfungsprotokoll
Java Silver Lernmethode Memo
Java Silver Prüfungsvorbereitungsnotiz
[Java Silver] Über gleich Methode
Java SE8 Silver Passing Erfahrung
Java ab Anfänger, Vererbung
[Java] Was ist Klassenvererbung?
Java (Vererbung von is-ein Prinzip)
[Java Silver] So generieren Sie ein Array
So lernen Sie Java Silver SE 8
Muskel Java Objektorientierter Tag 2 ~ Vererbung ~
[Hinweis] Java Silver SE8-Qualifikation erworben
Erbe
Zusammenfassung des Pakets [Java Silver Study]
Holen Sie sich Java Silver in Ihrer Pendelzeit!
Straße nach Java SE 11 Silberakquisition
Erbe
In Java Silver gefallen (weinend)
Java Silver Repo (Failure & Pass-Erfahrung)
Java
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
So übergeben Sie Oracle Java Silver
Java
Was ich mit Java Silver gelernt habe
Tagebuch für Java SE 8 Silber Qualifikation
Ich habe jetzt versucht, Java 8 zusammenzufassen
[Qualifikation] Java Silver SE11 Passing Experience
[Java Silver] Zusammenfassung der Zugriffsmodifikatorpunkte
Wie man die Java Silver Prüfung ablegt und wie man lernt
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Java SE8 Silber ~ Der Weg zum Pass ~
Verwendung der Submit-Methode (Java Silver)
Oracle Certified Java Silver SE 8 Passing-Erfahrung
Java Silver Exam Reservation Vollständiger Strategie-Leitfaden
Java SE 8 Silver (Java SE 8 Programmer I) Pass Hinweis
Unerfahrene Lernmethode, um Java Silver 11 zu erhalten