|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2004
Messaggi: 1136
|
[Java] Dubbio sul this con overriding e overloading
Date le seguenti classi:
Codice:
public class A { public String method1(A a){ return "a"; } public String method1(B a){ return "b"; } public String method(A a){ return a.method1(this); } } public class B extends A { public String method1(A a){ return "c"; } public String method1(B a){ return "d"; } } Codice:
B b=new B(); System.out.println(b.method(b)); Perché stampa "c" e non "d"? In altre parole perché non viene eseguito il metodo "method1" della classe B che prende in input un oggetto di tipo B essendo "this" l'oggetto "b" di tipo (statico e dinamico) B? Spero di essere stato chiaro. Grazie. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
E' semplice:
- hai richiamato method che prende come parametro un'istanza di A, tu gli hai passato un'istanza di B e questo è possibile perché B estende A. Tuttavia all'interno di method stai maneggiando un riferimento a un'istanza di A - quindi quando richiami method1 passandogli come parametro a (che è un riferimento ad un'istanza di A) il method1 che viene eseguito è quello che prende come parametro un riferimento ad A. E' a questo sto punto che entra in gioco l'override e viene richiamato il method1 definito all'interno della classe B. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: May 2004
Messaggi: 1136
|
Quote:
|
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
quello che appunto avviene è che il riferimento statico al momento della chiamata a method è al tipo A mentre il binding dinamico rimane B e questo ti consente di utilizzare la versione di method1 sovrascritta nella classe B.Quando però fai method1(this) quel this è un' istanza della classe A e di conseguenza ottieni c in stampa.
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Hai ragione, avevo letto male. Comunque all'interno di A this è un riferimento a un'istanza di A, non potrebbe essere altrimenti
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2004
Messaggi: 1136
|
Ma perché dite che this è di tipo A?
L'oggetto su cui lancio il metodo "method" è "b"; "b" ha tipo B sia statico che dinamico, quindi mi aspetto che "b" sia B; ciò mi viene confermato anche se stampo il risultato di instanceof su "b" oppure un "b.toString()": tipo B. Oppure mi state dicendo che poiché quel this si trova nella classe A è come se avesse sempre e comunque tipo statico A, anche se effettivamente l'oggetto su cui lavora è stato dichiarato di tipo statico diverso? |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
la seconda, il this punta ad un tipo A. Se tagli e incolli il metodo nella classe B otterrai in stampa d.
Sia instance of, che toString(se ridefinito) che eventualmente getClass ti restituiscono il tipo B, ma mathod è definito solo nel contesto della superclasse ed ad una sua istanza punta il this Ultima modifica di nuovoUtente86 : 22-04-2008 alle 23:40. |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: May 2004
Messaggi: 1136
|
Quote:
Penso di aver capito, grazie a tutti! ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:47.