|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
[Java] difficolta' nel polimorfismo
Ciao a tutti ! ho dei problemi con il polimorfismo. In pratica piu' o meno ho capito cos'e' e come funziona..solo che quando vado a fare degli esercizi sbaglio sempre l'output
![]() questo è il codice di un'esercizio che nn mi riesce : Codice:
class EsSuper{ String prima, seconda; public EsSuper(String p,String S){ prima=p; seconda=s; } public String toString() { return prima + " "; } } public class Esempio extends EsSuper{ public Esempio(String P,String S) { super (p,s); } public String toString() { return prima + ":" + seconda + " "; } public static void main (String args[]) { EsSuper a = new EsSuper ("A", "a"); EsSuper b = new Esempio ("B", "b"); System.out.print(a.toString()); System.out.print(b.toString()); } } ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Intanto attento alle maiuscole/minuscole, per il resto è semplicissimo,
per a viene chiamato il metodo di EsSuper, per b quello di Esempio
__________________
|Java Base| |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
si ma scusa..senti come ragiono io .. allora
a è riferimento all'oggetto creato EsSuper. Inizializza primo e secondo ai valori di default. Dopo c'e' la chiamata al costruttore che a primo mette il valore p cioe' A e a secondo mette il valore s cioe' a. b è riferimento all'oggetto creato Esempio. Cosa succede: viene chiamato il costruttore di Esempio e dp il costruttore c'e' un super. Il super richiama il costruttore della classe EsSuper e in quest'utlima a prima mette B e a seconda b. Infine c'e' il system.out.print che stampa a.toString che quindi a primo è B. E poi c'e' la chiamata a b.toString che è B b. Invece l'output è A B b .. dove sbaglio ![]()
__________________
![]() Ultima modifica di Tony Hak : 02-06-2008 alle 12:51. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
nessuno ? help !
__________________
![]() |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Chiariamo alcuni punti. -Parli di inizializzazione di default ma nel caso del tuo codice non si ha mai una inizializzazione di default(in caso di oggetti e quindi Stringhe a null) poichè lo fai sempre esplicitamente. -La confusione maggiore che hai è sull' utilizzo di super: super setta le 2 stringhe (nel tuo caso essendo a visibilità di package potresti settarle anche a mano,mantenendo un costruttore di default) del tuo oggetto b ma non ha alcuna influenza su a.Questo dovrebbe chiarirti anche la differenza tra classe e istanza di una classe. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jun 2001
Messaggi: 458
|
Io continuo sempre a consigliare questo: http://www.hwupgrade.it/forum/showpo...&postcount=421
letto dall'inizio, aiuta tantissimo.
__________________
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Si' mi sa che e' un problema di comprensione del concetto piu' basilare di classe piuttosto che di polimorfismo.
O almeno, da quanto ti aspetti e da come l'hai spiegato, mi sembra che il problema primo sia li'.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
in pratica dove ho sbagliato : pensavo che scrivendo super (5,6) ad esempio si passano anche i nuovi valori al costruttore nella superclasse.. per esempio se il costruttore della superclasse è construct( int x,y) se lo chiamo dalla classe base con super (5,6) , construct diventava construct (5,6) .. invece non è cosi'... una cosa che invece non ho capito è il fatto che nella classe Esempio nel metodo ToString non dovrebbero esserci
Codice:
public String toString() { return p+ ":" + s + " "; } Codice:
public String toString() { return prima + ":" + seconda + " "; }
__________________
![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
L'oggetto a e l'oggetto b sono 2 oggetti diversi, ciascuno dei quali ha la propria copia delle stringhe prima e seconda, indipendenti.
C'e' modo di condividere alcune informazioni tra le diverse istanze delle classi, ma prima di tutto occorre capire questo comportamento, che e' il concetto fondamentale di incapsulamento. Codice:
public static void main (String args[]) { EsSuper a = new EsSuper ("A", "a"); EsSuper b = new EsSuper ("B", "b"); System.out.print(a.toString()); System.out.print(b.toString()); }
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
Quote:
![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
1)Classe Base e SuperClasse sono 2 modi per indicare la stessa cosa... 2)Invocando super invochi si il costruttore della classe Base ma solo per l' istanza interessata. Un esempio pratico: se una ditta licenzia l' impiegato Mario Rossi non licenzia tutti gli altri impiegati dello stesso reparto(secondo il tuo ragionamento invece dovrebbe essere cosi).Ancora, come dicevo, ti è oscura la differenza tra Classe e istanza. 3)Dall' ultima domanda si evince che ti mancano 2 concetti base per la POO: la visibilità delle variabili e l' incapsulamento. P ed S hanno il loro scope solo all' interno del costruttore ed è li e solo li che puoi utilizzarle. Per come hai implementato la tua classe base è consentito ' accesso a "prima" e " seconda" in quanto entrambe sono prive di descrittore d' accesso e utilizzano quello di default che è settato da java su package ovvero accesso consentito alle sole classi contenuto nello stesso package che se nn diversamente indicato è quello in cartella corrente. Di norma però le variabili si etichettano come private e si accedono attraverso i metodi accessori e settatori. |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
La classe e' una, sempre la stessa. gli oggetti, meglio chiamarli "Istanze della classe EsSuper", sono 2
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
ok ok ..forse ho capito .. ho disegnato il meccanismo su carta.. un attimo che lo trasferisco in open office writer e ve lo allego
![]() ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 1661
|
![]() ![]() 1) creazione nuovo oggetto EsSuper con maniglia a; 2) inizializzazione delle stringhe Prima e Seconda a NULL nel nuovo oggetto creato; 3) Chiamata al costruttore di EsSuper che imposta a prima = "A" e seconda = "a" 4) Creazione nuovo oggetto Esempio com maniglia b; 5) si eriditano prima ( = "A") e seconda (= "a") e il metodo tostring che puo' essere sovraccaricato per l'overloading. 6) Chiamata al costruttore di Esempio che provvede a chiamare la superclasse (Essuper) tramite il super e prima e seconda nella classe Esempio diventano rispettivamente "B" e "b" 7) chiamate ai metodi toString per la stampa di "A" ( in EsSuper), "B:b" in Esempio scusate se mi so espresso come un libro stracciato ma piu' o meno penso di aver capito ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Non confondere poi l' overloading di un metodo che indica il fatto che 2 metodi possano riportare lo stesso nome ma con parametri di input differenti per tipo e/o numero(la cosa non vale per il solo tipo di ritorno) esempio: OK: public String toString() public String toString(String s) NO ![]() public int toString() esiste poi il concetto di covarianza sul tipo restituito ma che consente ad una classe derivata di sostituire il tipo restituito da classe Base a classe Derivata public Base metodo() public Derivata metodo() con l' override di un metodo che consente appunto di cambiarne il corpo(la semantica) di un metodo ereditato lasciando inalterata la firma(o al piu utilizzando la covarianza che accennavo prima). |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:44.