Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2016
    residenza
    Italia, Scomigo (TV)
    Messaggi
    11

    [JAVA] Passaggio di parametri per valore.

    Buongiorno a tutti.

    Gentilmente vi chiedo se potreste aiutarmi con un argomento che non riesco a capire.
    Si tratta del PASSAGGIO DI PARAMETRI PER VALORE in Java.

    Il libro, tramite il quale studio ,dice:

    Quando si invoca un metodo che ha come parametro in input una variabile, al metodo stesso viene passato solo il valore (una copia) della variabile, che quindi rimane immutata anche dopo l'esecuzione del metodo.

    Esempio:

    Considerando la seguente classe:

    public class CiProvo {
    public void cambiaValore(int valore) {
    valore = 1000;
    }
    }

    il seguente frammento di codice:

    CiProvo ogg = new CiProvo();
    int numero = 10;
    ogg.cambiaValore(numero);
    System.out.println("il valore del numero � " + numero);

    produrr� il seguente output:

    il valore del numero � 10.

    Perch�? Non riesco a capire ci�.

    Inoltre, viene detto:

    "Il parametro valore del metodo cambiaValore(), nel momento in cui � stato eseguito il metodo, non coincideva con la variabile numero, bens� immagazzinava solo la copia del suo valore (10).
    Quindi la variabile numero non � stata modificata."

    Non capisco cosa vuoldire " immagazzinava solo la copia del suo valore".

    Grazie in anticipo a chi mi aiuter� e Buona giornata.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Fedro93 Visualizza il messaggio
    Gentilmente vi chiedo se potreste aiutarmi con un argomento che non riesco a capire.
    Si tratta del PASSAGGIO DI PARAMETRI PER VALORE in Java.

    Non capisco cosa vuoldire " immagazzinava solo la copia del suo valore".
    In Java il passaggio degli argomenti a costruttori/metodi è sempre per valore, sia per tipi primitivi che reference. Se è un reference, viene passata una copia del valore del reference (non una copia dell'oggetto!).

    codice:
    public static void chiamante() {
        int pippo = 10;
        chiamato(pippo);
    }
    
    public static void chiamato(int pluto) {
        pluto = 20;
    }
    pippo e pluto sono due variabili ben distinte, pippo è una variabile "locale" nel metodo chiamante mentre pluto è un parametro di chiamato ma sostanzialmente è anch'essa una variabile "locale" in chiamato.
    Quando chiamato inizia la esecuzione, pluto ha il valore 10, che è appunto una copia del valore che ha il chiamante.
    Assegnare qualcosa a pluto NON può cambiare quello che ha il chiamante (ovvero ciò che contiene pippo).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2016
    residenza
    Italia, Scomigo (TV)
    Messaggi
    11
    Buongiorno andbin,

    purtroppo non ho capito.
    Inoltre, la frase "PASSAGGIO DI PARAMETRI PER VALORE" cosa vuoldire?
    Vuoldire che vengono passati parametri/argomenti al metodo tramite valore? ma in che senso tramite valore?

    Grazie ancora.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2016
    residenza
    Italia, Scomigo (TV)
    Messaggi
    11
    Quote Originariamente inviata da andbin Visualizza il messaggio

    chiamato(pippo);
    In questo statement, se lo è, non manca il punto tra chiamato e (pippo)?

    Grazie.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Fedro93 Visualizza il messaggio
    purtroppo non ho capito.
    Inoltre, la frase "PASSAGGIO DI PARAMETRI PER VALORE" cosa vuoldire?
    Vuoldire che vengono passati parametri/argomenti al metodo tramite valore? ma in che senso tramite valore?
    int è composto da 32 bit, quindi pippo occuperà 32 bit da qualche parte sullo stack (è una variabile locale) e quando chiamato viene invocato, verrà creato lo spazio di 32 bit di nuovo da qualche parte sullo stack per pluto (che è un parametro ma comunque sempre una variabile locale).

    Nel momento della invocazione, la virtual machine semplicemente copia il valore dei 32 bit di pippo nello spazio di memoria predisposto per pluto. Quindi in effetti entrambe le variabili hanno inizialmente lo stesso valore es. 1000. Ma sono due variabili distinte, quindi se cambi successivamente il valore di pluto, NON cambi il valore di pippo.

    È come fare:

    int a = 1000;
    int b = a;

    A questo punto b ed a hanno lo stesso valore. Ma se fai b = 2000; cambi solo b, NON a.

    Quote Originariamente inviata da Fedro93 Visualizza il messaggio
    In questo statement, se lo è, non manca il punto tra chiamato e[I] (pippo)?
    No, non manca niente, lo statement è corretto. Il codice è incompleto, bisogna chiaramente metterlo dentro una classe perché sia usabile (e poi ovviamente invocare chiamante). L'esempio mostra solo un metodo (chiamante) che invoca un altro metodo (chiamato), che dovrebbe servire giusto per capire il passaggio degli argomenti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2016
    residenza
    Italia, Scomigo (TV)
    Messaggi
    11
    Buonasera andbin.

    Mi scusi se la disturbo nuovamente.
    Non sono in grado di capire questo concetto. Sembra semplice, ma non arrivo alla soluzione.

    Se ci rifacciamo al codice iniziale, tratto dal libro su cui studio:

    codice:

    codice:
    public class CiProvo {
     public void cambiaValore(int valore) {
      valore = 1000;
     }
    }
    Il parametro formale "valore" e la variabile locale anch'essa "valore" sono uguali?
    Se SI, perch�?

    codice:
    CiProvo ogg = new CiProvo();
    int numero = 10;
    ogg.cambiaValore(numero);
    System.out.println("il valore del numero � " + numero);
    Quando viene detto:

    Il parametro valore del metodo cambiaValore() , nel momento in cui � stato eseguito il metodo, non coincideva con la variabile numero, bensi immagazzinava solo la copia del suo valore (10).

    Perch�? Il parametro valore era uguale a 1000, e la variabile numero a 10?
    Come fa il parametro valore ad immagazzinare la copia del valore della variabile numero?

    Grazie mille ancora.

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Fedro93 Visualizza il messaggio
    Se ci rifacciamo al codice iniziale, tratto dal libro su cui studio:

    codice:

    codice:
    public class CiProvo {
     public void cambiaValore(int valore) {
      valore = 1000;
     }
    }
    Il parametro formale "valore" e la variabile locale anch'essa "valore" sono uguali?
    Qui non ci sono due cose .... ma solo una: una singola variabile 'valore' che è il parametro formale del metodo. Ed è comunque locale al metodo, quando il metodo termina, la variabile 'valore' sparisce.


    Quote Originariamente inviata da Fedro93 Visualizza il messaggio
    codice:
    CiProvo ogg = new CiProvo();
    int numero = 10;
    ogg.cambiaValore(numero);
    System.out.println("il valore del numero � " + numero);
    Quando viene detto:

    Perché? Il parametro valore era uguale a 1000, e la variabile numero a 10?
    Come fa il parametro valore ad immagazzinare la copia del valore della variabile numero?
    Qui hai una variabile 'numero' che passi al metodo. Ma ribadisco che 'numero' e il parametro 'valore' sono due variabili DIVERSE. Si trovano in locazioni di memoria differenti e ciascuna ha i suoi 32 bit (essendo dei int). Quando si dice che "il parametro riceve una copia del valore" è semplicemente per dire che a basso livello gli N bit che ha e sta passando il chiamante vengono copiati in un'altra locazione di memoria che è quella del parametro. Quindi in effetti avviene che quel valore (10) si trova sia alla locazione di 'numero' che alla locazione di 'valore'.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.