Domanda Java metodi

Stato
Discussione chiusa ad ulteriori risposte.

utensilenato1

Utente Bronze
14 Maggio 2014
13
9
1
45
Salve raga ! Ho una piccola domanda da farvi .... volevo sapere perchè quando creo un metodo del tipo :
public static void prova (Razionale x){
x.num=3;
}
Dove l'oggetto Razionale contiene al suo interno come elementi (numeratore e denominatore ossia num e den),
se lo modifico all'interno del metodo questo viene modificato anche all'esterno del metodo ... mentre se creo un metodo del tipo
public static void prova1(x.num){
x.num=3;
}
L'elemento dell'oggetto viene modificato solo all'interno del metodo , mentre fuori non cambia nulla ...
 
In Java le variabili sono copiate, quando chiami i metodi, tramite valore. Questo vuol dire che viene fatta una copia dei dati originali su cui poi tu andrai ad agire con i parametri del metodo.

Nel caso di
Java:
public static void prova(Razionale x) {
        x.num = 3;
}
Fai una copia dell'oggetto Razionale che passi. Però (ora accenno alla terminologia del C forse) x è un riferimento alla stessa locazione di memoria dell'oggetto che passi. Modificando i campi dell'oggetto vai effettivamente a modificare quelli originali.

Però non è (se non per buone ragioni, e queste non le sono) consigliato modificare esplicitamente dei campi pubblici. Si usa renderli privati e utilizzare le coppie di metodi set/get.

Nel secondo caso, in cui penso intendessi dire
Java:
public static void prova1(int num)
       num = 3;
}
Il parametro num è una copia, in un'altra locazione di memoria, del valore originale. Modificare questa copia avrà effetto solamente all'interno del metodo. Alla fine di quest'ultimo la memoria verrà liberata. Non andrai mai ad influire, in questo modo, sui dati originali.
 
Ultima modifica:
E' sempre consigliato utilizzare i metodi Setter per modificare attributi di oggetti, nel tua caso ad esempio:

Java:
public void setNumero(Integer numero){
    this._numero = numero;
}

Generalmente in java ogni oggetto deve:
- Avere attributi privati (molti, come me, mettono un _ davanti al loro nome)
- Avere metodi pubblici per modificarli (i Setter) e ottenerli (i Getter)

Nel tuo caso passi una copia del valore Num di X, la modifichi, ma non la passi mai nuovamente a Num. Anche se è sconsigliato farlo, nel tuo caso funzionerebbe solo se la funzione ritorna un oggetto modificato da poter sovrascrivere quello vecchio. Un po' inutile sapendo che un Setter farebbe lo stesso lavoro in 1 riga ;)
 
Stato
Discussione chiusa ad ulteriori risposte.