[JAVA] Objekt orientierte Programmierung

Klassen und Instanzen (objektorientiert)

Klassen werden gruppiert und Instanzen werden durch Gruppierungsregeln definiert. Das Bild ist wie das Erstellen einer Instanz namens Prius aus der Klasse car.

Die Essenz der Objektorientierung besteht darin, Dinge herzustellen und sie zur Schaffung von Mechanismen zu verwenden. Wenn Sie Dinge herstellen, machen Sie sie konkret, und wenn Sie sie verwenden, verwenden Sie sie, während Sie sie abstrakt verstehen.

Was im Unterricht zu tun ist

Definieren Sie die Variablen und Funktionen, die die Instanz haben soll. Außerdem wird beschrieben, wie Sie beim Erstellen einer Instanz erste Einstellungen vornehmen. → Definieren Sie eine Konstruktorfunktion, damit Sie ein Argument erhalten und einen Anfangswert erstellen können. → Übergeben Sie beim Erstellen einer Instanz einen Wert als Argument und geben Sie in jeder Instanz den Anfangswert der Variablen ein.

class Person {

 private Stirng name; //Hier werden die für die Instanz erforderlichen Variablen vorbereitet.
 
 Person(String name, ...) { ////()Sie können die erforderlichen Argumente eingeben. Es werden verschiedene Anfangseinstellungen zum Erstellen einer Instanz geschrieben...
 }

 public void detailData() { //Die für die Instanz erforderlichen Funktionen werden hier geschrieben
 }
}
Ergänzung

-Dies in der Klasse geschrieben bedeutet die erstellte Instanz selbst.

private Stirng name; //Definieren Sie in dieser Klasse eine Variable namens name

public void nameInput(String input) { //Wenn nameInpu t mit der Eingabe der Zeichenfolgenvariablen als Argument ausgeführt wird
 this.name = input;  //Der Variablenname dieser Instanz entspricht dem Wert der empfangenen Eingabe.
}

-Es gibt Variablen für Instanzen (Instanz-Feed), aber es gibt auch Variablen für Klassen (Klassen-Feed). Da der Klassenfeed eine Variable in der Klasse ist, kann er geändert werden, wenn etwas passiert (z. B. jedes Mal, wenn eine Instanz erstellt wird).

Person.Java


class Person {

 private static int count;  //Dies ist eine Variable für die Klasse
 private Stirng name; //Dies ist eine Variable für die Instanz

 Person(String name, ...) { ////Grundeinstellungen zum Erstellen einer Instanz
 Person.count ++; //Jedes Mal, wenn eine Personeninstanz erstellt wird, wird die Anzahl der Personenklassen angegeben+1 zu sein
 }
} 

Rufen Sie es mit einer Klassennamen.class-Variablen (bei Verwendung außerhalb der Klasse) oder mit einer self.class-Variablen (bei Verwendung innerhalb einer Klasse) auf.

Initialisierung, Konstruktormethode

Dies ist eine Funktion, die erforderlich ist, um beim Erstellen einer Instanz Argumente zu empfangen und Anfangswerte festzulegen (vielmehr eine Initialisierungsfunktion, die jedes Mal aktiviert wird, wenn diese Klasse verwendet wird!?). Es gibt jedoch mehr als einen Typ von Argumenteingabemustern für die Anfangswerteinstellung. Beispielsweise muss eine Person mit einem zweiten Vornamen mehr Elemente eingeben als eine normale Person. Daher benötigen wir auch eine Eingabefunktion für Personen mit einem zweiten Vornamen. ↓ Abhängig vom Eingabemuster des Arguments stellt die Konstruktormethode auch ein Muster bereit. Sie können eine Konstruktormethode mit demselben Namen erstellen, die mehreren Argument-Eingabemustern durch eine Methode namens Überladung entspricht.

Person.Java


class Person {

 private Stirng firstname; //Hier werden die für die Instanz erforderlichen Variablen vorbereitet.
 private Stirng lastname;
 private Stirng middlename;

 Person(String firstname, String lastname) { //Grundeinstellungen für Personen mit nur Vor- und Nachnamen
 this.firstname = firstname; //Der Wert von firstname, der für das Argument verwendeten Zeichenfolge, ist der Vorname dieser Instanz. Die links und rechts gezeigten Vornamen sind unterschiedlich.
 this.lastname = lastname;
 }
//Schreiben Sie eine gleichnamige Funktion
 Person(String firstname, String middlename, String lastname) { //Grundeinstellungen für Personen mit Vor- und Nachnamen sowie mit Vornamen
 this.firstname = firstname;
 this.lastname = lastname;
 this.middlename = middlename;
 }
}

Überladen und Überschreiben

overload Wenn durch Überladung mehrere Funktionen mit demselben Namen erstellt werden, unterscheidet sich das Eingabemuster des Arguments, auch wenn der Name identisch ist. Wählen Sie daher die am besten geeignete Funktion aus diesem Muster aus. Dies wird häufig hauptsächlich für die Standardfunktion durchgeführt. ↓ Beim Erstellen einer anfänglichen Einstellungsfunktion kann der Verarbeitungsinhalt der durch Überladung erstellten Funktionen dupliziert werden. ↓ Zum Beispiel gibt es eine Funktion A, die eine Initialisierungsfunktion ist. Wenn dies (Name usw.) in Funktion A implementiert ist Es sucht nach der Initialisierungsfunktion mit demselben Namen wie Funktion A, sucht nach Funktion B, die den Namen darin verarbeitet, und verarbeitet den Namen. Der folgende Code bereinigt den vorherigen Code.

Person.Java


class Person {

 private Stirng firstname; //Hier werden die für die Instanz erforderlichen Variablen vorbereitet.
 private Stirng lastname;
 private Stirng middlename;

 Person(String firstname, String lastname) { 
 this.firstname = firstname; //Der Wert von firstname, der für das Argument verwendeten Zeichenfolge, ist der Vorname dieser Instanz. Die links und rechts gezeigten Vornamen sind unterschiedlich.
 this.lastname = lastname;
 }

 Person(String firstname, String middlename, String lastname) { //Grundeinstellungen für Personen mit Vor- und Nachnamen sowie mit Vornamen
 this(firstname, lastname); //Das hat sich geändert. Zuerst existiert das in der gleichnamigen Funktion,Verarbeiteter Nachname.
 this.middlename = middlename;
 }
}

override überschreiben überschreibt den Inhalt der untergeordneten Klasse, wenn eine Funktion mit demselben Namen wie die übergeordnete Klasse definiert wird. ↓ Wenn in der untergeordneten Klasse eine Funktion mit demselben Namen wie die Funktion der übergeordneten Klasse definiert ist, erbt die Funktion normalerweise nicht den Verarbeitungsinhalt der übergeordneten Klasse und führt nur den Verarbeitungsinhalt der untergeordneten Klasse aus. ↓ Wenn Sie den Verarbeitungsinhalt der übergeordneten Klasse an die Funktion der untergeordneten Klasse erben möchten, müssen Sie die super. -Methode in der Funktion der untergeordneten Klasse benennen.

Person.Java


class Person {
 .
 .
 .

 public void detailData() { //Eine Funktion, die detaillierte Informationen zu einer Instanz anzeigt
 System.out.println("Name ist" + this.name); //Instanzvariablen anzeigen
 System.out.println("Alter ist" + this.age);
 }
} 

Child.Java


class Child extends Person { //Die untergeordnete Klasse erbt die Personenklasse
 .
 .
 .

 public void detailData() { //In der übergeordneten Personenklasse gibt es eine gleichnamige Funktion
 super.detailData(); //Jetzt detailData in der übergeordneten Personenklasse()Kann den Verarbeitungsinhalt von übernehmen
 //Schreiben Sie von hier aus den für die untergeordnete Klasse spezifischen Verarbeitungsinhalt
 .
 .
 }
} 

Verkapselung

Verkapselung soll etwas ohne Abfall leicht verständlich machen. Zeigen Sie bei der Verwendung keine Informationen wie die interne Struktur an, damit sie verwendet werden können, während Sie sie abstrakt verstehen (Sie können sie verwenden, ohne über schwierige Dinge nachzudenken).

Ich werde hier eine Funktion in Kapselung schreiben.

Es beschränkt die Zugriffsschaltung auf Variablen und Funktionen, die in einer bestimmten Klasse definiert sind (aus Sicherheitsgründen?) ↓ Wenn Sie Variablen und Funktionen definieren, können Sie den Zugriff einschränken, indem Sie diese unmittelbar vorher hinzufügen. ・ Öffentlich → Kann von externen Klassen aus aufgerufen werden. ・ Privat → Auf externe Klassen kann nicht zugegriffen werden. Der Zugriff ist mit der Methode innerhalb der Klasse möglich, die die Variable oder Funktion definiert. ・ Geschützt → Grundsätzlich ist der Zugriff von externen Klassen wie privat nicht möglich. Auf jede untergeordnete Klasse, die die Klasse erbt, die die Variable oder Funktion definiert, kann jedoch zugegriffen werden.

Sitten und Bräuche

House.Java


class House{

 private Stirng name; //Hier werden die notwendigen Variablen vorbereitet.
 private Person owner; //Sie können eine Instanz einer anderen Klasse Person in einer Variablen namens owner speichern.

 House(String name, ...) { //Instanzinitialisierung
 }

//Die Funktion wird von hier aus geschrieben.
 public setOwner(Person person) { //Nehmen Sie die variable Person, die eine Instanz der Person-Klasse ist, als Argument
  this.owner = person; //Der Eigentümer dieser Instanz ist derselbe wie die eingegebene variable Person.
 }

 public getOwner() {
  return this.owner; //Gibt die Eigentümerinformationen für diese Instanz zurück. Nichts wird von selbst angezeigt, da nur Informationen zurückgegeben werden
 }
}
Namespace (Dies ist ein PHP-Beispiel, tut mir leid)

Namespaces werden verwendet, wenn Klassen, Funktionen und Variablen an anderer Stelle gelesen werden (erforderlich, eingeschlossen). Wenn zu diesem Zeitpunkt eine Klasse, Funktion oder Variable mit demselben Namen vorhanden ist, tritt ein Fehler auf. Daher wage ich es, eine übergeordnete Existenz über Klassen, Funktionen und Variablen zu erstellen. Das ist der Namespace. Die Referenz ist [Einführung in PHP] Leicht verständliche Erklärung zur Verwendung von Namespace / Verwendung!

Klassenvererbung (Elternklasse, Kinderklasse)

Mit expand können Sie eine untergeordnete Klasse erstellen, die von der übergeordneten Klasse erbt. Sie können auch die Anfangswerte von Variablen und die Einstellungen der Anfangsfunktionen für Instanzen in der untergeordneten Klasse ändern. Sie können so viele Klassen erben, wie Sie möchten, sodass Sie eine Klasse einer Klasse einer Klasse erstellen können.

Sitten und Bräuche
Abstrakte Klasse

Wenn es eine Funktion gibt, die für verschiedene untergeordnete Klassen erforderlich ist, der Verarbeitungsinhalt jedoch je nach Klasse unterschiedlich ist. ↓ Definieren Sie in der übergeordneten Klasse eine abstrakte Methode (eine Funktion, die es nicht wagt, etwas zu schreiben). In der untergeordneten Klasse müssen Sie dann die Funktion immer überschreiben und definieren. Eine Klasse mit einer abstrakten Methode wird auch als abstrakte Klasse bezeichnet, und Sie können keine Instanz dieser Klasse selbst erstellen.

Mehrfachvererbung

Obwohl in Java verboten, wird das Erben mehrerer übergeordneter Klassen durch eine untergeordnete Klasse als Mehrfachvererbung bezeichnet.

Gemeinschaft zwischen den Klassen

Eine andere B-Klasseninstanz kann als Variable innerhalb der A-Klasse definiert werden. In der House-Klasse kann beispielsweise eine Instanz der Person-Klasse als Eigentümervariable zugeordnet werden, die den Eigentümer angibt.

House.Java


class House{

 private Stirng name; //Hier werden die notwendigen Variablen vorbereitet.
 private Person owner; //Sie können eine Instanz einer anderen Klasse Person in einer Variablen namens owner speichern.

 House(String name, ...) { //()Sie können die erforderlichen Argumente eingeben. Es werden verschiedene Anfangseinstellungen zum Erstellen einer Instanz geschrieben...
 }

//Die Funktion wird von hier aus geschrieben.
 public setOwner(Person person) { //Nehmen Sie die variable Person, die eine Instanz der Person-Klasse ist, als Argument
  this.owner = person; //Der Eigentümer dieser Instanz ist derselbe wie die eingegebene variable Person.
 }

 public getOwner() {
  return this.owner; //Gibt die Eigentümerinformationen für diese Instanz zurück. Nichts wird von selbst angezeigt, da nur Informationen zurückgegeben werden
 }
}

Person.Java


class Person {
 private Stirng name; //Hier werden die notwendigen Variablen vorbereitet.

 Person(String name, ...) { //()Sie können die erforderlichen Argumente eingeben. Es werden verschiedene Anfangseinstellungen zum Erstellen einer Instanz geschrieben...
 }
//Die Funktion wird von hier aus geschrieben.
 public void detailData() { //Zeigen Sie hier detaillierte Informationen zur Instanz an
 }
}

Main.Java


house1 = New House("Ein Haus", ...);
person1 = New Person("Yamamoto", ...); //Nehmen Sie Argumente und erstellen Sie eine Instanz jeder Klasse

house1.setOwner(person1); //Der Eigentümer von Haus1 entspricht jetzt dem Wert von Person1.
house1.getOwner().detailData(); //Dadurch erhalten Sie detaillierte Informationen über den Eigentümer von Haus1.
//Eigentümerinformationen mit getOwner zurückgeben(Nichts wird von selbst angezeigt).. Danach können die Eigentümerinformationen mithilfe der von Person definierten Funktion ermittelt werden.
Eine Instanz in eine Variable einfügen

Erstellen Sie eine Instanz mit new. Erhält den Wert des Arguments, reserviert einen Speicherbereich für diese Instanz und speichert dort die Instanzinformationen. (Informationen sind binär geschrieben) ↓ Weisen Sie es einer Variablen zu. Wenn Sie eine Variable für eine Instanz erstellen, wird der Bereich für diese Variable im Speicher zugewiesen. In diesem Bereich verbleiben nur Informationen darüber, wo sich der Instanzbereich befindet.

Polymorphismus

Fühlt es sich so an, als ob eine Instanz der B-Klasse, die eine A-Klasse erbt, als Instanz der A-Klasse oder als Instanz der B-Klasse behandelt werden kann? ..

Wenn Sie beispielsweise dieselbe Funktionsverarbeitung für eine Instanz einer anderen Klasse ausführen, können Sie leicht eine Funktion für jede Klasse festlegen. Wenn die verschiedenen Klassen jedoch von einer gemeinsamen übergeordneten Klasse erben, müssen Sie lediglich die Funktionsverarbeitung für diese übergeordnete Klasse schreiben. Selbst wenn die Anzahl der untergeordneten Klassen, die die übergeordnete Klasse erben, zunimmt, ist es daher nicht erforderlich, die Funktionsverarbeitung zu schreiben.

Code, der normalerweise gemacht wird

House.Java


class House {
 .
 .
 .

 public setOwner(Person person) { //Nehmen Sie die variable Person, die eine Instanz der Person-Klasse ist, als Argument
  this.owner = person; //Der Eigentümer dieser Instanz ist derselbe wie die eingegebene variable Person.
 }
}

Villa.Java


class Villa { //Villa bedeutet Villa
 .
 .
 .

 public setOwner(Person person) { //Nehmen Sie die variable Person, die eine Instanz der Person-Klasse ist, als Argument
  this.owner = person; //Der Eigentümer dieser Instanz ist derselbe wie die eingegebene variable Person.
 }
}

Person.Java


class Person { 
 .
 .
 .

 public void buy(House house) { //Wenn Sie das variable Haus, das eine Instanz der House-Klasse ist, als Argument erhalten
  house.setOwner(this); //Diese Instanz ist der Eigentümer des variablen Hauses.
 }

 public void buy(Villa villa) { //Wenn Sie die variable Villa, die eine Instanz der Villa-Klasse ist, als Argument nehmen
  villa.setOwner(this); //Diese Instanz ist der Eigentümer der variablen Villa.
 }
}
Code, der den Polymorphismus ausnutzt

(Die gemeinsame Elternklasse der Hausklasse und der Villenklasse ist die Bauklasse.)

Person.Java


class Person { 
 .
 .
 .

 public void buy(Building building) { //Wenn Sie das variable Gebäude, das eine Instanz der Building-Klasse ist, als Argument erhalten
  building.setOwner(this); //Diese Instanz ist der Eigentümer des variablen Gebäudes.
  //Wenn Sie eine Funktion für die übergeordnete Klasse definieren, müssen Sie sie nicht für die untergeordnete Klasse definieren.
 }
}

SOLID Eine wichtige Idee in der Objektorientierung. Ich bezog mich auf Folgendes. [Was ist das objektorientierte Entwurfsprinzip](https://qiita.com/UWControl/items/98671f53120ae47ff93a#%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E9% 80% 86% E8% BB% A2% E3% 81% AE% E5% 8E% 9F% E5% 89% 87)

[[Zusammenfassung der sauberen Architektur von Onkel Bob] Objektorientiertes ~ FESTES Prinzip ~](https://qiita.com/yoshinori_hisakawa/items/25576a62123607a696f6#%E3%82%A4%E3%83%B3%E3%82%BF % E3% 83% BC% E3% 83% 95% E3% 82% A7% E3% 83% BC% E3% 82% B9% E5% 88% 86% E9% 9B% A2% E3% 81% AE% E5 % 8E% 9F% E5% 89% 87-ispinterface-segregation-Prinzip)

Ich habe ein besseres Verständnis für Laravel und objektorientierte und saubere Architektur.

Single Responsibility Principle Die Idee, dass die Definition der Funktion in der Klasse abgeschlossen sein muss.

Open-Closed Principle Kurz gesagt, jede Klasse ist klassenunabhängig und schnittstellenunabhängig.

Hören wir auf, eine Instanz der Klasse B direkt in Klasse A (neu) zu erstellen, da die Wartung schwierig ist.

Was machst du dann? Gelöst durch ein Entwurfsmuster namens Factory-Methode. Erstellen Sie zunächst eine B_Factory-Klasse mit einer Funktion, die eine Instanz der Klasse B erstellt und zurückgibt. ↓ Klasse A verwendet die Klasse B_Factory, um indirekt eine Instanz der Klasse B abzurufen.

Liskov Substitution Principle Lassen Sie es auch dann funktionieren, wenn die untergeordnete Klasse dort verwendet wird, wo die übergeordnete Klasse verwendet wird. Mit anderen Worten, die untergeordnete Klasse kann die Eigenschaften und Methoden der übergeordneten Klasse nicht definieren.

Interface Segregation Principle Aus Gründen der Wartbarkeit hängt die Klasse von der Schnittstelle ab. Wenn jedoch eine Schnittstelle zu groß ist, ist der Einflussbereich groß. Machen wir sie also kleiner.

Dependency Inversion Principle Ähnlich wie beim Open-Closed-Prinzip? Die Oberschicht sollte nicht von der Umsetzung der Unterschicht abhängen. Eine Klasse (z. B. ein Auto), die eine Instanz einer Klasse verwendet, die sich von der höheren Ebene hier unterscheidet. Eine Klasse, in der eine Instanz Ihrer Klasse aus einer anderen Klasse als der Unterklasse (z. B. Engine) verwendet wird.

Diese Lösung entspricht dem Open-Closed-Prinzip und wird nach der Factory-Methode durchgeführt.

Andere Ergänzungen

Magische Methode (PHP)

__set und __get. $ obj-> name = value; aktiviert __set → Hier kann es zugewiesen werden, indem der Eigenschaftsname und der Wert als Argumente verwendet werden. Sie können auch auf private Immobilien zugreifen. __get wird durch $ obj-> name aktiviert; → Sie können den Wert durch Angabe des Eigenschaftsnamens abrufen.

Klassenvariablen, Methoden

Statische Variablen und Methoden sind statisch, sodass es den Anschein hat, als ob die Klasse selbst Variablen und Methoden enthält. Der Vorteil ist, dass es von der Klassennamenmethode :: gelesen werden kann, sodass es ohne Instanz verwendet werden kann.

Schnittstelle

Eine Schnittstelle ist eine Sache, die einige abstrakte Methoden hat. Abstrakte Klassen dürfen nicht mehrmals vererbt werden, aber die Schnittstelle ermöglicht es, dass sie mehrfach vererbt werden. Außerdem müssen die in der geerbten Schnittstelle enthaltenen abstrakten Methoden überschrieben und definiert werden.

Referenzen, die ich als Referenz verwendet habe

[Was ich gelernt habe, nachdem ich 10 Jahre lang gegen die Objektorientierung gekämpft hatte] (https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e)

[Was ist das objektorientierte Entwurfsprinzip](https://qiita.com/UWControl/items/98671f53120ae47ff93a#%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E9% 80% 86% E8% BB% A2% E3% 81% AE% E5% 8E% 9F% E5% 89% 87)

[[Zusammenfassung der sauberen Architektur von Onkel Bob] Objektorientiertes ~ FESTES Prinzip ~](https://qiita.com/yoshinori_hisakawa/items/25576a62123607a696f6#%E3%82%A4%E3%83%B3%E3%82%BF % E3% 83% BC% E3% 83% 95% E3% 82% A7% E3% 83% BC% E3% 82% B9% E5% 88% 86% E9% 9B% A2% E3% 81% AE% E5 % 8E% 9F% E5% 89% 87-ispinterface-segregation-Prinzip)

Ich habe ein besseres Verständnis für Laravel und objektorientierte und saubere Architektur.

Recommended Posts

Objekt orientierte Programmierung
Objektorientierter Programmierbegriff
Objektorientierte Zusammenfassung
Objektorientierter
[Java] Objektorientiert
Zusammenfassung der objektorientierten Programmierung mit Java
Programmiertag 3
Grundlegende Programmierressourcen
Grundlagen der Java-Programmierung
Objektorientiertes FizzBuzz (Java)
[Java] Objektorientierte Zusammenfassung_Teil 1
[Verarbeitung × Java] Datentyp und objektorientierte Programmierung
[Java] Objektorientierte Syntax - Konstruktor
Objektorientierte (Java) Grundlagen
Java Generische Programmierung
Objektorientierte numerische Berechnung
Programmierbegriffe organisieren
[Java] Objektorientierte Zusammenfassung_Teil 2
Empfohlene Programmiersprache
Kenntnis der Objektorientierung für ein halbes Jahr Programmierung
[Java] Objektorientierte Syntax --Paket
"Vererbung", die auch Anfänger der Objektorientierung verstehen können
[# 2 Java] Welche Objektorientierung hören Sie oft?
Polymorphismus, den auch Anfänger der Objektorientierung verstehen können