Newsgroup: it.comp.java
Titolo: Problema Oggetti e riferimenti

Sono alle prese con gli oggetti e i riferimenti di java e la testa mi sta
esplodendo...
Vi spiego dove non capisco.
Ho il libro JAVA "fondamenti di progettazioni software" e c'č un esempio che
non capisco.
Ve lo riporto, poi ne discuto...
Esempio sul libro di testo:
PedinaScacchi Alfieri1 = new PedinaScacchi();
PedinaScacchi Alfieri2 = new PedinaScacchi();
Alfieri2=Alfieri1
Il libro dice che eseguendo la terza istruzione viene copiato il valore del
riferimento di Alfieri1 in Alfieri2,quindi dopo questa istruzione entrambi
puntano allo stesso oggetto.
Quindi ogni cambiamento effettuato al primo oggetto viene riscontrato in
entrambi i riferimenti xchč entrambi puntano allo stesso oggetto.
Fino qui ci sono...
Ora vi riporto un esempio fatto da me che dovrebbe risultare lo stesso...
String a=new String("ciao");
String b=new String();
b=a;
a=a.toUpperCase();
System.out.print(a);
System.out.print(b);
-----------------------
Ecco, in questo modo copio il riferimento di a in b, quindi a e b dovrebbero
puntare allo stesso oggetto.Perņ quando vado a modificare a, b mi rimane
uguale a prima...
PERCHE????????????
Chiedo gentilmente aiuto!!
Saluti
Andrea

 
Se guardi la documentazione ti accorgi che tutti i metodi della classe 
String restituiscono un nuovo puntatore ad un differente oggetto.
Infatti tu fai a=a.toUpperCase()! Quindi a punterà adesso ad una nuova 
area di memoria diversa da quella di b!
Le stringhe all'inizio ti fanno un po' impazzire per questa peculiarità 
ma poi ti ci abitui! ;)
ciao
-- 
mauro

Purtroppo hai fatto un esempio con la classe String che è trattata in
maniera molto speciale da Java.
Questo è dovuto all'evidente massiccio utilizzo che se ne fa nei programmi.
Se ci fai caso java permette di usare operatori come "+", "+=" su oggetti
String.
Il metodo che tu hai usato toUpperCase() restituisce un riferimento ad un
nuovo oggetto String quindi l'esempio è invalidato.

Approfitto della vostra gentilezza per farvi un'altra domanda..
Non ho ben capito la differenza nel creare un'oggetto String.
Allora:
Se scrivo:
String ciao; Mi crea un riferimento vuoto, che quindi viene usato come
variabile giusto?
String ciao="ciao ciao"; Mi crea un riferimento ad un oggetto;
String ciao=new String("ciao ciao"); Uguale a sopra.
Correggettemi se ho sbagliato...
Grazie ancora.
Saluti
Andrea

 String ciao=new String("ciao ciao"); Uguale a sopra.
esatto, anzi il contrario, è sopra che viene intesa così da java 
le stringhe sono trattate da java in modo particolare
ovvero sono Oggetti ma trattati come variabili native (come int, byte
ecc..) che non sono oggetti
La String è un oggetto perchè così per fortuna dispone di molti metodi
di utilità (tra cui .equals(String xx) che devi ricordarti di usare
nelle if)
ma quando la tratti (esempio la sposti) java per fortuna lo fa come se
fosse una variabile nativa (tranne che nella if in cui devi usare
.equals(xx))
questo vuol dire che se passi una Stringa o un int ad un metodo, non
passi il riferimento di un oggetto ma il suo valore nativo (int non è
un oggetto e l'oggetto String fa eccezione)
il che vuol dire che se all'interno del metodo che riceve la String
alteri la stringa, la variabile String del chiamante non ne subisce le
conseguenze
mentre se passi ad un metodo il riferimento ad una istanza di un tipo
JFrame, passi il suo riferimento (come per tutti gli oggetti, e se
alteri all'interno del metodo il JFrame lo fai ovviamente sull'oggetto
che è lo stesso sia per il chiamante che per il chiamato).
questa è una cosa positiva perchè puoi spostare il valore della
stringa all'interno di un'altra stringa, ovvero senza accorgetene
creare tanti oggetti cloni della stringa iniziale
mentre per creare un clone di un vero oggetto devi usare clonable,
oppure creare un nuovo oggetto istanziandolo con il vaore dell'altro
capisco che sei fresco di java, e visto che qualche mese fa ci sono
passato anche io a fare queste domande ora mi tocca per solidarietà
rispondere (gli altri immagino si siano un po rotti di parlare dei
fondamentali)
ti allego un esempio, giralo e regionaci 
ciao
import javax.swing.*;
public class prova {
 
    /** Creates a new instance of prova */
    public prova (String s,JTextField i) {
    	System.out.println("valori ricevuti="+s+" "+i.getText());
    	s="due";
    	i.setText("cambiato");
    	System.out.println("valori ricevuti alterati="+s+"
"+i.getText());
    }
 
    public static void main (String[] arg) {
    	String aaa="uno";
    	JTextField iii=new JTextField("campo");
 
    	new prova(aaa,iii);
    	System.out.println("valori passati="+aaa+" "+iii.getText());
 
        }
valori ricevuti=uno campo
valori ricevuti alterati=due cambiato
valori passati=uno cambiato