2016-02-15 15 views
7

determinare la potenza:Ereditarietà Java e associazione tardiva, perché int id ha il valore della classe parent e non quello della classe figlio?

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; 
} 

So che la risposta è 1, e sto cercando di indovinare che è perché dal momento che la funzione di stampa non viene sovrascritto nel ChildClass, ha la stessa definizione che ha in il ParentClass. Perché l'ID non è quello fornito in classe figlio poiché Java utilizza l'associazione tardiva?

risposta

2

L'unica versione del metodo print è nella classe Parent, e ha solo la visibilità sul campo idParent s'.

Per stampare il Child 'id s, che avrebbe dovuto @Override il metodo print utilizzando esattamente lo stesso linguaggio, che sarebbe stampare Child 's id se presente, quando viene richiamato su un'istanza di Child o Parent' Il campo id se visibile e non id è stato dichiarato in Child.

Esempio

Se si aggiunge questo codice al tuo ChildClass:

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

In entrambi i ChildClass dichiara int id = 2 come accade oggi, ed ogni invocazione di print su un'istanza ChildClass stamperà 2.

Oppure, ChildClass non dichiara id e print stamperà 1 fornito ParentClass e ChildClass sono nello stesso pacchetto (il vostro campo id è default-accesso in ParentClass).

+0

Questo ha senso, grazie! – drossy11

+0

@ drossy11 prego. Date anche un'occhiata ad altre risposte (più teoriche ma degne di essere considerate): i campi gist being sono * hidden *, i metodi sono * sovrascritti *. – Mena

+0

Domanda veloce, se c'era una funzione hello() definita nella parentClass sovrascritta in childClass(), e c'era una chiamata per la funzione hello() nel costruttore della classe parentClass() usava l'hello() classe definita in childClass() perché c'è un dispatch dinamico sui metodi, giusto? – drossy11

6

Non esiste alcuna spedizione dinamica sui campi oggetto, solo sui metodi.

+3

Invece c'è ['hiding'] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#d5e12172). – biziclop

+0

Oh capisco, grazie! – drossy11

+0

Domanda veloce, se c'era una funzione hello() definita nella parentClass che era stata sovrascritta in childClass(), e c'era una chiamata per la funzione hello() nel costruttore della classe parentClass() usava l'hello() classe definita in childClass() perché c'è un dispatch dinamico sui metodi, giusto? – drossy11

1

Rendi l'ID protetto in parent, quindi modifica il valore in child constructor.

+0

Questo ha senso grazie! – drossy11

+0

L'identificazione protetta in parent non modifica il valore dell'output. È ancora 1 a causa dell'effetto "nascosto" o "ombreggiato" della classe genitore –

+0

Non sarei d'accordo. Il bambino può modificare il valore nel costruttore e continuerà nella classe, a meno che il genitore non lo cambi. –

2

Perché la seconda dichiarazione campo id è nasconde il primo, non override esso.

Classe ChildClass ha due campi denominati id, ognuno accessibile come super.id e this.id.

Problemi correlati