[Java] Ich habe Polymorphismus studiert, daher werde ich zusammenfassen, wie man ihn verwendet und welche Vorzüge er hat.

Einführung

Von nun an werde ich Qiita mitteilen, was ich gelernt habe, um meine Fähigkeiten zu verbessern. Diesmal über Java-Polymorphismus. Da sowohl Java als auch Qiita Anfänger sind, die über hervorragende Kenntnisse verfügen, kann es zu Fehlern kommen. Es wäre hilfreich, wenn Sie es mir damals sagen könnten.

Sprache und Betriebssystem

Dieser Artikel verwendet Java 11.0.6, das unter Windows installiert ist.

Was ist Polymorphismus?

Es ist eine Funktion, die die Entwicklung erleichtert, indem sie das Objekt grob erfasst. Zum Beispiel sind "Rosen", "Sonnenblumen" und "Tulpen" ** im Detail **, obwohl sie unterschiedlich gewachsen sind, haben sie alle den gleichen Blühpunkt, wenn Wasser gegeben wird. Daher haben wir eine ** grobe Art **, diese drei Arten als "Blumen" zu betrachten, und wenn wir wissen, dass es sich um "Blumen" handelt, werden wir sie vorerst gießen. Es ist ** Polymorphismus **, dass diese Denkweise auch in Programmen verwendet wird.

Verwenden Sie Polymorphismus im Programm

Es gibt keine spezielle Möglichkeit, es zu schreiben, schreiben Sie einfach die Aufgabe.

Substitution ist so

Assignment.java


int num1 = 100;
int num2 = 200;
num1 = num2;

String str = "Polymorphismus";

Es geht darum, Variablen und Literale in Variablen einzufügen.

Wenn ich es tatsächlich schreibe, sieht es so aus.

Tataisei.java


Flower f2 = new Rose();

Es gibt eine Klasse namens Rose im Klassentyp Flower. Mit anderen Worten, es gibt eine Rose-Instanz in der Blumenbox. ** Im Detail ist es ** Rose, aber ** ungefähr ** wird es nicht als Blume betrachtet.

Das Folgende ist ein Beispiel, bei dem der Polymorphismus nicht richtig verwendet wird.

Tataisei.java


Flower f2 = new Doctor();
Rose f3 = new Flower();

Schauen Sie sich zuerst die erste Zeile an. Es ist seltsam, dass die Flower-Box eine Doctor-Instanz enthält. Der Arzt ist keine Blume. Für die zweite Codezeile wurde der Klassenname umgekehrt. Es wird gesagt, dass diese Schachtel Rose enthält, und wenn ich mir den Inhalt ansehe, sieht es so aus, als gäbe es eine abstrakte Sache namens Blume.

Der Trick, um Polymorphismus richtig zu verwenden, besteht darin, zu sehen, ob er eine "ist-ein" -Beziehung hat. Mal sehen, ob es heißt "Klassenname der erstellten Instanz ist ein Klassenname der Variablen". In diesem Fall ist "Rose ist eine Blume" die richtige Beziehung.

Was passiert bei der Verwendung von Polymorphismus?

Änderungen an aufrufbaren Methoden

Der Polymorphismus ermöglichte es uns, eine grobe Vorstellung von der Instanz zu bekommen. Wenn Sie dies verwenden, werden "Rose", "Sonnenblume" und "Tulpe" angewiesen (Methode), "um 8 Uhr morgens, wenn Wasser gegeben wird, wird es absorbieren und blühen. Wenn nicht gegeben ..." ), Aber wenn Sie eines der rauen Dinge anweisen, die "Blumen" genannt werden, spielen die darin enthaltenen Instanzen ** ihre jeweiligen Rollen **.

Wenn Sie es jedoch als grobe Idee betrachten, treten die folgenden Probleme auf. Schauen Sie sich die beiden folgenden Codes an.

Flower.java


public abstract class Flower {
    String name;
    String color;
    public void bloom() {
        System.out.println("this.name + "Ist" + this.color + "Blühte in Farbe");
    }
}

Rose.java


public class Rose extends Flower {
    int thron;
    public void cutThorn() {
        System.out.println(this.name + "Dornen" + this.thron + "In Stücke schneiden");
    }

Rose ist im Grunde die gleiche wie die Blumenklasse, hat aber einige Dornen. Wenn Sie Extends als Code verwenden, erbt es Flower und es werden seine eigenen charakteristischen Dornen und Methoden für sie geschrieben. Als Bild ist die Art der Schachtel Blume und es scheint, dass Rose darin ist. Wenn Sie Rose instanziieren, sollten Sie natürlich die Methode cutThron () verwenden können. Lass es uns tatsächlich benutzen.

Main.java


Rose r = new Rose();
Flower f = r;
f.bloom();
f.cutThron();

… Eigentlich funktioniert dieser Code bis zur 3. Zeile einwandfrei, aber in der 4. Zeile tritt ein Kompilierungsfehler auf. Es ist seltsam, dass Sie eine Rose-Instanz erstellt haben sollten. ..

Die Ursache hierfür ist die erste Zeile mit Polymorphismus. Schließlich weiß der Computer nur, dass sich ** eine Art Blume in einer Schachtel namens Blume ** befindet. Wenn Sie es in eine Box legen, können Sie den Inhalt nicht sehen.

Mit anderen Worten, da die Flower-Klasse ursprünglich eine bloom (); -Methode hat, kann vom Computer aus festgestellt werden, dass bloom () derzeit nicht verwendet werden kann, da es sich in einer Box namens ** Flower befindet. Da wir jedoch den detaillierten Inhalt der Box (Blumentyp) nicht kennen, können wir nicht feststellen, dass es sich bei der in der Flower-Box enthaltenen Instanz um eine Rose-Instanz handelt, die cutThron () verwenden kann. Infolgedessen wird ein Kompilierungsfehler angezeigt, da Sie etwas nicht tun können, das nicht sicher ist.

Vorteile der Verwendung von Polymorphismus

An diesem Punkt denke ich, dass die Anzahl der Methoden, die für den Polymorphismus verwendet werden können, abnimmt, was unpraktisch ist. Polymorphismus hat jedoch Vorteile, die über diese Unannehmlichkeiten hinausgehen. In diesem Abschnitt werden die Vorteile beschrieben. Der erste ist ** der Code ist sauberer, wenn er mit einem Array kombiniert wird **, und der zweite ist ** jede Instanz erledigt ihre Arbeit mit nur einer Anweisung **. Schauen wir uns ein konkretes Beispiel an. Betrachten Sie im folgenden Code Rose, SunFlower und Tulip als Erbe von Flower, das über eine bloom () -Methode verfügt.

Mit einem Array kombinieren

Wenn Sie den Code ohne Verwendung von Polymorphismus schreiben, sieht er zunächst wie folgt aus.

Main.java


public class Main {
    poublic static void main(String[] args) {
        Rose r = new Rose();
        r.bloom();
        SunFlower s = new SunFlower();
        s.bloom();
        Tulip t = new Tulip;
        t.bloom();

Und als nächstes kommt der Code, den ich mit Polymorphismus geschrieben habe.

Main.java


public class Main {
    public static void main(String[] args) {
        Flower[] f = new Flower[3];
        f[0] = new Rose();
        f[1] = new SunFlower();
        f[2] = new Tulip();
        for (Flower fl : f) {
            fl.bloom();
        }
    }
}

… In diesem Beispiel ändert sich die Anzahl der Zeilen nicht wesentlich und ich bekomme keinen ordentlichen Eindruck, aber lol, wenn die Anzahl der Blumentypen oder die Anzahl der Methoden, die ich in Zukunft hinzufügen möchte, zunimmt, nimmt die Anzahl der Zeilen mit der früheren Schreibmethode stetig zu. Ich werde. Es kann auch schwierig sein, mehrere Variablen zu verwalten. Wenn Sie also wie bei letzteren Instanzen wie Rose in einem Flower-Array gruppieren und grob als Flower erfassen, müssen Sie nur Elemente hinzufügen, also Code, auch wenn die Anzahl der Blumentypen und -methoden in Zukunft zunimmt Sie können ordentlich schreiben.

Machen Sie die Arbeit für jede Instanz, auch wenn Sie eine grobe Idee haben

Bisher war der Inhalt von bloom () für alle Instanzen gleich. In Wirklichkeit blüht jedoch jede Blume anders. In Rose beispielsweise verzweigt sich ein Stiel mehrmals und blüht mehrere Blüten, in SunFlower blüht jedoch nur eine Blume an einem Stiel. Nehmen wir vor diesem Hintergrund an, Sie überschreiben bloom () für jede Instanz. Normalerweise müssen Sie bloom () in Main.java für die Anzahl der Instanzen schreiben. Wenn es jedoch aufgrund von Polymorphismus in Flower zusammengefasst wird, müssen wir bloom () nur einmal anweisen **, und jede Instanz führt ihre eigene bloom () aus. Dies ist möglicherweise leichter zu verstehen, wenn Sie sich den Code ansehen. Der Befehl von hier lautet nur einmal bloom (). Wenn dies ausgeführt wird, verzweigt die Rose-Instanz den Stiel und lässt mehrere Blumen blühen, und die Sun Flower-Instanz lässt nur eine große Blume blühen, ohne den Stiel zu verzweigen. Darüber hinaus hat es seine eigene einzigartige Art zu blühen.

Main.java


public class Main {
    public static void main(String[] args) {
        Flower[] f = new Flower[3];
        f[0] = new Rose();
        f[1] = new SunFlower();
        f[2] = new Tulip();
        for (Flower fl : f) {
            f1.bloom();
        }
    }
}

Mit anderen Worten, selbst wenn wir Rose und SunFlower grob als Blumen betrachten und "blühen!" Befehlen, blühen Rose und SunFlower auf ihre eigene einzigartige Art zu blühen.

Zusammenfassung

Kurz gesagt, "Polymorphismus" ist eine wunderbare Funktion, die es uns Menschen auf der befehlenden Seite ermöglicht, sich zu amüsieren. Lol Es ist eine schwierige Funktion, die nur durch einmaliges Lernen schwer in den Kopf zu bekommen ist. Daher möchte ich den Code viele Male schreiben, während ich mir "is-a" und des Klassentyps der Box bewusst bin. Außerdem möchte ich mich schnell an Qiita gewöhnen. Vielen Dank für das bisherige Anschauen.

Recommended Posts

[Java] Ich habe Polymorphismus studiert, daher werde ich zusammenfassen, wie man ihn verwendet und welche Vorzüge er hat.
[Leicht verständliche Erklärung! ] Verwendung des Java-Polymorphismus
[Java] Verwendung der FileReader-Klasse und der BufferedReader-Klasse
[Java] Verwendung der Kalenderklasse und der Datumsklasse
Ich bin auf die Java-Version in Android Studio gestoßen, daher werde ich sie zusammenfassen
Ich habe Ruby Silver (Juni 2020) bestanden, also werde ich es zusammenfassen.
[Java] [javaSliver] Die Schnittstelle und die abstrakten Klassen sind kompliziert, daher werde ich sie zusammenfassen.
[Java] Verwendung von Map
Verwendung von Java Optional
Verwendung der Java-Klasse
[Java] Verwendung von removeAll ()
Verwendung von Java Map
Verwendung von Java-Variablen
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Aufrufen und Verwenden der API in Java (Spring Boot)
Verwendung von StringBurrer und Arrays.toString.
Verwendung von HttpClient (Get) von Java
Verwendung von EventBus3 und ThreadMode
Verwendung von HttpClient (Post) von Java
[Java] Verwendung der Join-Methode
[Java] Verwendung statischer Modifikatoren (Was sind statische endgültige und statische Importe)
Wie man Gleichheit und Gleichheit benutzt (wie man Gleichheit benutzt)
[Verarbeitung × Java] Verwendung von Variablen
[JavaFX] [Java8] Verwendung von GridPane
Verwendung von Klassenmethoden [Java]
[Java] Verwendung von List [ArrayList]
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Wie verwende ich Klassen in Java?
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe getestet, wie man Rubys Test / Gerät und Janken's Code verwendet.
Ich habe jetzt versucht, Java 8 zusammenzufassen
[Verarbeitung × Java] Verwendung von Arrays
Verwendung von Java-Lambda-Ausdrücken
[Java] Verwendung der Math-Klasse
Verwendung des Java-Aufzählungstyps
[Java-Anfänger] Ich habe ein etwas tieferes Verständnis von "Es ist Zeit, neue zu verwenden", also machen Sie sich eine Notiz
Ich war neugierig, wie man Optional orElse () und orElseGet () richtig verwendet.
[Java] Beachten Sie, wie Sie RecyclerView verwenden und die animierte Swipe-Verarbeitung implementieren.
Schreiben wir 5 Möglichkeiten zur Implementierung von Java Singleton und verschiedene Vor- und Nachteile
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
Verwendung von OrientJS und OrientDB zusammen
[Java] Verwendung der File-Klasse
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Verwendung der Submit-Methode (Java Silver)
[Leicht verständliche Erklärung! ] Verwendung der Java-Instanz
[Java] Verwendung der toString () -Methode
Studieren der Verwendung des Konstruktors (Java)
[Verarbeitung × Java] Verwendung der Schleife
[Java] Wie man Dateien ausgibt und schreibt!
So richten Sie kapt ein und verwenden es
Verwendung und Definition von Java-Klassen, Importieren
[Java] [Maven3] Zusammenfassung der Verwendung von Maven3
[Verarbeitung × Java] Verwendung der Klasse