2010-09-28 6 views
6
class A { public static void main(String[] args) 
{ A a = new A(); 
    B b = new B(); 
    A ab = new B(); 
    System.out.format("%d %d %d %d %d %d", a.x, b.x, ab.x, a.y, b.y, ab.y); } 
    int x = 2; 
    int y = 3; 
    A(int x) { this.x = x; } 
    A() { this(7); } } 

class B extends A { 
    int y = 4; 
    B() { super(6); 
    } 

Hey alle, ich habe gerade einige Beispiele aus meinem Kurs durchgelesen und bin auf dieses Problem gestoßen, das mich überhäuft hat.
Ich weiß, dass , dass dieser Code aus "7 6 6 3 4 3"Echte vs Scheinbare Klassen in Java

Aber warum ist auf 3 ab.y gleich gedruckt werden soll? Ist nicht der "reale" Objekttyp ab Klasse B? Was würde mich dann glauben machen, dass ab.y 4 sein?

Antwort

8

Da Sie auf die Felder direkt zugreifen, und nicht über Getter-Methoden.

Sie können Felder nicht überschreiben, nur Methoden.

Klasse B hat ein Feld y zusätzlich zu dem in der Elternklasse A. Die beiden Felder interferieren nicht miteinander, was man abruft, wird zur Kompilierzeit bestimmt (nach dem Typ, der dem Compiler bekannt ist).

Wenn Sie sagen,

A ab = new B(); 

dann

ab.y 

wird yA in Klasse deklariert auf dem Feld sehen kompiliert werden. Dies wird zur Laufzeit nicht an die Klasse der realen Instanz gesendet. Bei einer statischen Methode wäre es genauso.

Wenn Sie

B ab = new B(); 

tun dann bekommen Sie das Feld in der Klasse B.

+0

In Ordnung, das macht es viel auf, danke! –