Zunächst verfügt der Konstruktor selbst über einen impliziten Konstruktor ohne Argumente (Standard):
①Schreiben Sie den Konstruktor nicht in die erste Codezeile Klasse ist die Tatsache, dass es ein Standardkonstrukt ohne Argumente gibt (das System schreibt es implizit für Sie)
public class Student { private String name; // public Student() {} 隐式地“写”在这里,你看不见 // Strudent类中虽然没有写构造方法,但相当于有上面的无参构造 // 只不过是隐式的,你看不见 }
(empfohlenes Video: Java-Video-Tutorial )
②Schreiben Sie nur den Konstruktor mit Parametern, was nur dem Konstruktor mit Parametern entspricht (die implizite parameterlose Konstruktion wird abgeschirmt und ignoriert und als ungültig betrachtet)
public class Student { private String name; public Student(String name) { this.name=name; } // 此时原来Strudent类中的隐式的无参构造方法被屏蔽了,无效了 // 类中只有带参构造 }
③ Wenn Sie sowohl parameterlose als auch parametrisierte Konstruktoren haben möchten, müssen Sie die parameterlosen und parametrisierten Konstruktoren explizit schreiben
public class Student { private String name; public Student() {} // 显式地将无参构造写出来 public Student(String name) { this.name=name; } // 若想Strudent类中拥有无参构造方法,必须显式地写出来 }
Um die Vererbung weiter zu kombinieren, müssen Sie die untergeordneten und übergeordneten Klassen berücksichtigen:
④Im Konstruktor der Unterklasse (ob ohne Parameter oder mit Parametern) enthält die erste Codezeile in der Methode tatsächlich implizit den Parameterlosen Konstruktor der übergeordneten Klasse
Das heißt: super()
public class Stu extends Student { private String name; public Stu() { // super(); // 在子类的无参构造中,super()是隐式的“写”在这里的 } public Stu(String name) { // super(); this.name=name; // 在子类的带参构造,上面的super()同样也是隐式的“写”在这里的 } }
Aus diesem Grund wird beim Aufruf des Konstruktors einer Unterklasse zuerst der parameterlose Konstruktor der übergeordneten Klasse aufgerufen, da der Standardwert super() vorhanden ist.
⑤ Ähnlich wie bei ② oben blockiert super(xx) beim Schreiben eines parametrisierten Konstrukts das implizite super()
public class Stu extends Student { private String name; public Stu(String name) { // super(); 原来隐式写在这里的super()被屏蔽了,无效了 super(name); // 在子类的带参构造, 由于的super(name)的存在,super()无效了 //此时子类的带参构造中,只有super(name) } }
Aus diesem Grund, wenn die übergeordnete Klasse nicht vorhanden ist Wenn es sich um einen parameterlosen Konstruktor handelt (das heißt, es gibt nur einen parametrisierten Konstruktor – entsprechend Fall 2), kann die Konstruktormethode der Unterklasse nicht kompiliert werden. Dies liegt daran, dass der Konstruktor der untergeordneten Klasse (mit oder ohne Parameter) den parameterlosen Konstruktor der übergeordneten Klasse aufruft. Da der Compiler versucht, super() in zwei Konstruktoren der untergeordneten Klasse einzufügen, der Standardkonstruktor der übergeordneten Klasse jedoch undefiniert ist, meldet der Compiler eine Fehlermeldung.
Um dieses Problem zu lösen, genügt
1) Fügen Sie der übergeordneten Klasse einen Konstruktor ohne Argumente hinzu – fügen Sie der übergeordneten Klasse explizit den Konstruktor ohne Argumente hinzu
2 ) Löschen Sie den benutzerdefinierten parametrisierten Konstruktor in der übergeordneten Klasse – gleichbedeutend mit der Wiederherstellung des standardmäßigen parameterlosen Konstruktors
3) Fügen Sie Super(XXX) zum Unterklassenkonstruktor hinzu – über das Original von ⑤ Blockieren Sie den Standard-super()
Dieser Artikel stammt von der chinesischen PHP-Website, Spalte Java-Tutorial, willkommen zum Lernen!
Das obige ist der detaillierte Inhalt vonKonstruktionsmethode der untergeordneten Elternklasse bei der JAVA-Vererbung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!