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.
Dieser Artikel verwendet Java 11.0.6, das unter Windows installiert ist.
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.
Es gibt keine spezielle Möglichkeit, es zu schreiben, schreiben Sie einfach die Aufgabe.
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.
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.
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.
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.
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.
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