|
|||||||
|
|
|
![]() |
|
|
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: 2780
|
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: 2780
|
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 : 23-04-2008 alle 00: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: 16:10.




















