JavaRush /Java-Blog /Random-DE /Konzepte der objektorientierten JAVA-Programmierung
shabnahm
Level 18

Konzepte der objektorientierten JAVA-Programmierung

Veröffentlicht in der Gruppe Random-DE
JAVA basiert auf den Konzepten der objektorientierten Programmierung, die es Ihnen ermöglicht, auf eine höhere Abstraktionsebene zu gelangen, um jedes Problem auf realistische Weise zu lösen. Der objektorientierte Ansatz konzeptualisiert die Lösung eines Problems anhand realer Objekte, die in einer Anwendung leichter wiederverwendet werden können. Zum Beispiel Chair(Stuhl), Fan(Ventilator), Dog(Hund), Computer(Computer) und so weiter. In JAVA ist eine Klasse ein Layout, eine Vorlage oder ein Prototyp, der das allgemeine Verhalten eines Objekts eines bestimmten Typs definiert. Eine Instanz ist eine separate Implementierung einer Klasse, und alle Instanzen einer Klasse verfügen über dieselben Eigenschaften, die in der Klassendefinition beschrieben werden. Sie können beispielsweise eine Klasse namens „Haus“ mit der Anzahl der Räume als Attribut definieren und Instanzen der Klasse erstellen, z. B. ein Haus mit zwei Zimmern, ein Haus mit drei Zimmern usw. Konzepte der objektorientierten JAVA-Programmierung – 1Vorteile: Nachfolgend sind einige Vorteile der objektorientierten Softwareentwicklung aufgeführt.
  • Reduzierte Software-Supportkosten, vor allem aufgrund der modularen Ausführung.
  • Verbesserte Wiederverwendung von Code durch Funktionen wie Vererbung, was zu einer schnelleren Softwareentwicklung führt.
  • Erhöhte Codezuverlässigkeit und Flexibilität.
  • Einfaches Verständnis durch reale Simulation.
  • Bessere Abstraktion auf Objektebene.
  • Reduzierung der Komplexität des Übergangs von einer Entwicklungsphase zur anderen.
Es gibt vier Hauptmerkmale von OOP:
  • Verkapselung
  • Nachlass
  • Polymorphismus
  • Abstraktion

Verkapselung

Die Kapselung fungiert als Vertrag für ein Objekt, was es verbergen und was es für den Zugriff durch andere Objekte öffnen soll. In JAVA verwenden wir einen Zugriffsmodifikator, privateum eine Methode zu verbergen und den Zugriff auf eine Variable von außen einzuschränken. JAVA verfügt außerdem über verschiedene Zugriffsmodifikatoren: public, default, protected, private, die verwendet werden, um die Sichtbarkeit auf verschiedenen Ebenen einzuschränken. Aber das ultimative Ziel besteht darin, die Dinge zusammenzufassen, die nicht geändert werden sollten. Der Ansatz, der am besten funktioniert, besteht darin, dass eine Klasse nur einen Grund zur Änderung haben sollte und die Kapselung das Design dieses „einen Grundes“ in die Realität umsetzt. Der richtige Ansatz zur Kapselung besteht darin, Dinge zu verbergen, die sich häufig ändern, um eine Beschädigung anderer Klassen zu vermeiden. Vorteile: Nachfolgend sind einige der Vorteile der Kapselung aufgeführt:
  • Wir können den internen Zustand eines Objekts schützen, indem wir seine Attribute verbergen.
  • Dies verbessert die Codemodularität, da verhindert wird, dass Objekte auf unerwartete Weise interagieren.
  • Verbessert die Benutzerfreundlichkeit des Codes.
  • Dies unterstützt das Vertragsverhältnis einer bestimmten Entität.
  • Durch die Kapselung ist Software einfacher zu warten.
  • Änderungen am Code können unabhängig voneinander vorgenommen werden.

Polymorphismus

Polymorphismus in der Programmierung ist die Fähigkeit, dieselbe Schnittstelle für verschiedene zugrunde liegende Formen (Datentypen) bereitzustellen. Dies bedeutet, dass Klassen mit unterschiedlicher Funktionalität dieselbe Schnittstelle verwenden und dynamisch aufgerufen werden können, indem Parameter als Referenz übergeben werden. Ein klassisches Beispiel ist die Klasse Shape(Form) und alle Klassen, die von ihr erben: square(Quadrat), circle(Kreis), dodecahedron(Dodekaeder), irregular polygon(unregelmäßiges Polygon), splat(Klecks) und so weiter. In diesem Beispiel hat jede Klasse ihre eigene Methode Draw()und der Clientcode kann einfach Folgendes tun:
Shape shape = new Shape();
Shape.area()um das korrekte Verhalten jeder Form zu erhalten. Das Schöne am Polymorphismus ist, dass der Code, der mit verschiedenen Klassen arbeitet, nicht wissen muss, welche Klasse er verwendet, da alle nach dem gleichen Prinzip arbeiten. Der von objektorientierten Programmiersprachen verwendete Prozess zur Implementierung dynamischen Polymorphismus wird als dynamische Bindung bezeichnet. Hinweis: Polymorphismus ist die Fähigkeit, je nach Objekt spezifischere Methoden zur Ausführung auszuwählen. Polymorphismus tritt auf, wenn abstrakte Klassen nicht beteiligt sind. Vorteile:
  • Wiederverwendbaren Code erstellen. Das heißt, sobald eine Klasse erstellt, implementiert und getestet ist, kann sie frei verwendet werden, ohne sich Gedanken darüber machen zu müssen, was genau darin geschrieben steht.
  • Dies ermöglicht einen allgemeineren und lose gekoppelten Code.
  • Die Kompilierungszeit wird reduziert, was die Entwicklung beschleunigt.
  • Dynamische Verlinkung.
  • Mit derselben Schnittstelle können Methoden mit unterschiedlichen Implementierungen erstellt werden.
  • Die gesamte Implementierung kann durch die Verwendung derselben Methodensignaturen ersetzt werden.
Methodenüberschreibung als Teil des Polymorphismus. Eine Überschreibung interagiert mit zwei Methoden: einer Methode in der übergeordneten Klasse und einer Methode in der abgeleiteten Klasse. Diese Methoden haben den gleichen Namen und die gleichen Signaturen. Durch das Überschreiben können Sie denselben Vorgang für verschiedene Objekttypen auf unterschiedliche Weise ausführen. Zum Beispiel:
while(it.hasNext()) {
Shape s = (Shape) it.next();
totalArea += s.area(dim); //будет применен полиморфизм и вызван нужный метод для каждого ein Objektа.
}
Konzepte der objektorientierten JAVA-Programmierung - 2Methodenüberladung oder Ad-hoc-Polymorphismus oder statischer Polymorphismus. Überladung interagiert mit mehreren Methoden derselben Klasse, die identisch benannt sind, aber unterschiedliche Methodensignaturen haben. Durch das Neuladen können Sie denselben Vorgang für verschiedene Daten auf unterschiedliche Weise beschreiben. Es wird manchmal als statischer Polymorphismus bezeichnet, aber tatsächlich ist es kein Polymorphismus. Dabei handelt es sich um nichts anderes, als einfach zwei Methoden mit demselben Namen, aber einer unterschiedlichen Liste von Argumenten zu haben. Ein Neustart hat nichts mit Vererbung und Polymorphismus zu tun. Und eine überladene Methode ist überhaupt nicht dasselbe wie eine überschriebene Methode. Parametrischer Polymorphismus durch Generierung in JAVA Beim Deklarieren einer Klasse kann das Namensfeld verschiedenen Typen zugeordnet werden, und der Methodenname kann verschiedenen Parametern und Rückgabetypen zugeordnet werden. JAVA unterstützt parametrischen Polymorphismus durch die Verwendung von Generika.
List<String> list = new ArrayList<String>();
Warum können wir eine statische Methode in JAVA nicht überschreiben? Das Überschreiben hängt von der Existenz einer Instanz der Klasse ab. Die Idee des Polymorphismus besteht darin, dass Sie eine Unterklasse erstellen können und die von diesen Unterklassen implementierten Objekte sich mit denselben Methoden der übergeordneten Klasse (die in den Unterklassen überschrieben werden) unterschiedlich verhalten. Eine statische Methode ist keiner Instanz der Klasse zugeordnet, daher kann das Konzept des Überschreibens selbst nicht angewendet werden. Die Entwickler von JAVA ließen sich von zwei Überlegungen leiten, die diesen Ansatz beeinflussten. Erstens gibt es Probleme bei der Codeausführung: Smalltalk wurde oft wegen seiner Langsamkeit kritisiert (Garbage Collection und Polymorphismus waren Teil dieses Problems), und JAVA wurde entwickelt, um dies zu vermeiden. Die zweite Überlegung war die Entscheidung, dass die Zielgruppe von JAVA C++-Entwickler sein sollten. Dass statische Methoden auf diese Weise funktionieren, war C++-Programmierern sehr vertraut und beschleunigte auch die Arbeit, da es nicht nötig war, die Klassenhierarchie nach oben zu gehen, um herauszufinden, welche Methode aufgerufen werden sollte. Sie gehen direkt zur Klasse und rufen eine bestimmte Methode auf.

Nachlass

Bei der Vererbung werden das Verhalten (d. h. Methoden) und der Zustand (d. h. Variablen) einer Basisklasse in eine abgeleitete Klasse integriert, sodass sie in dieser abgeleiteten Klasse verfügbar werden. Der Hauptvorteil der Vererbung besteht darin, dass sie einen formalen Mechanismus für die Wiederverwendung von Code bietet und Duplikate vermeidet. Eine geerbte Klasse erweitert die Funktionalität der Anwendung, indem sie das Verhalten der übergeordneten Klasse kopiert und neue Funktionalität hinzufügt. Dadurch ist der Code stark gekoppelt. Wenn Sie die Oberklasse ändern möchten, müssen Sie alle Details der Unterklassen kennen, um den Code nicht zu beschädigen. Vererbung ist eine Form der Wiederverwendung von Software, bei der aus einer vorhandenen Klasse (Superklasse) eine neue Klasse (Unterklasse) erstellt wird, die deren Funktionalität erweitert und einige der Eigenschaften der Superklasse nutzt. Wenn Sie also eine übergeordnete Klasse haben und dann eine untergeordnete Klasse erscheint, erbt die untergeordnete Klasse alle Dinge, die die übergeordnete Klasse hat. Vorteile:
  • Verbesserte Wiederverwendung von Code.
  • Die logische Beziehung „ist ein“ (ist jemand, etwas) wird hergestellt. Zum Beispiel: Hund ist ein Tier . (Ein Hund ist ein Tier).
  • Code-Modularisierung.
  • Wiederholungen sind ausgeschlossen.
Mangel:
  • Eng gekoppelt: Eine Unterklasse hängt von der Implementierung einer übergeordneten Klasse ab, wodurch der Code eng gekoppelt wird.
Was gibt es sonst noch zu lesen:

Java-Entwicklergruppe:

Abstraktion

Abstraktion bedeutet, Klassen auf der Grundlage ihrer Schnittstellen und Funktionalität zu entwerfen, ohne die Implementierungsdetails zu berücksichtigen. Eine abstrakte Klasse stellt Schnittstellen dar, ohne die eigentliche Implementierung einzuschließen. Es unterscheidet die Implementierung eines Objekts von seinem Verhalten. Abstraktion vereinfacht den Code, indem unwichtige Details ausgeblendet werden. Vorteile:
  • Mithilfe der Abstraktion können wir heraustrennen, was in einen Typ gruppiert werden kann.
  • Häufig geänderte Eigenschaften und Methoden können in einem separaten Typ gruppiert werden, sodass der Haupttyp keinen Änderungen unterliegt. Dies stärkt das OOP-Prinzip: „Code sollte für Erweiterungen offen, aber für Änderungen geschlossen sein . “
  • Abstraktion vereinfacht die Darstellung von Domänenmodellen.
Unterschied zwischen Abstraktion und Kapselung Kapselung ist eine Strategie, die im Rahmen der Abstraktion verwendet wird. Kapselung bezieht sich auf die Struktur eines Objekts: Objekte kapseln ihre Eigenschaften und verbergen sie vor dem Zugriff von außen. Benutzer einer Klasse interagieren mit ihr über ihre Methoden, haben jedoch keinen direkten Zugriff auf die Klassenstruktur. Auf diese Weise abstrahiert die Klasse Implementierungsdetails im Zusammenhang mit ihrem Design. Abstraktion ist ein allgemeinerer Begriff. Dies kann unter anderem auch durch den Einsatz von Unterklassen erreicht werden. Beispielsweise Listist eine Klasse (Liste) in der Standardbibliothek eine Abstraktion für eine Folge von Elementen, die entsprechend ihrer Position in der Liste indiziert wird. Spezifische Beispiele für eine Liste Listsind ArrayListoder LinkedList. Code, der mit einer Liste interagiert, Listabstrahiert die Details der verwendeten Liste. Oft ist eine Abstraktion nicht möglich, ohne den zugrunde liegenden Zustand durch Kapselung zu verbergen. Wenn eine Klasse ihre interne Struktur offenlegt, kann sie ihre internen Operationen nicht ändern und kann daher nicht abstrahiert werden. Was sind abstrakte Klassen und abstrakte Methoden? Es kommt vor, dass Sie während der Entwicklung möchten, dass eine Basisklasse nur eine Schnittstelle zu ihren abgeleiteten Klassen bereitstellt. Das heißt, Sie möchten nicht, dass jemand Instanzen der Basisklasse erstellt. Sie müssen die Schnittstelle so verwenden, dass Sie nur Objekte darauf umwandeln (dies ist eine implizite Umwandlung, die polymorphes Verhalten ermöglicht). Dies wird erreicht, indem diese Klasse mithilfe des Schlüsselworts abstrakt gemacht wird abstract. Dies bringt einige Einschränkungen mit sich, z. B. die Unfähigkeit, Instanzen einer abstrakten Klasse zu erstellen. Bei Verwendung einer abstrakten Klasse ist es erforderlich, abstrakte Methoden zu implementieren. Dies gewährleistet Polymorphismus. Eine abstrakte Klasse kann sowohl abstrakte als auch konkrete Methoden enthalten. Wenn mindestens eine Methode in einer Klasse als abstrakt deklariert ist, muss auch die gesamte Klasse als abstrakt deklariert werden. Die umgekehrte Regel ist jedoch nicht zu beachten. Wenn eine Klasse als abstrakt deklariert ist, darf sie keine abstrakten Methoden enthalten. Eine Methode, die lediglich ihre Signaturen definiert und keine Implementierung bereitstellt, wird als abstrakt bezeichnet. Die eigentliche Implementierung bleibt ihren Unterklassen überlassen, die die abstrakte Klasse erweitern. Eine abstrakte Methode kann von einem Objekt nicht verwendet werden, sondern nur durch eine andere Klasse erweitert werden. Wann sollten Sie eine abstrakte Klasse verwenden? Mit abstrakten Klassen können Sie ein Standardverhalten definieren und Unterklassen für jedes spezifische Verhalten sorgen. Beispiel: List(list) ist eine Schnittstelle, die wiederum AbstractListdas grundlegende Verhalten einer Liste definiert, die unverändert verwendet oder in einer Unterklasse verfeinert werden kann, beispielsweise in ArrayList(list array). Was ist eine Schnittstelle? Das Konzept einer Schnittstelle ist eine abstrakte Klasse, aber die Schnittstelle (definiert durch das Schlüsselwort interface) geht noch einen Schritt weiter. Es verhindert überhaupt jegliche Implementierung einer Methode oder Funktion. Sie können eine Methode oder Funktion nur deklarieren, nicht jedoch deren Implementierung bereitstellen. Die Klasse, die die Schnittstelle implementiert, muss sich um die tatsächliche Implementierung kümmern. Schnittstellen sind sehr nützlich und werden häufig in OOP verwendet. Da ihnen die Schnittstelle selbst und die Implementierung gemeinsam sind, bieten sie viele Vorteile ihrer Verwendung:
  1. Mehrfachvererbung .
  2. Lose Kopplung . Es gibt eine Abstraktion der Operation, beispielsweise Layering, und die konkrete Implementierung kann alles sein: JDBC, JPA, JTA usw.
  3. Das Schnittstellenprogramm ist nicht implementiert .
  4. Dynamischer Bindungspolymorphismus : Die Programmierschnittstelle eines Objekts wird offengelegt, ohne seine tatsächliche Implementierung preiszugeben.
  5. Abstrakte Ebenen , Funktionstrennung.
Unterschied zwischen Schnittstelle und abstrakter Klasse.
  • Eine Schnittstelle ist eine Vertragsbeziehung mit den Klassen, die diese Schnittstelle implementieren und besagt, dass die Implementierung auf die von der Schnittstelle angegebene Weise erfolgt. Dies ist eine leere Shell mit deklarierten Methoden.
  • Eine abstrakte Klasse definiert ein allgemeines Verhalten und fordert ihre Unterklassen auf, atypisches oder spezifisches Verhalten für ihre Klasse zu definieren.
  • Methoden und Mitglieder einer abstrakten Klasse können mit einem beliebigen Zugriffsmodifikator gekennzeichnet werden; alle Schnittstellenmethoden müssen wiederum öffentlich sein.
  • Beim Erben einer abstrakten Klasse muss die Nachfolgeklasse abstrakte Methoden definieren, während eine Schnittstelle eine andere Schnittstelle erben kann, ohne unbedingt deren Methoden zu definieren.
  • Eine abgeleitete Klasse kann nur eine abstrakte Klasse erweitern, aber eine Schnittstelle kann viele andere Schnittstellen erweitern oder eine Klasse implementieren.
  • Eine Nachkommenklasse kann abstrakte Methoden mit demselben oder weniger restriktiven Zugriffsmodifikator definieren, aber die Klasse, die die Schnittstelle implementiert, muss Methoden mit derselben Sichtbarkeitsebene definieren.
  • Eine Schnittstelle enthält im Gegensatz zu einer abstrakten Klasse keine Konstruktoren.
  • In der Java-Schnittstelle deklarierte Variablen sind standardmäßig endgültig. Eine abstrakte Klasse kann Variablen enthalten, die nicht endgültig sind.
  • Alle Mitglieder der Java-Schnittstelle sind public. Mitglieder einer abstrakten Klasse können es sich leisten public, protectedusw. zu sein.

Komposition

Die Wiederverwendung von Code kann sowohl durch Vererbung als auch durch Zusammensetzung erreicht werden. Die Verwendung von Komposition bietet jedoch ein höheres Maß an Kapselung als Vererbung, da Änderungen an der Back-End-Klasse nicht unbedingt Auswirkungen auf den Code haben, der zur Front-End-Klasse gehört. Komposition ist eine Entwurfstechnik, die „hat-a“-Beziehungen (hat, beinhaltet) in Klassen verwendet. Sowohl die Java-Vererbung als auch die Objektkomposition können zur Wiederverwendung von Code verwendet werden. Das Wesen der Komposition besteht darin, die „hat eine“-Beziehung zwischen Objekten auszudrücken. Denken Sie an einen Stuhl. Der Stuhl hat eine Sitzfläche. Der Stuhl hat eine Rückenlehne. Ein Stuhl hat eine bestimmte Anzahl an Beinen. Der Ausdruck „hat ein“ deutet auf eine Beziehung hin, in der der Stuhl ein anderes Objekt hat oder zumindest ein anderes Objekt benutzt. Genau diese „hat-ein“-Beziehung ist die Grundlage der Komposition. Vorteile:
  • Sichtkontrolle
  • Die Implementierung kann zur Laufzeit ersetzt werden
  • Lose Kopplung, da die Schnittstellenklasse nicht von der Implementierung abhängt.
Unterschiede zwischen Zusammensetzung und Vererbung
NEIN. Zusammensetzung (hat ein / hat) Vererbung (ist ein / ist)
1 Unterstützt Polymorphismus und Code-Wiederverwendung. Unterstützt Polymorphismus und Code-Wiederverwendung.
2 Das Laufzeitobjekt wurde bereits erstellt. Das Objekt wird zur Kompilierungszeit dynamisch erstellt.
3 Die Implementierung kann zur Laufzeit ersetzt werden. Die Implementierung kann zur Kompilierungszeit geändert werden.
4 Eine Unterklasse ist unabhängig von ihrer übergeordneten Klasse, was eine lose Kopplung begünstigt (insbesondere unter Schnittstellensteuerung). Die Unterklasse ist von der Implementierung der übergeordneten Klasse abhängig, daher gilt die Bindung als stark.
5 Nutzung: Das Haus verfügt über ein Badezimmer. Es ist falsch zu sagen, dass das Haus das Badezimmer ist. Die Vererbung ist unidirektional: Ein Haus ist ein Gebäude. Aber das Gebäude ist kein Zuhause.
Hinweis: Verwenden Sie Vererbung nicht nur, um die Wiederverwendung von Code sicherzustellen. Wenn es keine Relation „is a“ (is) gibt, wird für diese Zwecke die Komposition verwendet. Der Unterschied zwischen Komposition und Aggregation liegt in den Objektbeziehungen. Aggregation ist eine Beziehung, bei der eine Klasse in eine Sammlung passt. Es ist ein Teil einer ganzen Beziehung, in der ein Teil ohne das Ganze existieren kann. Solche Beziehungen sind viel schwächer. Es besteht keine zyklische Abhängigkeit. Zum Beispiel: Bestellung und Produkt. Komposition ist eine Beziehung, in der eine Klasse in eine Sammlung passt. Es ist ein Teil einer Gesamtbeziehung, in der der Teil nicht ohne das Ganze existieren kann. Wenn das Ganze zerstört wird, werden auch alle seine Bestandteile zerstört. Es ist eine stärkere Beziehung. Zum Beispiel: ein Polygon und seine Eckpunkte, eine Ordnung und ihre Komponente.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION