Heim > Java > Hauptteil

Wann sollte Abstraktion und wann Schnittstellen verwendet werden?

PHPz
Freigeben: 2024-02-22 12:25:19
nach vorne
721 Leute haben es durchsucht

PHP-Editor Zimo nimmt Sie mit, um das Timing der Verwendung abstrakter Klassen und Schnittstellen in Java zu erkunden. Bei der Java-Programmierung ist die Entscheidung, wann abstrakte Klassen und wann Schnittstellen verwendet werden sollen, eine wichtige Entscheidung. Dieser Artikel beantwortet diese häufig gestellte Frage und hilft Ihnen dabei, besser zu verstehen, wie Sie in verschiedenen Situationen die geeignete abstrakte Klasse oder Schnittstelle auswählen.

Frageninhalt

Ich verstehe vage den Unterschied zwischen Abstraktion und Schnittstelle, aber was ich einfach nicht verstehen kann, ist, wann Abstraktion und wann Schnittstelle verwendet werden soll. Welche Variablen benötige ich, um eine Schnittstellenabstraktion auszuwählen und umgekehrt? Die meisten Online-Antworten sollen den Unterschied verdeutlichen, aber selbst ich verstehe sie. Ich weiß nicht, wann es angemessener ist.

Lösung

Die allgemeine alte Regel lautet: Bleiben Sie bei Schnittstellen, bis Sie gezwungen sind, abstrakte Klassen zu schreiben.

Ein nicht instanziierbarer Typ in Java definiert eine öffentliche Schnittstelle, an die sich andere Typen interface aussuchen halten können.

    Schnittstellen können öffentliche Methoden deklarieren, die von ihren Implementierern definiert werden müssen. Alle diese Methoden sind implizit
  • . abstract,因此您不需要使用单词 abstract
  • In älteren Java-Versionen konnten Schnittstellen keine Standardimplementierungen haben, daher verwendete jede Methode die in der Klasse verwendete Standardimplementierung, sofern sie nicht ersetzt wurde.
  • abstract。现在情况已不再是这样,接口现在可以具有在 implementIn der neuesten Java-Version können Schnittstellen
  • Hilfsmethoden deklarieren. Diese können bei Standardimplementierungen hilfreich sein.
  • privateSchnittstellen dürfen niemals Konstruktoren oder Instanzvariablen haben.
  • Eine Klasse kann
  • mehrere Schnittstellen haben.
  • implement
-Methode, obwohl Sie dies normalerweise tun möchten.

abstract 类 只是一个无法实例化的类。抽象类不需要定义任何 abstract

Abstrakte Klassen können Methoden mit beliebiger Sichtbarkeit deklarieren: public,
    , protected und package-private.
  • publicprivateprotectedAbstrakte Klassen können Methoden implementieren oder sie als abstrakt behalten. Methoden in abstrakten Klassen
  • sind nicht
  • implizit abstrakt und müssen als solche gekennzeichnet werden. abstract。抽象类中的方法不是隐式 abstract
  • Abstrakte Klassen können Konstruktoren haben,
  • Konstruktoren in ihren eigenen Konstruktoren aufrufen. Abstrakte Klassen können Instanzvariablen beliebiger Sichtbarkeit haben und funktionieren genauso wie Instanzvariablen in jeder übergeordneten Klasse. extending 类必须使用 super
  • Die einzige
  • ness einer Klasse ändert nichts an der Anzahl der Superklassen, die sie haben darf. extend 一个类,可以是 abstract 类,也可以是具体类。类的 abstract

), um mit dem Fenster sowie der gesamten Swing-API zu kommunizieren. abstract classes 应该是例外而不是常态。如果您需要维护某些内部状态,同时还让子类定义您自己的行为,则应该使用抽象类。一个很好的例子来自 java swing gui 库:AbstractButtonabstractbutton 是行为模糊地类似于窗口中按钮的事物的抽象父代,包括按钮、切换按钮和菜单中的项目。任何人都可以子类化 abstractbutton 并实现其成员来定义类似按钮的显示。但是 abstractbutton 还必须维护大量内部状态(其中大部分来自 jcomponent

Wenn Sie eine öffentliche Schnittstelle für eine Sammlung von Typen definieren möchten, verwenden Sie

. Wenn Sie für einige dieser Methoden eine Standardimplementierung bereitstellen und eine nach 2014 veröffentlichte Java-Version verwenden möchten, verwenden Sie eine Schnittstelle. Wenn Sie eine Standardimplementierung benötigen, aber immer noch in den 2000er-Jahren stecken, verwenden Sie abstrakte Klassen. Wenn Sie unabhängig von der Java-Version einen privaten Status (z. B. Instanzvariablen) oder eine benutzerdefinierte Initialisierung (z. B. Konstruktoren) benötigen, verwenden Sie abstrakte Klassen. interface

Schnittstelle:

Angenommen, Sie haben eine Schnittstelle wie:

interface animal {
  string makenoise();
}
Nach dem Login kopieren

Und mehrere Klassen, die Tiere implementieren:

class cat implements animal {
    string makenoise() {
        return "meow";
    }
}

class dog implements animal {
    string makenoise() {
        return "woof";
    }
}
Nach dem Login kopieren

Jetzt können Sie Schnittstellen als Rückgabetypen verwenden, sodass Methoden zurückkehren können

. catdog

string makeanimalmakenoise(int animalid) {
    animal animal = pretendanimalservice.getdogorcat(animalid);

    animal.makenoise();
}
Nach dem Login kopieren

Abstrakte Klasse:

Angenommen, Sie haben eine abstrakte Klasse:

abstract class animal {
    public string makenoise() {
        return "whistle";
    }

    abstract public string getname();
}
Nach dem Login kopieren

Jetzt muss jede Klasse, die es erweitert, die

-Methode implementieren: getname

class Cat extends Animal {
    String getName() {
        return "Pussy";
    }
}

class Dog extends Animal {
    String getName() {
        return "Fido";
    }
}
Nach dem Login kopieren

Beide oben genannten Klassen implementieren die erforderlichen

Methoden, haben aber auch Zugriff auf die makenoise-Methode der übergeordneten Klasse, die bei Bedarf auch überschrieben werden kann. getname 方法,但它们也可以访问父类 makenoise

Es ist auch wichtig, andere Unterschiede zu beachten, sie sind:

    Sie können nur eine abstrakte Klasse erweitern, aber Sie können mehrere implementieren Schnittstelle.
  • Schnittstellen sollten verwendet werden, wenn verschiedene Typen dieselben Methodensignaturen haben sollen, und abstrakte Klassen sollten verwendet werden, wenn Implementierungen ein gemeinsames Verhalten aufweisen.
  • Sie schließen sich nicht gegenseitig aus.
  • Schnittstellen können nur öffentliche Methoden haben, während abstrakte Klassen öffentliche Methoden und geschützte Methoden haben können.

Das obige ist der detaillierte Inhalt vonWann sollte Abstraktion und wann Schnittstellen verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!