Ich werde ein Memorandum darüber aufbewahren, was ich während des Studiums für die Java Silver 11-Qualifikation gelernt habe.
Es war schwierig, das Verhalten zu verstehen, wenn es in den beiden geerbten Klassen ein Feld mit demselben Namen und eine Methode mit demselben Namen gab. Deshalb habe ich versucht, während der Überprüfung zu lernen.
Erstellen Sie eine Instanz einer Unterklasse, legen Sie sie in einer Variablen vom Typ Superklasse fest und überprüfen Sie das Verhalten beim Aufrufen.
Astudy Klasse
class Astudy {
String val = "A";
void print() {
System.out.println("Eine Studienausgabe->" + val);
}
}
Bstudy Klasse
class Bstudy extends Astudy {
String val = "B";
void print() {
System.out.println("Bstudy Ausgabe->" + val);
}
}
Ausführungsklasse
public class Study {
public static void main(String[] args) {
Astudy a = new Astudy();
Astudy b = new Bstudy();
System.out.println("Ausgabe der Variablen a->" + a.val);
System.out.println("Ausgabe der Variablen b->" + b.val);
a.print();
b.print();
}
}
Ergebnis der Überprüfung 1
Ausgabe der Variablen a->A //Referenzieren einer Superklasse
Ausgabe der Variablen b->A //Referenzierung der Superklasse ...(1)
Eine Studienausgabe->A //Aufruf einer Superklassenmethode
Bstudy Ausgabe->B //Aufrufen einer Unterklassenmethode ...(2)
** Erklärung von (1) ** Die Bstudy-Klasse wurde instanziiert, aber die Ausgabe ist der Wert der Astudy-Klasse. Dies liegt daran, dass das Objekt, das die Instanz erstellt hat, auf den Klassentyp Astudy festgelegt ist. Da es eine Regel gibt, dass ** Feldreferenzen die im Variablentyp ** deklarierte verwenden, wird der in der Astudy-Klasse definierte Wert gemäß dieser Regel ausgegeben.
** Erklärung von (2) ** Im Gegensatz zu Feldern rufen Methodenaufrufe ** Methoden instanziierter Klassen ** auf, sodass die print () -Methode der Bstudy-Klasse ausgeführt wird. Obwohl es die Astudy-Klasse erbt, ist das Referenzziel des Felds der Wert des in der Bstudy-Klasse definierten Felds, da der Bereich für die Variable nicht angegeben ist.
// Kommentar Scope = this oder super. Diese oder, falls weggelassen, beziehen sich auf eine eigene Klasse. Im Fall von Super beziehen Sie sich auf die erbende Klasse.
Dieses Mal werden die zu instanziierende Klasse und der Typ der Variablen ausgerichtet und überprüft.
Astudy Klasse
class Astudy {
String val = "A";
void print() {
System.out.println("Eine Studienausgabe->" + val);
}
}
Bstudy Klasse
class Bstudy extends Astudy {
String val = "B";
void print() {
System.out.println("Bstudy Ausgabe->" + val);
}
}
Ausführungsklasse
public class Study {
public static void main(String[] args) {
Astudy a = new Astudy();
Bstudy b = new Bstudy(); //Ändern Sie den Typ in Bstudy
System.out.println("Ausgabe der Variablen a->" + a.val);
System.out.println("Ausgabe der Variablen b->" + b.val);
a.print();
b.print();
}
}
Ergebnis der Überprüfung 1
Ausgabe der Variablen a->A //Referenzieren einer Superklasse
Ausgabe der Variablen b->B //Referenzieren einer Unterklasse ...(1)
Eine Studienausgabe->A //Aufruf einer Superklassenmethode
Bstudy Ausgabe->B //Aufrufen einer Unterklassenmethode ...(2)
** Erklärung von (1) ** Durch Festlegen der Instanz auf eine Variable vom Typ Unterklasse unterschied sich das Feldreferenzziel von der Überprüfung 1.
** Erklärung von (2) ** Gleiches Ergebnis wie Überprüfung 1. Stellen Sie sicher, dass dies keinen Einfluss auf den Typ der Variablen hat.
In Verifikation 1 und Verifikation 2 hat Bstudy die print () -Methode der Astudy-Klasse der Vererbungsquelle überschrieben, aber das Verhalten, wenn dies nicht überschrieben wurde, wurde verifiziert.
Astudy Klasse
class Astudy {
String val = "A";
void print() {
System.out.println("Eine Studienausgabe->" + val);
}
}
Bstudy Klasse
class Bstudy extends Astudy {
String val = "B";
// print()Methode löschen
}
Ausführungsklasse
public class Study {
public static void main(String[] args) {
Astudy a = new Astudy();
Astudy b = new Bstudy(); //Ändern Sie den Typ in Astudy
System.out.println("Ausgabe der Variablen a->" + a.val);
System.out.println("Ausgabe der Variablen b->" + b.val);
a.print();
b.print();
}
}
Ergebnis der Überprüfung 1
Ausgabe der Variablen a->A //Referenzieren einer Superklasse
Ausgabe der Variablen b->A //Referenzierung der Superklasse ...(1)
Eine Studienausgabe->A //Aufruf einer Superklassenmethode
Eine Studienausgabe->A //Aufruf einer Superklassenmethode ...(2)
** Erklärung von (1) ** Das gleiche Ergebnis wurde erhalten, weil der Variablentyp in die Oberklasse wie in Verifikation 1 geändert wurde.
** Erklärung von (2) ** Die geerbte Methode wurde aufgerufen, da die Unterklasse keine weiteren Methoden enthält. Das Verhalten beim Erstellen einer Instanz einer Unterklasse besteht darin, dass die Unterklasse und die Oberklasse zu einer Instanz kombiniert werden. Wenn zu diesem Zeitpunkt Methoden mit derselben Definition mit jeder Klasse übereinstimmen, werden die Methoden der Unterklasse überschrieben (überschrieben). Da Verifikation 1 das obige Muster ist, wurde die Methode der Bstudy-Klasse aufgerufen. Da die Überprüfung der Zusatzausgabe nicht überschrieben wurde, wurde die Methode der Astudy-Klasse aufgerufen.
Es gab keinen praktischen Fall, in dem ich mir dessen bewusst sein musste, daher war ich verwirrt über mein Verständnis. Der Grund, warum die Methode die Klasse zur Instanzzeit verwendet, während das Feld mit dem Variablentyp deklariert ist, scheint auf den Unterschied zwischen Kompilierungszeit und Laufzeit zurückzuführen zu sein, dies ist jedoch noch gut verstanden. Nicht. Dies ist eine zukünftige Ausgabe.
Recommended Posts