|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: May 2002
Città: Prato
Messaggi: 101
|
Polimorfismo in Java
Salve,
ho un dubbio su Java. Supponiamo di avere il seguente programma: class Base { int f (Base x) {return 1;} } class D1 extends Base { int f (D1 x) { return 2;} } class D2 extends D1{ } public class Prova { public static void main(String[] argv) { Base b = new D2(); D1 der1= new D1 (); D2 der2= new D2 (); System.out.println(b.f(der1)); } } Il risultato che si ottiene è 1, quindi vuol dire che è stata usata la f della classe base. Come mai viene usata quella e non quella di D1? Lo stesso risultato si ottiene sostituendo l'ultima riga con: System.out.println(der1.f(b)); Grazie Ultima modifica di giapal : 15-09-2005 alle 11:56. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
....ma non mettere nessun costruttore o mettere un costruttore vuoto è equivalente?
no, perchp sembrerebbe che ti istanzi b come classe Base nonostante gli dici new D2()... forse il problema è proprio nella mancanza dei costruttori... prova un pò ad aggiungerli e vedi ke succede....
__________________
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jul 2005
Città: Potenza
Messaggi: 126
|
"....ma non mettere nessun costruttore o mettere un costruttore vuoto è equivalente?"
Si nel casto di costruttore no-arg, ossia senza argomenti, infatti viene richiamato direttamente il costruttore della classe padre. Il "problema" sta nell'argomento, se chiami b.f(der1), l'argomento der1 è dello stesso tipo di Base percui viene sempre eseguito il metodo f della classe base; lo stesso vale per System.out.println(der1.f(b)); Per renderti l'idea sostituisci il parametro del metodo f in ogni classe con int ad esempio oppure scrivilo in modo che non accetti argomenti, vedi che viene richiamato il metodo della classe figlia D1.
__________________
Un'interfaccia per domarli, un package per trovarli tutti, un riferimento per ghermirli e nel framework incatenarli." Il Signore degli Oggetti
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2005
Città: Potenza
Messaggi: 126
|
Ti faccio un esempio
Codice:
class Base {
public Base(){
System.out.println("classe base");
}
public int f () {
return 1;
}
}
class D1 extends Base {
public D1(){
System.out.println("classe D1");
}
public int f () {
return 2;
}
}
class D2 extends D1{
public D2(){
System.out.println("classe D2");
}
}
public class Prova {
public static void main(String[] argv){
Base b = new D2();
System.out.println(b.f());
}
}
__________________
Un'interfaccia per domarli, un package per trovarli tutti, un riferimento per ghermirli e nel framework incatenarli." Il Signore degli Oggetti
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
appunto...quello che intendevo io + o - !
__________________
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Base b = new D2();
b è cichiarato cone un riferimento a un Base Quando invochi un metodo: b.f(der1) il compilatore vede se c'è un metodo f nella classe di b, cioè Base. C'è tale metodo? Sì. Che parametro prende? un Base. L'argomento der1 è castabile a Base? si allora la chiamata diventa: b.f( (Base) der1) Questo a tempo di compilazione. A tempo di esecuzione b punta effettivamente a un oggetto D2. D2 ha ereditato i due metodi f dalle superclassi, uno che prende un Base e uno che prende un D1. Poichè l'argomento che riceve è un Base viene eseguito il primo. Il "problema" per così dire è che si tiene in conto del tipo effettivo degli oggetti su cui si invoca il metodo, non del tipo effettivo degli argomenti. Se passi un argomento castato al tipo base sarà eseguito il metodo che prende il tipo base. Quel codice lo puoi interpretare in questo modo: Codice PHP:
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals Ultima modifica di anx721 : 15-09-2005 alle 14:03. |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: May 2002
Città: Prato
Messaggi: 101
|
Grazie mille per l'aiuto. Siete stati gentilissimi.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:23.



















