View Full Version : [Java] Help clone e lettura variabile privata
Classe
http://pastebin.com/fwNHcw64
Sottoclasse
http://pastebin.com/Bcm4Y7qr
Perchè nella sottoclasse mi è consentita l' operazione alla riga 68 nonostante clone.transactionCount sia privata?
Come dovrei finire il metodo clone della sottoclasse in modo corretto nel caso cosi non vada bene? Funzionerà se so una sottoclasse della sottoclasse?
Grazie mille :)
wingman87
03-01-2011, 15:04
Classe
http://pastebin.com/fwNHcw64
Sottoclasse
http://pastebin.com/Bcm4Y7qr
Perchè nella sottoclasse mi è consentita l' operazione alla riga 68 nonostante clone.transactionCount sia privata?
transactionCount è privata e quindi visibile solo nella classe in cui è dichiarata. Quindi il comportamento è corretto.
Come dovrei finire il metodo clone della sottoclasse in modo corretto nel caso cosi non vada bene?
Non ne sono sicuro, ma forse non è necessario ricopiare transactionCount esplicitamente come fai alla riga 68 perché dovrebbe occuparsene il metodo clone di Object di copiare tutti i campi.
Tra l'altro io farei ritornare un CheckingAccount invece di un Object (e un BankAccount nella superclasse).
Funzionerà se so una sottoclasse della sottoclasse?
Non ho capito cosa intendi.
transactionCount è privata e quindi visibile solo nella classe in cui è dichiarata. Quindi il comportamento è corretto.
Perché è corretto? transactionCount è una variabile privata di clone, perchè posso accedergli e fargli assegnare un valore senza metodi pubblici?
EDIT: Il primo punto l'ho capito, ho fatto tanti ma tanti esercizi e non avevo mai capito sta cosa :doh:
Tra l'altro io farei ritornare un CheckingAccount invece di un Object (e un BankAccount nella superclasse).
Sto sovrascrivendo il metodo clone di object quindi devo per forza ritornare un Object o non è cosi?
Non ho capito cosa intendi.
Se estendo CheckingAccount, posso clonare la nuova classe richiamando anche il metodo clone di CheckingAccount o, fatto cosi mi ritornerebbe un oggetto di tipo CheckingAccount e quindi non clonabile ad un livello inferiore?
wingman87
03-01-2011, 15:47
Perché è corretto? transactionCount è una variabile privata di clone, perchè posso accedergli e fargli assegnare un valore senza metodi pubblici?
EDIT: Il primo punto l'ho capito, ho fatto tanti ma tanti esercizi e non avevo mai capito sta cosa :doh:
Ti correggo solo la parte in grassetto: transactionCount è un attributo privato di CheckingAccount
Sto sovrascrivendo il metodo clone di object quindi devo per forza ritornare un Object o non è cosi?
Non è così se stai usando Java 5 o superiore. C'è un tutorial di PGI sull'argomento: LINK (http://www.hwupgrade.it/forum/showthread.php?t=1156502)
Sono solo 3 pagine, quindi ti rimando lì.
Se estendo CheckingAccount, posso clonare la nuova classe richiamando anche il metodo clone di CheckingAccount o, fatto cosi mi ritornerebbe un oggetto di tipo CheckingAccount e quindi non clonabile ad un livello inferiore?
Penso dipenda da come è implementato a monte il metodo clone, se è come dicevo nel mio precendente post dovrebbe occuparsene il metodo clone di Object che quindi ricopierà anche gli eventuali nuovi campi. Tieni conto però che finché gli attributi sono solo tipi primitivi non ci sono problemi, quando invece hai attributi che sono riferimenti a oggetti devi fare attenzione perché clone (quello definito in Object) copia solo i riferimenti, gli oggetti referenziati quindi restano in comune tra l'oggetto originale e il suo clone (a volte può andare bene così ma a volte no).
Penso dipenda da come è implementato a monte il metodo clone, se è come dicevo nel mio precendente post dovrebbe occuparsene il metodo clone di Object che quindi ricopierà anche gli eventuali nuovi campi.
Il metodo clone di Object l'ho già usato nella classe genitrice, ma non mi viene in mente come adoperarlo in modo corretto in quella figlia :S
Tieni conto però che finché gli attributi sono solo tipi primitivi non ci sono problemi, quando invece hai attributi che sono riferimenti a oggetti devi fare attenzione perché clone (quello definito in Object) copia solo i riferimenti, gli oggetti referenziati quindi restano in comune tra l'oggetto originale e il suo clone (a volte può andare bene così ma a volte no).
Certo, questo per fortuna lo sò :D
PS: Grazie mille per l' aiuto
wingman87
03-01-2011, 16:30
Il metodo clone di Object l'ho già usato nella classe genitrice, ma non mi viene in mente come adoperarlo in modo corretto in quella figlia :S
La gerarchia delle tue classi al momento è:
CheckingAccount -> BankAccount -> Object
In CheckingAccount.clone invochi super.clone() (quindi il metodo clone definito in BankAccount) mentre in BankAccount.clone invocando super.clone() invochi il metodo definito in Object. Quindi CheckingAccount indirettamente invoca Object.clone. Finché non spezzi questa catena di chiamate sei certo che Object.clone verrà sempre invocato.
PS: Grazie mille per l' aiuto
Prego
Tutto perfetto.
Grazie ancora :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.