Piccolo chiarimento sulle variabili locali

di il
4 risposte

Piccolo chiarimento sulle variabili locali

Salve a tutti, complimenti per l'interessantissimo forum!

vorrei sottoporvi un semplice quesito che mi è venuto in mente mentre muovo i miei primi passi in java^^

dunque ecco 2 semplici metodi ed un piccolo main
import java.util.*;

public class Prova {

    static int i1 () {
    int z=0;
    i2(z);
    return z;
    }
    static void i2(int z) {
    ++z;
    }
    

    static List<Integer> l1 () {
        List<Integer> list = new ArrayList<Integer>();
        l2(list);
        return list;
    }
    static void l2(List<Integer> list) {
        list.add(1);
    }
    
    
    
    
    public static void main(String[] args) {
    
        System.out.println(i1());            //stampa 0 (variabile z non aggiornata)

        System.out.println(l1());            //stampa 1 (lista aggiornata)



    }
}
Vorrei sapere come mai nel primo metodo la variabile z nn viene aggiornata dal metodo ausiliario, mentre invece nel secondo metodo (l1) la lista viene aggiornata dal metodo ausiliario.
Grazie mille in aticipo per qualsiasi chiarimento!

4 Risposte

  • Re: Piccolo chiarimento sulle variabili locali

    Ciao, in java il passaggio dei parametri avviene per valore per cui si lavora sempre su una copia delle variabili che tu passi al metodo.Riferendomi al tuo codice, ciò che accade all'interno del metodo i1 può essere descritto cosi:

    -Abbiamo una zona di memoria che ospita il valore della variabile int z=0

    -Nel momento che tu passi questa variabile al metodo il suo valore viene copiato in
    un'altra zona di memoria dedicata alla variabile del metodo e si lavora su questa copia e non
    direttamente sulla variabile z

    -Per cui i2 con l'istruzione ++z incrementa il valore della copia ma la variabile originaria non
    subisce modifiche proprio perchè non stiamo lavorando direttamente su di essa ma bensi su una
    sua copia(nessun side effect, come si dice)

    Per rispondere alla seconda domanda,nel caso in cui il parametro fosse stato il riferimento ad un oggetto occorre fare attenzione al fatto che ciò di cui viene fatta la copia è il riferimento all'oggetto non la copia dell'oggetto stesso.Immagina che ogni variabile che non si riferisce a tipi primitivi quindi che fa riferimento ad una classe o interfaccia, contenga il riferimento ad una zona di memoria che contiene l'oggetto.
    Per cui sia la zona di memoria dell'oggetto che la zona di memoria per la copia riservata al parametro, contengono lo stesso riferimento, puntano allo stesso oggetto.Il risultato è quello che ogni modifica possibile sullo stato dell'oggetto passato che fai all'interno del metodo, effettivamente avviene, hai due riferimenti che puntanto allo stesso oggetto.Esempio:

    class Persona{

    private String nome="Pippo";

    public void setNome(String nome){
    this.nome=nome;
    }
    public String getNome(){
    return nome;
    }
    }


    public class Test{

    public static void main(String[] args){

    Persona p = new Persona();
    System.out.println(p.getNome());
    cambiaPersona(p);
    System.out.println(p.getNome());
    }

    public static void cambiaPersona(Persona param){
    param.setNome("Pluto");
    }


    }

    La variabile p e il parametro param puntano allo stesso oggetto ovvero contengono lo stesso riferimento di memoria nel quale si trova l'oggetto Persona istanziato con l'operatore new.La stessa cosa avviene nel metodo in cui usi la lista.Ciao e spero di essere stato comprensibile.
  • Re: Piccolo chiarimento sulle variabili locali

    Alessandro35 ha scritto:


    Ciao, in java il passaggio dei parametri avviene per valore per cui si lavora sempre su una copia delle variabili che tu passi al metodo.Riferendomi al tuo codice, ciò che accade all'interno del metodo i1 può essere descritto cosi:

    -Abbiamo una zona di memoria che ospita il valore della variabile int z=0

    -Nel momento che tu passi questa variabile al metodo il suo valore viene copiato in
    un'altra zona di memoria dedicata alla variabile del metodo e si lavora su questa copia e non
    direttamente sulla variabile z

    -Per cui i2 con l'istruzione ++z incrementa il valore della copia ma la variabile originaria non
    subisce modifiche proprio perchè non stiamo lavorando direttamente su di essa ma bensi su una
    sua copia(nessun side effect, come si dice)

    Per rispondere alla seconda domanda,nel caso in cui il parametro fosse stato il riferimento ad un oggetto occorre fare attenzione al fatto che ciò di cui viene fatta la copia è il riferimento all'oggetto non la copia dell'oggetto stesso.Immagina che ogni variabile che non si riferisce a tipi primitivi quindi che fa riferimento ad una classe o interfaccia, contenga il riferimento ad una zona di memoria che contiene l'oggetto.
    Per cui sia la zona di memoria dell'oggetto che la zona di memoria per la copia riservata al parametro, contengono lo stesso riferimento, puntano allo stesso oggetto.Il risultato è quello che ogni modifica possibile sullo stato dell'oggetto passato che fai all'interno del metodo, effettivamente avviene, hai due riferimenti che puntanto allo stesso oggetto.Esempio:

    class Persona{

    private String nome="Pippo";

    public void setNome(String nome){
    this.nome=nome;
    }
    public String getNome(){
    return nome;
    }
    }


    public class Test{

    public static void main(String[] args){

    Persona p = new Persona();
    System.out.println(p.getNome());
    cambiaPersona(p);
    System.out.println(p.getNome());
    }

    public static void cambiaPersona(Persona param){
    param.setNome("Pluto");
    }


    }

    La variabile p e il parametro param puntano allo stesso oggetto ovvero contengono lo stesso riferimento di memoria nel quale si trova l'oggetto Persona istanziato con l'operatore new.La stessa cosa avviene nel metodo in cui usi la lista.Ciao e spero di essere stato comprensibile.
    wow grazie infinite per la spiegazione sei stato molto chiaro !
    Ma quindi il sideeffect sui tipi primitivi nn è possibile farlo? funziona solo sugli oggetti?
  • Re: Piccolo chiarimento sulle variabili locali

    Contento di esserti stato di aiuto.Diciamo che in java non esiste il passaggio per riferimento, quindi con i tipi primitivi non hai la possibilità di fare side effect sui parametri, con i riferimenti ad oggetti ,proprio perchè parametro attuale e formale puntano allo stesso oggetto, riesci a modificarne lo stato.Ciao.
  • Re: Piccolo chiarimento sulle variabili locali

    Alessandro35 ha scritto:


    Contento di esserti stato di aiuto.Diciamo che in java non esiste il passaggio per riferimento, quindi con i tipi primitivi non hai la possibilità di fare side effect sui parametri, con i riferimenti ad oggetti ,proprio perchè parametro attuale e formale puntano allo stesso oggetto, riesci a modificarne lo stato.Ciao.
    ok ho capito. grazie mille per l'aiuto
Devi accedere o registrarti per scrivere nel forum
4 risposte