[Java] Objektorientierte Syntax - Konstruktor
Konstrukteur
- Bei Verwendung einer Klasse ** Eine Methode, die beim Instanziieren (Erstellen eines Objekts) mit dem neuen Operator aufgerufen wird **
- Wird verwendet, um die Feldinitialisierung und Vorbereitung der in der Klasse verwendeten externen Ressourcen zu beschreiben
- ** Zugriffsmodifikatoren verfügbar **
* public, protected, private
- ** Kein Rückgabewert **
- Der Rückgabewert ist nicht ungültig und ** der Typ selbst kann nicht beschrieben werden **
- Der Befehl return kann nicht verwendet werden
- ** Kann nicht frei benannt werden **
- Machen Sie den Namen mit dem Klassennamen identisch
- Setzen Sie das Argument auf das entsprechende Feld im Konstruktor
- Argumente und Felder haben den gleichen Namen
this. field name = argument;
- Wenn sowohl ein Feldinitialisierer als auch ein Konstruktor vorhanden sind, hat die Konstruktorinitialisierung Priorität.
//Argumentname im Konstruktor/Stellen Sie das Alter auf das entsprechende Feld ein
public class Person {
public String name;
public int age;
//Konstrukteur
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String show() {
return String.format("%s(%d).", this.name, this.age);
}
}
ConstBasic.java
public class ConstBasic {
public static void main(String[] args) {
var p = new Person("Yamada Taro", 30);
System.out.println(p.show()); //Ich bin Taro Yamada (30 Jahre alt).
}
}
Standardkonstruktor
- Ein leerer Konstruktor ohne Argumente, der implizit generiert wird, wenn die Definition weggelassen wird **
- Das Folgende ist das gleiche
- Beachten Sie, dass beim Hinzufügen eines Konstruktors mit Argumenten ein Fehler auftritt.
public class MyClass{
}
public class MyClass{
public MyClass(){
}
}
Überlast
- Der Konstruktor kann mehrere Signaturen haben
* StringBuilder()
- StringBuilder (String str): Generiert ein StringBuilder-Objekt mit einer Zeichenfolge
- StringBuilder (int Kapazität): Generiert ein StringBuilder-Objekt mit Zeichenfolge und Kapazität
- Verwenden Sie diese Option, um eine Überladung mit übereinstimmenden Argumenten aufzurufen
- ** Dieser Aufruf steht am Anfang des Konstruktors! ** **.
Person.java
public class Person {
public String name;
public int age;
//Konstrukteur
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
//Rufen Sie den Konstruktor auf
this("Hallo Kitty", 46);
}
public void show() {
System.out.printf("%s(%d).\n", this.name, this.age);
}
}
ConstructorBasic.java
public class ConstructorBasic {
public static void main(String[] args) {
var p = new Person();
p.show(); //Ich bin Kitty (46 Jahre alt).
}
}
Initialisierungsblock
- ** Anonymer Block direkt unter der Klasse {...} **
- ** Beim Instanziieren vor dem Konstruktor ausführen **
- ** Code ausschneiden, der mehreren Konstruktoren gemeinsam ist ** Rolle
- Geben Sie dem Konstruktor zunächst Priorität
- Überlastung, die den Standardwert der Initialisierung darstellt, ist nicht der Initialisierungsblock, sondern diese Aufrufpriorität
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
public class Person {
public String name;
public int age;
public LocalDateTime updated;
//Initialisierungsblock
{
this.updated = LocalDateTime.now();
}
//Vor-und Nachname,Vom Geburtstag initialisieren
public Person(String firstName, String lastName, LocalDate birth) {
this.name = lastName + " " + firstName;
this.age = Period.between(birth, LocalDate.now()).getYears();
}
//Name,Vom Alter an initialisieren
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Fabrikmethode
- ** Methode zur Instanziierung **
- Erstellen Sie nur eine Instanz und geben Sie sie als Rückgabewert zurück
- Machen Sie den Konstruktor privat, damit er nur über Factory-Methoden instanziiert werden kann
var fc = FactoryClass.getInstance();
- Verdienst
- ** Kann frei benannt werden **
- cf: Konstruktor nicht erlaubt
- ** Sie müssen keine Instanz erstellen **
- Wiederverwendbare zwischengespeicherte Instanzen (Singleton-Muster usw.)
- ** Der Rückgabetyp kann abstrakt / Schnittstellentyp sein **
- Da es sich um eine Methode handelt, kann der Rückgabewert jede abgeleitete / implementierte Klasse zurückgeben.
- Die Abhängigkeit von der Implementierungsklasse kann nur auf die Factory-Klasse beschränkt werden
public class FactoryClass {
//privater Konstrukteur
private FactoryClass() {
System.out.println("Fabrik!!");
}
//Fabrikmethode
public static FactoryClass getInstance() {
return new FactoryClass();
}
}