2012-04-14 7 views
3

Im folgenden Szenario versteckt:Java Feld

class Person{ 
    public int ID; 
} 

class Student extends Person{ 
    public int ID; 
} 

Student „versteckt ID-Feld der Person

, wenn wir die folgenden im Speicher darstellen wollte.

Student john = new Student(); 

würde john Objekt haben zwei getrennte Speicherplätze für Storint Person.ID und seine eigene?

Antwort

5

Richtig. Jede Klasse in Ihrem Beispiel hat ihr eigenes int ID ID-Feld.

Sie können die Werte auf diese Weise aus den Unterklassen lesen oder zuzuweisen:

super.ID = ... ; // when it is the direct sub class 
((Person) this).ID = ... ; // when the class hierarchy is not one level only 

oder extern (wenn sie öffentlich sind):

Student s = new Student(); 
s.ID = ... ; // to access the ID of Student 
((Person) s).ID = ... ; to access the ID of Person 
+0

Das entspricht meinem Kommentar unten: das bedeutet, dass Person, im Speicher, nimmt 8 Bytes Speicherplatz und hat zwei Speicherplätze mit zwei IDs Recht? – Bober02

+0

Ja, Sie haben zwei IDs – dash1e

1

Ja, das ist richtig. Es wird zwei verschiedene Ints geben.

Sie zugreifen können Person ‚s int in Student mit:

super.ID; 

Vorsicht aber, dynamische Dispatch geschieht nicht für Mitgliederfelder. Wenn Sie eine Methode für die Person definieren, die das Feld ID verwendet, bezieht sie sich auf das Feld Person und nicht auf Student, auch wenn sie auf ein Objekt Student aufgerufen wird.

public class A 
{ 
    public int ID = 42; 

    public void inheritedMethod() 
    { 
     System.out.println(ID); 
    } 
} 

public class B extends A 
{ 
    public int ID; 

    public static void main(String[] args) 
    { 
     B b = new B(); 
     b.ID = 1; 
     b.inheritedMethod(); 
    } 
} 

Die oben wird 42 drucken, nicht 1.

+0

Nur um sicher zu sein, müsste Speicher etw wie : 120: 10 -> Person.ID 124: 99 -> this.ID aber neuer Student() nur 120 haben würde: 10 – Bober02

+0

Ich verstehe deinen Kommentar nicht. Student hat eine eigene ID und einen zweiten, eindeutigen Int mit demselben Namen, der von Person geerbt wurde. Diese zwei Eingänge teilen nicht den gleichen Speicherort und können unabhängig voneinander abgerufen werden. (Ob Sie dieses "Feature" tatsächlich verwenden sollten oder nicht, ist fraglich. Es kann sehr verwirrend sein, besonders mit virtuellen Methoden.) – Mat

+0

Ok, ich wollte nur fragen, ob das neu instantiierte Studentenobjekt 8 Bytes Speicher belegt (zwei getrennte Speicherplätze für beide IDs) und der Schüler braucht nur 4 Bytes Speicher? – Bober02

5

Ja, wie Sie mit überprüfen können:

class Student extends Person{ 
    public int ID; 

    void foo() { 
     super.ID = 1; 
     ID = 2; 
     System.out.println(super.ID); 
     System.out.println(ID); 
    } 
}