Eine Beschreibung, um sich vom Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse zu überzeugen.
Warum gibt es diese beiden? Mir ist aufgefallen, dass viele Menschen die gleichen Fragen haben wie die Teilnahme an Studiensitzungen. Ich war einmal von mir selbst überzeugt, aber ich habe es vergessen, also habe ich beschlossen, mich zu erinnern. Machen Sie sich hier auch eine Notiz, damit Sie jederzeit darauf zugreifen können, wenn Sie es vergessen. Ich habe mir immer wieder Fragen gestellt und überzeugende Erklärungen gegeben, deshalb möchte ich sie hier in einem Gesprächsformat aufzeichnen. Java-Anfänger A stellt nacheinander Fragen, und Java-Fortgeschrittene B beantwortet sie.
Vielleicht ist es eine Erklärung, die die Krankheit von Anfängern beseitigen kann, die Java-Grammatik studiert haben. Darüber hinaus ist der Inhalt des Gesprächs eine selbst erstellte Version der Sätze, die in den folgenden Büchern geschrieben wurden. Es war sehr einfach zu verstehen und genau für mich, die angefangen haben, Android zu programmieren, ohne Java richtig zu lernen.
[Modernes Java für Android-Ingenieure](https://www.amazon.co.jp/Android%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3% 82% A2% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83% A2% E3% 83% 80% E3% 83% B3Java-% E5% B1 % B1% E7% 94% B0-% E7% A5% A5% E5% AF% 9B / dp / 477415878X / ref = sr_1_1? Dh = UTF8 & qid = 1502351641 & sr = 8-1 & Schlüsselwörter =% E3% 83% A2% E3% 83 % 80% E3% 83% B3java)
Einige der Wörter, die Herr B. ausspricht, enthalten einige einzigartige Interpretationen wie "das ist, was es ist", daher würde ich es begrüßen, wenn Sie auf Fehler hinweisen könnten.
A: "Wie soll ich die Schnittstelle und die abstrakte Klasse richtig verwenden?" B: "Warum nicht eine Schnittstelle verwenden, die Mehrfachvererbung ermöglicht?" A: "Was ist dann der Zweck der abstrakten Klasse? Sie kann nicht mehrmals wie eine Schnittstelle vererbt werden, und die Vorteile sind nicht klar." B: "Der Vorteil abstrakter Klassen gegenüber Schnittstellen besteht darin, dass sie konkrete Implementierungen haben, während Schnittstellen nur Konstanten und abstrakte Methoden haben können ([Modern Java for Android Engineers]). https://www.amazon.co.jp/Android%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83% A2% E3% 83% 80% E3% 83% B3Java-% E5% B1% B1% E7% 94% B0-% E7% A5% A5% E5% AF% 9B / dp / 477415878X / ref = sr_1_1? Dh = UTF8 & qid = 1502351641 & sr = 8-1 & Schlüsselwörter =% E3% 83% A2% E3% 83% 80% E3% 83% B3java) Es heißt, dass es auch verschachtelte statische Klassen / Schnittstellen geben kann, aber ich werde es hier nicht erwähnen. Abstrakte Klassen können auch reguläre Methoden (im Folgenden als "normale Methoden" bezeichnet) und Konstruktoren haben. "" A: "Fum Fum" B: "Wenn Sie beispielsweise möchten, dass alle untergeordneten Klassen beide Methoden mit demselben Verarbeitungsinhalt und Methoden haben, mit denen Sie den Verarbeitungsinhalt einzeln ändern möchten, ist es besser, eine abstrakte Klasse anstelle einer Schnittstelle zu verwenden. Die Verarbeitung ist genau dieselbe. Wenn es sich um eine Methode handelt und Sie sie in einer normalen Methode in einer abstrakten Klasse schreiben, können die untergeordneten Klassen sie so verwenden, wie sie ist. " A: "Ich möchte, dass Sie mir ein konkretes Beispiel geben." B: "Nehmen wir zum Beispiel an," Figure "ist die übergeordnete Klasse und" Triangle "und" Rectangle "sind die untergeordneten Klassen. Es wird angenommen, dass diese Klassen die folgenden Felder und Methoden haben. ""
B: "Der Code sieht folgendermaßen aus:"
Figure.java
public abstract class Figure {
//Feld
protected double width;
protected double height;
//Konstrukteur
public Figure(double width, double height) {
this.width = width;
this.height = height;
}
//Ausgabebreite und -höhe
public String show_width_and_height() {
return "Die Breite ist" + String.valueOf(width) + "、"
+ "Die Höhe ist" + String.valueOf(height);
}
//Ausgabebereich (abstrakte Methode)
pubic abstract double getArea();
}
Triangle.java
public class Triangle extends Figure {
//Konstrukteur
public Triangle(int width, int height) {
super(width, height);
}
//Geben Sie den Bereich des Dreiecks aus
@override
pubic double getArea() {
return this.width * this.height / 2;
}
}
Rectangle.java
public class Rectangle extends Figure {
//Konstrukteur
public Rectangle(double width, double height) {
super(width, height);
}
//Geben Sie den Bereich des Vierecks aus
@override
public double getArea(){
return this.width * this.height;
}
}
B: "Abbildung wird als abstrakte Klasse geschrieben. Breite und Höhe werden als Felder definiert, show_width_and_height () ist eine normale Methode und getArea () ist eine abstrakte Methode. Während Schnittstellenmethoden nur abstrakte Methoden sind, Denken Sie daran, dass Sie normalerweise Methoden in einer abstrakten Klasse haben können: Breite, Höhe, show_width_and_height () werden von der Figur an Triangle, Rectangle geerbt, sodass Sie sie nicht in der untergeordneten Klasse neu schreiben müssen. Bestimmte Implementierungen können nicht an Klassen weitergegeben werden. " A: "Ich verstehe!" B: "Dann getArea (), aber ich verwende dies als abstrakte Methode, da die Fläche für Dreiecke und Quadrate unterschiedlich berechnet wird. Deshalb versuche ich, den Inhalt jeder untergeordneten Klasse zu überlassen." A: "Aber ist es nicht möglich, die Methode zum Finden des Bereichs zu einer normalen Methode mit einem Dummy-Inhalt zu machen und ihn zu überschreiben? Insbesondere ist getArea () nicht in der Abbildung geschrieben, sondern für jede einzelne Du kannst auch in einer Kinderklasse schreiben, oder? " B: "Es ist möglich, aber es gibt keine Garantie dafür, dass die Person, die den Code schreibt, getArea () in der untergeordneten Klasse implementiert. Wenn Sie dies garantieren möchten, funktioniert die abstrakte Klasse gut. Kann erzwingen, dass eigene abstrakte Methoden von untergeordneten Klassen überschrieben werden, wodurch Implementierungsauslassungen vermieden werden. In dieser Hinsicht ist es dasselbe wie die Schnittstelle. " A: "Sie bestehen darauf, dass diese Funktion unerlässlich ist!" B: "Der andere Unterschied besteht darin, dass abstrakte Klassen zu einem Teil der Klassenhierarchie gehören, während die Schnittstellen unabhängig sind. Es ist nicht genau, aber eine grobe Skizze der Klassenhierarchie in der Java-Welt. Ich habe es geschrieben, also bitte überprüfen Sie es. "
B: "Wenn Sie beim Definieren einer Klasse die Vererbungsquelle nicht angeben, erben Sie implizit die Object-Klasse oben in der Klassenhierarchie. Diese wird der vorhandenen Klassenhierarchie hinzugefügt. Dies bedeutet, dass die Schnittstelle unabhängig von der Klassenhierarchie ist und jeder Klasse frei zugeordnet werden kann. Außerdem ist die abstrakte Klasse AbstractMap eine untergeordnete Klasse der Object-Klasse und das übergeordnete Element konkreter Klassen wie HashMap und TreeMap. Es ist eine Klasse. Es ist eine abstrakte Klasse, die in eine Klassenhierarchie eingebettet ist. Sie können dies nicht tun, da die Schnittstelle keine Klasse ist. " A: "Es ist völlig anders, wenn du es erklärst."
Ich glaube, ich habe viel Verständnis dafür gewonnen, wie sich die beiden unterscheiden, aber ich bin mir sicher, dass noch viel darüber zu sagen ist, wie man sie richtig einsetzt. Anscheinend [Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82] % E7% 89% 88-Java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% B6 % E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5% 85% A5% E9% 96% 80-% E7% B5% 90% E5% 9F% 8E-% E6% B5% A9-ebook / dp / B00I8ATHGW / ref = sr_1_1? Dh = UTF8 & qid = 1502444166 & sr = 8-1 & keywords =% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3) Es scheint, dass es im Detail geschrieben ist. Eigentlich habe ich es schon einmal gekauft, aber ich kann nicht viel lesen. Ich kann es hinzufügen, wenn es etwas Neues gibt.
Recommended Posts