Originariamente inviato da Jamie04
Grazie, ora è più chiaro, anche se faccio fatica a memorizzare queste cose

Avrei bisogno di un chiarimento su questo passaggio:

To access a field, you can use a named reference to an object, as in the previous examples, or you can use any expression that returns an object reference. Recall that the new operator returns a reference to an object. So you could use the value returned from new to access a new object's fields:

int height = new Rectangle().height;


Non capisco cosa significa che l'operatore new ritorna la referenza a un oggetto. Esempio in questa istruzione:

Rectangle rect1=new Rectangle(10,15);

la referenza all'oggetto rectangle è "rect1", o no?
mentre qui:
int height = new Rectangle().height;

la referenza non è "height"?

E ancora:

This (int height = new Rectangle().height statement creates a new Rectangle object and immediately gets its height. In essence, the statement calculates the default height of a Rectangle. Note that after this statement has been executed, the program no longer has a reference to the created Rectangle, because the program never stored the reference anywhere. The object is unreferenced, and its resources are free to be recycled by the Java Virtual Machine.

Anche qui non capisco...
Se l'oggetto creato con questa istruzione:
int height = new Rectangle().height;
viene "perso" dopo l'esecuzione dell'istruzione, a cosa potrebbe mai servire fare una cosa del genere?
Perdo l'oggetto rettangolo ma mi rimane una variabile intera height?
Forse se mi fate qualche esempio in cui queste istruzioni tornano utili mi rimane più comprensibile...

Grazie a tutti!
Non c'è granché da memorizzare, il passaggio è sempre per valore, basta sapere che esistono i tipi primitivi e i reference.

I reference sono i riferimenti agli oggetti. Nel secondo esempio la referenza (anonima) è il valore restituito da new Rectangle(). Come potrebbe height essere un riferimento ad un oggetto Rectangle? L'height a sinistra dell'uguale lo stai dichiarando tu stesso come int, e quello a destra è un campo della classe Rectangle, probabilmente di tipo int.

Le referenze con un nome sono le variabili che rappresentano oggetti (quindi di tipo String, Rectangle ecc...), mentre quelle anonime sono le creazioni "al volo" di tali oggetti, che non essendo salvati da nessuna parte possono sparire subito dopo.

E sì, con l'ultimo esempio perdi immediatamente il riferimento all'oggetto Rectangle appena creato. Con una classe del genere è difficile vederne l'utilità, ma considera la classe Random col metodo nextInt(): se ti serve solo un intero casuale, perché fare questo:

codice:
Random random = new Random();
int randomValue = random.nextInt();
anziché questo?

codice:
int randomValue = new Random().nextInt();
Col secondo metodo guadagni in semplicità e in efficienza. La variabile int invece rimane perfettamente valida, perché l'oggetto viene distrutto dopo che il metodo restituisce il valore, che può quindi essere assegnato senza nessun problema.

Purtroppo è diffuso il brutto vizio di non fornire esempi sensati...