Ein Hinweis zu den Unterschieden zwischen Schnittstellen und abstrakten Klassen in Java

Eine Beschreibung, um sich vom Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse zu überzeugen.

Einführung

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.

Schnittstellen und abstrakte Klassen

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. ""

  1. Jede Klasse hat "Breite" und "Höhe" in den Feldern.
  2. Es hat eine Methode "show_width_and_height ()", die "width" und "height" ausgibt.
  3. Es hat eine Methode "getArea ()", um den Bereich zu finden.

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. "

Javaのクラス階層.png

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."

Schließlich

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

Ein Hinweis zu den Unterschieden zwischen Schnittstellen und abstrakten Klassen in Java
Verstehe den Unterschied zwischen abstrakten Klassen und Schnittstellen!
Denken Sie über die Unterschiede zwischen Funktionen und Methoden nach (in Java)
Unterschiede beim Schreiben von Java-, C # - und Javascript-Klassen
Lassen Sie uns eine grobe Vorstellung von den Unterschieden zwischen Protokollen, Klassen und Strukturen bekommen!
Fassen Sie die Unterschiede zwischen C # - und Java-Schrift zusammen
Unterschiede zwischen Klassen und Instanzen in Ruby
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
[JAVA] Was ist der Unterschied zwischen Schnittstelle und Zusammenfassung? ?? ??
In der Abbildung verstandene Java-Klassen und -Instanzen
Über Java Abstract Class
Java abstrakte Methoden und Klassen
[Java] Hinweis zum Unterschied zwischen Äquivalenzbeurteilung und Gleichheitsbeurteilung beim Vergleich von String-Klassen
Unterschiede im Umgang mit Zeichenfolgen zwischen Java und Perl
Unterschiede zwischen "Anfänger" Java und Kotlin
[JAVA] Unterschied zwischen Abstract und Interface
Unterschiede zwischen Java und .NET Framework
Unterschied zwischen final und Immutable in Java
Ein Hinweis zur libGDX Utils-Klasse
[Java] Unterschiede zwischen Instanzvariablen und Klassenvariablen
[Hinweis] Zusammenarbeit zwischen Java und DB (Basic)
JAVA lernen Geschichte abstrakte Klassen und Methoden
[Details] Lassen Sie uns abstrakte Klassen und Schnittstellen beherrschen! !!
Unterschied zwischen int und Integer in Java
Geben Sie die Reihenfolge an, in der die Konfigurationsdateien und Klassen in Java geladen werden
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Interpretieren Sie die Beziehung zwischen Java-Methoden und Argumenten in biochemischen Formeln
Verstehen Sie den Unterschied zwischen int und Integer und BigInteger in Java und float und double
[Java] Verstehe den Unterschied zwischen List und Set
In Bezug auf transiente Modifikatoren und Serialisierung in Java
[Java] Unterschied zwischen gleich und == in einer Zeichenfolge, die ein Referenztyp ist
Über die Idee anonymer Klassen in Java
Eine Geschichte über das JDK in der Java 11-Ära
Effektive Java 3rd Edition Kapitel 4 Klassen und Schnittstellen
Messen Sie die Größe eines Ordners mit Java
Unterschied zwischen next () und nextLine () in Java Scanner
[Verständnis] Unterschied zwischen Hash und Array in Ruby
Ein Hinweis, wenn Sie Tupel in Java möchten
Unterschied zwischen Java, C # und JavaScript (wie man den Grad der Fettleibigkeit findet)
Kompilieren Sie Java und führen Sie es in der Befehlszeile aus
So ermitteln Sie den Abstand und den Winkel zwischen zwei Punkten in einer Ebene
Unterscheiden Sie in Java zwischen positiven und negativen Zahlen
Ein Memo über den Fluss von Rails und Vue
Laden Sie Notizen in Java auf S3 hoch und laden Sie sie herunter
Organisieren Sie den Unterschied im Schreibkomfort zwischen dem Java-Lambda-Ausdruck und dem Kotlin-Lambda-Ausdruck.
[Java] [javaSliver] Die Schnittstelle und die abstrakten Klassen sind kompliziert, daher werde ich sie zusammenfassen.
Lassen Sie uns die Unterschiede zwischen Java-Teilzeichenfolgen und C # -Substrings und deren Portierung untersuchen.
Verstehe in 3 Minuten! Eine sehr grobe Erklärung des Unterschieds zwischen Sitzung und Cookie
Schreiben Sie ABNF in Java und geben Sie die E-Mail-Adresse weiter
Bitte beachten Sie die Aufteilung (Aufteilung) von Java Kotlin Int und Int
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java
Berechnen Sie die Differenz zwischen Zahlen in einem Ruby-Array
[Java] Unterschied zwischen statischem final und final in Mitgliedsvariablen
Unterschiede zwischen Fetch Type LAZY und EAGER im Ruhezustand
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
Verwendung von Abstract Class und Interface in Java richtig
Unterschiede im Code bei Verwendung des Längensystems in Java