Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-02-2005, 19:48   #1
w.tommasi
Senior Member
 
L'Avatar di w.tommasi
 
Iscritto dal: Sep 2000
Città: CaPuT MuNdI
Messaggi: 2112
[JAVA] - Classi e cast alle prime armi.

Innanzituto vi kiedo di postare o inviarmi in pvt link a forum italiani in cui poter kiedere aiuto nello specifico riguardo a java.

Venendo al discorso classi. L'esempio del libro ke sto seguendo riporta una classe Employee e una sottoclasse derivata Manager.

Vi posto il main (ovviamente setBonus è un metodo della classe manager):

public static void main(String[] args)
{
(ESEMPIO 1)
Manager x = new Manager("W", 9, 1975, 11, 26);
x.setBonus(1);
Employee w = x;
System.out.println(w.getSalary());

(ESEMPIO 2)
Employee y = new Employee("FRANCA", 9, 1975, 11, 26);
Manager z = (Manager)y; <<<<==== ERRORE !!!
z.setBonus(11);
System.out.println(z.getName());
}

Adesso mi kiedo, in primis ma il cast è solo possibile risalendo la catena dell'ereditarietà ? Cioè si può solo castare verso superclassi ?
Ma sopratutto xkè il libro dice che si può assegnare un oggetto della sottoclasse ad una variabile della superclasse (ESEMPIO 1) mentre x assegnare un oggetto della superclasse ad una variabile della sottoclasse bisogna utilizzare il cast (ESEMPIO 2) e questo a me va in errore ????

HELP ME PLZ !!!!

__________________
E che il Signore ce la mandi buona ... e di facili costumi !
w.tommasi è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2005, 13:12   #2
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quando hai a che fare con una variabile oggetto da una parte hai il tipo con cui è stata dichiarata la variabile, e dall'altra hai il tipo effettivo dell'oggetto a cui la variabile punta.

Esempio1:

A a = new A();

a è dichairata come di tipo A e punta a un oggetto di tipo A.

Esempio2:

A a = new B();

a è dichiarato di tipo A ma punta ad un oggetto di tipo B.

Quando puoi fare una cosa del genere senza preoccuparti di nulla? Lo puoi fare quando B è una sottoclasse di A; questo perche se tu dichiari una variabile

A a;

stai dicendo al compilatore che 'a' è in grado di rispettare l'interfaccia della classe A, ovvero su 'a' puoi invocare tutti i metodi descritti nella classe A, e puoi accedere a tutti i campi della classe A. Ma se B è sottoclasse di A, allora B eredita tutti i campi e tutti i metodi di A, quindi un oggetto di tipo B è in grado di comportarsi come un oggetto di tipo A. Proprio per questo puoi far puntare 'a' ad un oggetto di tipo B:

a = new B();

senza che il compilatorre si lamenti.

Viceversa, se C è una superclasse di A, allora C non è detto che abbia tutti i metodi e tutti i campi di A, anzi , in genere le sottoclassi estendo il comportamento delle suoperclassi, per questo non puoi istanziare 'a' con un oggetto di tipo C.


Quindi la regola è che ad una variabile di tipo A puoi assegnare un oggetto di tipo B se B è sottoclasse di A.

In ogni altro caso è necessario eseguire un cast affinche il compilatore non si lamenti, ma sta a te garantire che stai esegunedo un assegnamento corretto.

Esempio:

hai la classe A, e B estende A.

A a = new B();

'a' è dichiarato come una variabile di tipo A, ma in realtà punta a un oggetto B.

B b = a;

qui il compilatore si lamenta, perche stai asegnando a 'b' un oggetto 'a' che è stato dichiarato di tipo A, che è una superclasse di B, e quindi non puo avere la garanzia che 'a' possa comportarsi come un oggetto di tipo B. Questo perche i controlli che fa il compilatore si basano slo sulle dichiarazioni fatte, cosi 'a' è stato dichiarato come un oggetto A, anche se poi è stato instanziato come oggetto B. Ma te sai che 'a' in realtà punta ad un oggetto B, e quindi puoi forzare l'assegnamento dicendo al compilatore:

"sono sicuro che 'a' è stato instanziato com un oggetto di classe B o di una sottoclasse di B, quindi consideralo come tale e accetta l'assegnamento"

e cio lo fai effettuando il cast:

B b = (B)a;

cosi la compilazione va a buon fine. Nota che se fai il cast, la copilazione va a buon fine anche se 'a' non è effettivamente istanziato con B:

A a = new A();
B b = (B)a;

anche qui il compilatore non dice nulla, perche quando c'è un cast affida a te la responsabilita che tutto sia a posto. In questo secondo caso pero durante l'esecuzione del programma, quando si effettua il controllo effettivo sulla compatibilita tra il tipo della variabile e il tipo dell'oggetto assegnato, sarà lanciata una CastException perche un oggetto di tipo A non puo essere visto come oggetto di tipo B.

In definitiva, quello che devi capire, è che un cast non trasforma un oggetto di una clase in un oggeto di un altra classe, semplicemente serve a vedere un oggetto di una classe come un oggeto di un'altra clase, in modo che il compialtore non si lamenti, ma devi essere te a garantire che 'la tua vsione è giusta', cioè se casti una variabile da A a B, devi essere sicuro che quella variabile effettivametne punta ad un oggeto di tipo B o di una sottoclase di B.

Un forum specifico su java è quello del sito http://www.mokabyte.it/
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals

Ultima modifica di anx721 : 08-02-2005 alle 13:16.
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2005, 15:33   #3
w.tommasi
Senior Member
 
L'Avatar di w.tommasi
 
Iscritto dal: Sep 2000
Città: CaPuT MuNdI
Messaggi: 2112
Sei stato grandissimo e gentilissimo !!! Tutto molto kiaro !!!

E' ovvio ke il cast tra oggettti ha senso solo se tali oggetti si trovano nella stessa alberatura di ereditarietà giusto ???

Inoltre (anke se è da pazzi e credo non accadrà mai): la classe madre di tutti è Object ok ?

Quindi posso fare
Object pippo = new Employee(...);

poi:
Employee e = (Employee)pippo;

ma è lecito questo ?
Manager xxx = (Manager)e;

Poi un'altra cosa sui tuoi esempi.
Tu affermi che qui :
A a = new A();
B b = (B)a;
il compilatore lancerà un'eccezione .... anke qui o non ho capito un cazz@ ???
A a = new B();
B b = (B)a;
__________________
E che il Signore ce la mandi buona ... e di facili costumi !
w.tommasi è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2005, 15:38   #4
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
Originariamente inviato da w.tommasi
E' ovvio ke il cast tra oggettti ha senso solo se tali oggetti si trovano nella stessa alberatura di ereditarietà giusto ???
Giusto

Quote:
Inoltre (anke se è da pazzi e credo non accadrà mai): la classe madre di tutti è Object ok ?

Quindi posso fare
Object pippo = new Employee(...);

poi:
Employee e = (Employee)pippo;

ma è lecito questo ?
Manager xxx = (Manager)e;
Il compilatore lo accetta perke fai il cast esplicitamente, ma non va bene perche li tipo reale di 'e' è Employee, che non è Manager o una sottoclasse di Manager

Quote:
Poi un'altra cosa sui tuoi esempi.
Tu affermi che qui :
A a = new A();
B b = (B)a;
il compilatore lancerà un'eccezione .... anke qui o non ho capito un cazz@ ???
A a = new B();
B b = (B)a;

Se fai i cast esplicitamente il compilatore accetta tutto, ma se tali cast non sono giusti a runtime il programma lancerà un'ecezione, ovvero termina (se non hai ancora studiato le eccezioni)
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2005, 15:47   #5
w.tommasi
Senior Member
 
L'Avatar di w.tommasi
 
Iscritto dal: Sep 2000
Città: CaPuT MuNdI
Messaggi: 2112
Le eccezioni so concettualmente cosa sono ma in entrambi i casi il cast è esplicito e mi interessava sapere xkè affermi ke qui:
A a = new A();
B b = (B)a;
il compilatore lancerà un'eccezione;

ma volevo sapere se anke qui lo farà:
A a = new B();
B b = (B)a;

penso di no giusto? Anche se non capisco se a questo punto 'a' è di tipo A o di tipo B ... Marò !!!!!!!!!!
__________________
E che il Signore ce la mandi buona ... e di facili costumi !

Ultima modifica di w.tommasi : 08-02-2005 alle 15:55.
w.tommasi è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2005, 16:16   #6
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Nel primo caso c'è l'eccezione, mel secondo no; l'eccezionè non è il compilatore a lanciarla, ma è lanciata durante l'esecuzione del programma nel momento in cui si esegueil cast.

Se scrivi

A a = new B();
B b = (B)a;

'a' è una variabile dichiarata di tipo A che punta ad un oggetto di tipo B
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 09-02-2005, 09:51   #7
w.tommasi
Senior Member
 
L'Avatar di w.tommasi
 
Iscritto dal: Sep 2000
Città: CaPuT MuNdI
Messaggi: 2112
OK ! Nel secondo caso potrei usare i nuovi metodi definiti nella classe B, mentre nel primo no giusto ?

Però se A a = new B(); nel mio caso vorrebbe dire Employee e = new Manager(); vorrei capire come deifiniresti le varibili 'a' / 'e'; cioè sono dichiarate di un tipo ma ne puntano un altro ?

CMQ GRASSSIE DI TUTTO !
__________________
E che il Signore ce la mandi buona ... e di facili costumi !
w.tommasi è offline   Rispondi citando il messaggio o parte di esso
Old 09-02-2005, 10:34   #8
end.is.forever
Senior Member
 
Iscritto dal: Jul 2004
Messaggi: 1578
Devi sempre prevedere la possibilità che l'oggetto non sia di tipo Manager ma soltanto Employee
per cui se proprio ti serve fare questo fai:
Codice:
if (e instanceof Manager)
{
      Manager m = (Manager) e;
      ...
}
end.is.forever è offline   Rispondi citando il messaggio o parte di esso
Old 09-02-2005, 11:42   #9
w.tommasi
Senior Member
 
L'Avatar di w.tommasi
 
Iscritto dal: Sep 2000
Città: CaPuT MuNdI
Messaggi: 2112
Si si ... quello lo so.

Volevo solo sapere con Employee e = new Manager(); che diavolo di variabile sto trattando .... o x meglio dire è una var di tipo Employee che sta puntando ad un istanza della classe Manager ma conta poco poichè i nuovi metodi ridefiniti in Manager con 'e' non li posso usare ...

Cmq posso dirvi che sto maledetto cast (che + persone mi hanno detto deve essere usato il meno possible) l'ho capito meglio nell'unico caso in cui è indispensabile usarlo : ovvero negli ArrayList() ...
__________________
E che il Signore ce la mandi buona ... e di facili costumi !
w.tommasi è offline   Rispondi citando il messaggio o parte di esso
Old 09-02-2005, 12:02   #10
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
Originariamente inviato da w.tommasi
Si si ... quello lo so.

Volevo solo sapere con Employee e = new Manager(); che diavolo di variabile sto trattando .... o x meglio dire è una var di tipo Employee che sta puntando ad un istanza della classe Manager ma conta poco poichè i nuovi metodi ridefiniti in Manager con 'e' non li posso usare ...
per usarli appunto fai il casting...in genere il casting non è necessario se ad esempio la classe manager non aggiunge metodi a quelli della superclasse, se cio accade e te vuoi eseguirli, devi prima fare il cast
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 09-02-2005, 12:27   #11
w.tommasi
Senior Member
 
L'Avatar di w.tommasi
 
Iscritto dal: Sep 2000
Città: CaPuT MuNdI
Messaggi: 2112
Beh però da quello che ho capito una sottoclasse può aggiungere e/o ridefinire i metodi di una superclasse quindi se li vuoi usare devi x forza castare una var che punta ad un oggetto della superclasse ad una var che punta ad un oggetto della sottoclasse.

Xò non hai ancora risposto al mio quesito con l'istruzione ke + mi affligge :

Employee e = new Manager(); che diavolo di variabile sto trattando ??? Posso SOLO usare metodi della classe Employee anche se punto ad un oggetto Manager ???
__________________
E che il Signore ce la mandi buona ... e di facili costumi !
w.tommasi è offline   Rispondi citando il messaggio o parte di esso
Old 09-02-2005, 14:07   #12
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Come ti ho detto ilcompilatore fa sempre riferimento al tipo con cui la variabile è stata dichiarata. Quindi 'e' lo puoi usare solo come Employee, e su 'e' puoi invocare solo i metodi di Employee. Siccome tu sai però che 'e' non solo è un Employee, ma è anche un Manager, se vuoi usare i metodi di Manager devi castare a Manager per dire al compilatore: anche se 'e' è stato dichiarato come Employee sono sicuro che è stato istanziato come Manager, quindi voglio invocare su 'e' i metodi di Manager, e il compilatore te lo lascia fare.
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 09-02-2005, 14:45   #13
w.tommasi
Senior Member
 
L'Avatar di w.tommasi
 
Iscritto dal: Sep 2000
Città: CaPuT MuNdI
Messaggi: 2112
Ancora grazie di tutto !!!




Scusa se sono stato rompino ma se non capisco ci sto male !!!

Con l'ultimo post dovrei aver fatto chiarezza sul concetto ...

__________________
E che il Signore ce la mandi buona ... e di facili costumi !
w.tommasi è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Anthropic ha un'AI che trova falle in Wi...
I 10 migliori sconti Amazon del weekend:...
Con un coupon scendono ancora: le super ...
Minimo storico per Samsung Galaxy S26 Ul...
Si è conclusa la missione lunare ...
EK Waterblock si arrende agli aumenti, i...
Geekbench si aggiorna: tutti i test con ...
Per la prima volta un computer quantisti...
Telecamere Reolink 4K su Amazon: Wi-Fi 6...
Anthropic vuole farsi i chip da sola? Co...
Il fondatore di Framework: il personal c...
JBL Live Flex 3 a 129€ su Amazon: ANC ad...
Come un uomo ha costruito un'azienda da ...
Multe fino a 400 euro anche se hai pagat...
Tapo lancia una valanga di offerte su Am...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:09.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v