2016-02-15 9 views
7

Bestimmen Sie die Ausgabe:Java-Vererbung und späte Bindung, warum hat int id den Elternklassenwert und nicht die Kindklasse?

public class Test1{ 
    public static void main(String args[]){ 
     ChildClass c = new ChildClass(); 
     c.print(); 
    } 
} 

class ParentClass{ 
    int id = 1; 
    void print(){ 
     System.out.println(id); 
    } 
} 

class ChildClass extends ParentClass{ 
    int id = 2; 
} 

Ich weiß, dass die Antwort 1 ist, und ich vermute, dass es da ist, da die Druckfunktion im ChildClass nicht außer Kraft gesetzt wird, ist es die gleiche Definition hat, wie es hat in die ParentClass. Warum wird die ID nicht in der untergeordneten Klasse angegeben, da Java die späte Bindung verwendet?

Antwort

2

Die einzige Version der print Methode ist in der Parent Klasse, und es hat nur Sicht auf Parent ‚s id Feld.

Um die Child zu drucken ‚s id, dann würden Sie die print Methode @Override haben genau die gleiche Idiom verwenden, die Child drucken würde‚s-ID, falls vorhanden, wenn auf einer Instanz von Child aufgerufen, oder Parent‘ s id Feld wenn sichtbar und id wurde in Child deklariert.

Beispiel

Wenn Sie diesen Code in Ihre ChildClass hinzu:

void print() { 
    System.out.println(id); 
} 

Entweder ChildClassint id = 2 erklärt, wie es jetzt der Fall ist, und jeder Aufruf von print auf einer ChildClass Instanz 2 drucken.

Oder ChildClass nicht id nicht erklären und print drucken 1 vorgesehen ParentClass und ChildClass im selben Paket sind (Ihr id Feld ist default-Zugang in ParentClass).

+0

Das macht Sinn, danke! – drossy11

+0

@ drossy11 du bist willkommen. Sehen Sie sich auch andere Antworten an (eher theoretisch, aber überlegenswert): Die Felder sind * versteckt *, Methoden sind * überschrieben *. – Mena

+0

Schnelle Frage, wenn eine hallo() -Funktion in der parentClass definiert wurde, die in childClass() überschrieben wurde, und es gab einen Aufruf für die hallo() -Funktion im Konstruktor der Klasse parentClass() würde sie die hallo() verwenden Klasse in der ChildClass() definiert, weil es dynamische Dispatch für Methoden gibt, oder? – drossy11

6

Es gibt keinen dynamischen Versand für Objektfelder, nur für Methoden.

+3

Stattdessen gibt es ["Verbergen"] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#d5e12172). – biziclop

+0

Oh ich sehe, danke! – drossy11

+0

Schnelle Frage, wenn eine hallo() -Funktion in der parentClass definiert wurde, die in childClass() überschrieben wurde, und es gab einen Aufruf für die hallo() -Funktion im Konstruktor der Klasse parentClass(), würde die hallo() verwenden Klasse in der ChildClass() definiert, weil es dynamische Dispatch für Methoden gibt, oder? – drossy11

1

Stellen Sie die ID im übergeordneten Element geschützt und ändern Sie den Wert im untergeordneten Konstruktor.

+0

Das macht Sinn, danke! – drossy11

+0

Wenn die ID im Parent geschützt wird, ändert sich der Wert der Ausgabe nicht. Es ist immer noch 1 wegen "Verbergen" oder "Schatten" -Effekt der Elternklasse –

+0

würde ich nicht zustimmen. Das untergeordnete Element kann den Wert im Konstruktor ändern und bleibt für die gesamte Klasse bestehen, es sei denn, das übergeordnete Element ändert es. –

2

Da das zweite Feld id Erklärung die erste versteckte, nicht überschreiben es.

Klasse ChildClass hat zwei Felder genannt id, die jeweils zugänglich als super.id und this.id.

Verwandte Themen