Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
public class OberPrint {
protected String text = " OberPrintText ";
protected void print() {
System. out.println ( " OberPrint.print : " + text );
}
}
public class UnterPrint extends OberPrint{
public String text = " UnterPrintText ";
public void print() {
System.out.println ( " UnterPrint . p r i n t : " + text);
}
}
Danach jetzt das Anwendungsprogramm:
Java:
public class OUPrintTest {
public static void main ( String [ ] args ) {
UnterPint unten = new UnterPrint ( ) ;
OberPrint oben = unten ;
oben.print ( ) ;
unten.print ( ) ;
System. out . println ( " oben . t e x t = " + oben.text ) ;
System. out . println ( " unten . t e x t = " + unten.text ) ;
}
}
Ok jetzt ist die Frage welche Methode gerufen wird und welches Datenfeld text.
Dabei ist es doch so, dass der Typ des Objekts bestimmt welche Implementierung der Methode gerufen wird. Beim Datenfeld text geht es um die Referenz.
D.h doch jetzt bei diesem Beispiel, dass 2 mal die Methode print der Subklasse gerufen wird.
Es wird doch nur ein Objekt der Unterklasse erzeugt oder ?
Das hier ist ein Shadowing Problem deiner Variablen und diese werden durch statische Typauflösung gelöst. Darum erhälst du diese Ergebnisse. Methoden werden hier dynmaic dispatched.
Deine Frage versteh ich nicht ganz. Du sagst doch hier
Java:
OberPrint oben = unten ;
quasi das gleiche wie eine Zeile drüber. Dann ist klar, dass er jeweils das gleiche ausgibt "UnterPrintText"
Denn "Subklassen sind automatisch immer auch eine Instanz von der Superklasse".
Wichtig ist was bei new steht, das Objekt wir dann erzeugt. Du hast also quasi 2x ein Object von UnterPrint.
Machst du ein
Java:
OberPrint ober = new OberPrint();
ober.print();
wird auch die print Methode von der OberPrint Klasse ausgegeben.
Hast du deinen Quellcode abgetippt? So ist es nämlich nicht Compilierfähig.
Du erstellst in der Main ein Objekt vom Typ "UnterPint" deine Klasse heißt aber "UnterPrint", da sollte der Compiler schon meckern.
Die Formatierung fehlt auch vollkommen, gewöhn dir das gleich am Anfang an (falls es bei dir auch so ausschaut wie hier).
UnterPrint . p r i n t : UnterPrintText
UnterPrint . p r i n t : UnterPrintText
oben . t e x t = OberPrintText
unten . t e x t = UnterPrintText
Nachdem OberPrint ja den dynamischen Typ UnterPrint hat, wird immer die Methode des aktuellen (dynamischen Typs - dynamic dispatching) aufgerufen.
Bei dem text Property ist es so, dass hier aber der statische Typ entscheidet welche gerade Sichtbar ist - da es ja in der Unterklasse verdeckt wird (gleicher Name - Shadowing).
Ich habe es aus meinem Skript abgetippt. Sorry für die Fehler. Es ging mir nur um das Verständnis. Vor allem den Unterschied zwischen Objekttyp und Referenztyp.
Nochmal:
OberPrint oben = unten ;
Eine Zeile drüber habe ich ja ein Objekt der UnterPrint erstellt mit dem Namen unten.
Dann deklariere ich eine Variable oben vom Typ OberPrint und weise unten diesem zu.
Was ist jetzt genau die Referenz und der tatsächliche Objekttyp ?
Aha ich verstehe.
In der Vorlesung stand es wie folgt:
Wie verhält sich die Methode print?
der tatsächliche Typ des Objekts (nicht der Typ der Referenz) bestimmt, welche
Implementierung der Methode gerufen wird
Welches Datenfeld text wird verwendet?
der deklarierte Typ der Referenz bestimmt, auf welche Klasse dafür zugegriffen wird
(nicht der tatsächliche Objekttyp)