Java learning_Behavior, wenn ein Feld mit demselben Namen und eine Methode mit demselben Namen in zwei Klassen in einer Vererbungsbeziehung vorhanden sind

Vorwort

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.

Inhalt des Lernens

Überprüfung 1: Instanziierung = Unterklasse, Variablentyp = Oberklasse

Erstellen Sie eine Instanz einer Unterklasse, legen Sie sie in einer Variablen vom Typ Superklasse fest und überprüfen Sie das Verhalten beim Aufrufen.

Verifizierungsquelle

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();
	}
}

Prüfergebnis

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.

Überprüfung 2: Instanziierung = Unterklasse, Variablentyp = Unterklasse

Dieses Mal werden die zu instanziierende Klasse und der Typ der Variablen ausgerichtet und überprüft.

Verifizierungsquelle

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();
	}
}

Prüfergebnis

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.

Extra: Verhalten, wenn die aus der Unterklasse überschriebene Methode verloren geht

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.

Verifizierungsquelle

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();
	}
}

Prüfergebnis

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.

Impressionen

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

Java learning_Behavior, wenn ein Feld mit demselben Namen und eine Methode mit demselben Namen in zwei Klassen in einer Vererbungsbeziehung vorhanden sind
Gibt es keinen Namenskonflikt, wenn enum in der switch-Anweisung denselben Namen hat?
wsimport-Fehlerbehandlung (Eine Klasse / Schnittstelle mit dem gleichen Namen "xxx" wird bereits verwendet)
[Kopfpanik] Priorität, wenn Variablen / Methoden mit demselben Namen in geerbten Klassen verwendet werden
[Java] So suchen Sie mit der Methode includes nach Werten in einem Array (oder einer Liste)
So geben Sie den Wert aus, wenn sich ein Array im Array befindet
Wenn Sie sshpass von Java mit Shell usw. aufrufen, scheint es notwendig zu sein, einen Pfad zu haben.
Eine nette Problemumgehung, wenn "eine Instanz einer der beiden Klassen vorhanden ist"
Deklarieren Sie eine Methode mit einem Java-Rückgabewert mit dem Rückgabewert-Datentyp
Ruft die als Argument übergebene Zeichenfolge als Methode mit send auf
So verweisen Sie auf eine Spalte, wenn Sie die Spaltennamensmethode in ActiveRecord überschreiben
Wenn Sie einem Argument in einer Ruby-Methode neu zuweisen und dann "super" aufrufen → Das neu zugewiesene wird verwendet
Was ist die Hauptmethode in Java?
Ursache ist nicht sichtbar, wenn Methoden anderer Klassen in Java aufgerufen werden
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (graue Magie, die weniger schwarze Magie ist)
Erstellen wir eine TODO-Anwendung mit Java 12-Verarbeitung, wenn eine Anforderung mit einer nicht verwendeten HttpMethod eingeht. ・ Verarbeitung, wenn ein Fehler auf dem Server auftritt
Eine peinliche Geschichte, die am selben Tag behandelt wurde, als versucht wurde, die Daten 3/31 und 4/1 zu vergleichen [Java / Kalender]
Verarbeitung, wenn eine ID, die nicht in der Datenbank vorhanden ist, in die URL eingegeben wird
Erste Schritte mit JavaFX mit einer App, die den Alkoholgehalt berechnen kann, wenn eine starke Null durch einen Biss geteilt wird