2012-09-04 11 views
7

Se ho due classi, A e B,Java chiamando il metodo della sottoclasse quando si cerca di utilizzare genitore metodo di classe

public class A { 
    public int test() { 
     return 1; 
    } 
} 

public class B extends A{ 
    public int test() { 
     return 2; 
    } 
} 

Se lo faccio: A a1 = new B(), poi a1.test() restituisce 2 invece di 1 come desiderato. Questa è solo una stranezza di Java, o c'è qualche ragione per questo comportamento?

+1

Questo è chiamato 'dynamic binding', è necessario conoscere anche il' binding statico'. Diventa un po 'più complicato quando si tenta di sovrascrivere (ad esempio nascondere) i campi anziché i metodi. Troverete molte domande su questo su SO o su Google. –

risposta

3

No, è corretto (è dovuto al polimorfismo). Tutte le chiamate di metodo operano sull'oggetto, non sul tipo di riferimento.

Qui il tuo oggetto è di tipo B, quindi verrà chiamato il metodo di prova class B.

+0

Grazie, questo è quello su cui ero confuso. Mi aspettavo un comportamento basato sul tipo di riferimento. –

5

Questo è chiamato polymorphism. In fase di esecuzione verrà chiamato il metodo corretto in base al tipo "reale" di a1, che in questo caso è B.

Come wikipedia mette piacevolmente:

L'uso primario del polimorfismo nell'industria (orientata agli oggetti teoria programmazione) è la capacità di oggetti appartenenti a diversi tipi di rispondere a metodo, campo, o proprietà chiamate con lo stesso nome, ciascuna secondo un comportamento specifico del tipo appropriato. Il programmatore (e il programma) non deve conoscere l'esatto tipo di oggetto in anticipo, e quindi il comportamento esatto è determinato al tempo di esecuzione (questo è chiamato late binding o dynamic binding).

+0

+1 per il polimorfismo –

0

Questo è il comportamento previsto. Il metodo test() nella classe B è prevalente il metodo test() di classe A.

0

Per

A a1 = new B(); 

a1 sia rivolto verso l'oggetto B, che è il tipo reale in fase di esecuzione. Quindi il valore viene stampato da Object B.

0
A obj = new A(); 
obj.test() 

tornerà 1

A obj = new B(); 
obj.test() 

restituirà 2

B obj = new B(); 
obj.test() 

restituirà 2

Come detto in altre risposte è così il polimorfismo funziona.

This post potrebbe rendere le cose un po 'più chiaro

0

Java utilizza dinamica vincolante (o associazione tardiva), quindi il metodo di B si chiama, non A. Questo è l'opposto di vincolante statico. C'è un buon esempio here.

0

Si dichiara il proprio oggetto come A ma l'istanza è B. Quindi il metodo che verrà chiamato è dalla classe B.B estende A (possiamo dire che A è genitore per B) se commenterai il metodo test in B e poi richiamerai questo metodo, in questo caso il metodo invocato verrà testato dalla classe A e restituirà 1.

2

Questo è polymorphism e più specificamente in Java overriding. Se si desidera richiamare il metodo di prova della Classe A dalla Classe B, è necessario utilizzare super per richiamare il metodo delle super classi. ad esempio:

public class B extends A{ 
    public int test() { 
     return super.test(); 
} 
Problemi correlati