2013-01-01 2 views
6

Mögliche Duplizieren:
The concept of shadowingWie behandelt Java Felder beim Upcasting?

Ich bin verwirrt darüber, wie die Felder von Klassen behandelt werden in Java während Upcasting. Zum Beispiel:

class SuperClass 
{ 
    String myString = "String in SuperClass"; 

    public void myMethod() 
    { 
     System.out.println("Method in SuperClass"); 
    } 
} 

class SubClass extends SuperClass 
{ 
    String myString = "String in SubClass"; 

    public void myMethod() 
    { 
     System.out.println("Method in SubClass"); 
    } 
} 

class Question 
{ 
    public static void main(String[] args) 
    { 
     SuperClass test = new SubClass(); 
      // object test is an instance of SubClass 
      // but I am telling the compiler to treat it as SuperClass 

     test.myMethod(); 
     System.out.println(test.myString); 

    } 
} 

Ausgang:

Method in SubClass 
String in SuperClass //Why is "String in SubClass" not used? 

Wenn ich ein test Objekt erstellen sie eine Instanz von SubClass Klasse ist; Ich rate dem Compiler jedoch, es als SuperClass zu behandeln. Für die Methodenarbeit ist mir alles klar: Ich kann nur die Methoden der SubClass verwenden, wenn eine bestimmte Methode für SuperClass definiert ist.

Allerdings bin ich verloren, warum ein Feld von SuperClass verwendet wird, wenn ich versuche, auf myString von test zuzugreifen. Da test eine Instanz von SubClass ist, würde ich erwarten, myString definiert in SubClass verwendet werden, warum ist das nicht passiert? Was vermisse ich?

Ich weiß, dass ich zugreifen kann, myString von SubClass mit this Operator. Zum Beispiel könnte ich printMyString Methode in Superklasse definieren und überschreiben sie mit

public void printMyString() 
{ 
    System.out.println(this.myString); 
} 

Im SubClass, so meine Frage vor allem darum, wie kommt das Feld der SuperClass in test verwendet wird. Vielleicht fehlt mir etwas Offensichtliches?

Ich habe versucht, nach der Antwort zu suchen, und das nächste Thema, das ich fand, war Upcasting in Java and two separate object properties, obwohl hilfreich, beantwortete es meine Frage nicht.

Vielen Dank im Voraus

+0

gute Frage @Akavall –

Antwort

7

Attribute können nicht wie Methoden überlastet werden.

test.myMethod(); 

Hier hängt Methodenaufruf auf dem Typ des tatsächlichen Objekts. Hier ist das Objekt vom Typ SubClass, so dass die Methode SubClass aufgerufen wird.

test.myString 

Während Attribute zugreifen, hängt es von der Art von Referenz variable. Hier wird die Referenzvariable ie test vom Typ SuperClass so Attribut von SuperClass zugegriffen.

Was Sie suchen, ist class variable hiding/shadowing.

+0

Netter Link, danke. Der Schlüssel ist: "Wenn eine Instanzvariable in einer Unterklasse denselben Namen wie eine Instanzvariable in einer Superklasse hat, wird die Instanzvariable in der Klasse ausgewählt, die den Referenztyp darstellt." – Akavall

+0

@Akavall: Du hast den Punkt getroffen :) – xyz

3

Felder in Java sind nur versteckt und nicht tatsächlich überschrieben (das bedeutet nicht, dass wir eine Kompilierzeit Fehler beim Versuch bekommen, stattdessen werden sie nicht im eigentlichen Sinne überschrieben).

Zwingende bedeutet das Mitglied sollte auf der Grundlage des Laufzeit Typ des Objekts und nicht auf dem deklarierten Typ basiert aufgerufen werden.

Aber verbindlich für Felder in Java ist immer statisch und daher ist es auf der Grundlage des deklarierten Typen der Objektreferenz nur.

In dem Beispiel, das Sie angegeben haben, verstecken Sie die Klassenvariable mit dem Namen 'myString' in der Klasse SubClass die Klassenvariable, die sie von ihrer Oberklasse SuperClass mit dem gleichen Namen 'myString' geerbt hätte.

Java-Sprachspezifikation:

Wenn die Klasse ein Feld mit einem bestimmten Namen erklärt, dann ist die Erklärung dieses Feldes wird gesagt, in Super jegliche und alle zugänglichen Deklarationen von Feldern mit demselben Namen verstecken und Superschnittstellen der Klasse.

Auf ein ausgeblendetes Feld kann zugegriffen werden, indem ein qualifizierter Name verwendet wird, wenn es statisch ist, oder ein Feldzugriffsausdruck verwendet wird, der das Schlüsselwort super oder eine Umwandlung in einen Superklasse-Typ enthält.

Verwandte Themen