Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    682

    [ JAVA ] Passaggio per valore e per riferimento

    Ho un dubbio circa il passaggio dei dati per valore o per riferimento in java.
    Prendiamo questo esempio:
    class Dati {
    public void cambia(int valore)
    {
    valore = 5;
    }
    }
    public class Tempo
    {
    public static void main(String arg[])
    {
    Dati primo = new Dati();
    int numero = 100;
    primo.cambia(numero);
    System.out.println("Il numero é:" + numero);

    }
    }
    Il testo dice: il parametro "valore" nel momento in cui viene eseguito il metodo non coincide con la variabile numero, viene usata la copia del valore di quest'ultima(100).
    La variabile numero non viene quindi modificata.
    Se provo a richiamare il metodo con la variabile valore becco un errore allora penso che il valore della variabile locale a cui faceva riferimento l'oggetto primo é stato modificato ?
    Mi trovo in contraddizione

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non ho capito... a me non dà nessun errore, né tantomeno il valore viene modificato (il chè è giusto). Che errore hai?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    682
    Mi sono spiegato male.
    Volevo capire se é stato cambiato il valore della varibile locale del metodo "cambia" a me sembra di si.
    Quindi c'é un passaggio per riferimento ?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Calma... passaggio per riferimento significa che i cambiamenti effettuati all'interno del metodo, rimangono visibili al suo esterno. E' ovvio che se cambi il valore all'interno di un metodo, sempre al suo interno il valore rimane cambiato... sarebbe grave se non lo fosse!!

    Comunque, in Java, il passaggio per riferimento lo si ha solo con gli oggetti: i tipi di dati primitivi sono tutti passati per valore.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    682
    Praticamente l'autore del testo smentisce proprio questo
    dice che il passaggio di valori in java é sempre per valore indipendentemente dal fatto che ci si riferisca ad un oggetto o ad un tipo primitivo di dati.
    Per l'esempio postato allora adesso mi é chiaro però mi dovresti fare un esempio per il discorso delle modifiche del metodo che rimangono visibili dall'esterno.

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    In java i parametri sono passati SEMPRE PER VALORE: se passi un riferimento ad un oggetto è vero che se modifichi i campi dell'oggetto questi restano modificati, ma se modifichi il riferimento stesso, cioè riasseggni l'oggetto, la modifica non è visibile all'esterno.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    682
    Mi scrivete un esempio scemo ho capito a metà vorrei togliermi il dubbio.

  8. #8
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    codice:
    class A{
         
         int val = 100;
    
         static void incrementa(int i){
             i = i + 1;
         }
    
         static void annulla(A a){
             a.val = 0;
             a = null;
         }
    
         public static void main(String[] args){
              int i = 0;
              System.out.println("valore di i prima di invocare 'incrementa(i)': " + i);
              incrementa(i);
              System.out.println("valore di i dopo che è stato invocato 'incrementa(i)': " + i);
              System.out.println();
              A a = new A();
              System.out.println("valore di 'a' prima di invocare 'annulla(a)': " + a);
              System.out.println("valore di 'a.val' prima di invocare 'annulla(a)': " + a.val);
              annulla(a);
              System.out.println();
              System.out.println("valore di 'a' dopo che è stato invocato 'annulla(a)': " + a);
              System.out.println("valore di 'a.val' dopo che è stato invocato 'annulla(a)': " + a.val);
    
         }
    }
    Puoi notare che i valori di 'i' e di 'a' restano uguali prima e dopo l'invocazione dei metodi, perche questi parametri sono appunto passati per valore e restano immodificati, mentre il campo a.val viene modificato dal metodo annulla.


  9. #9
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    682
    La dichiarazione del metodo annulla (A a) crea un oggetto se non vado errato (ho studiato solo i primi 2 capitolo al momento) quindi abbiate pazienza.
    Quello che discutevo é che l'oggetto istanziato punta alla classe, se uso il metodo così cambio il valore.
    Questa cosa di cambiare il valore direttamente so che si chiama passaggio per riferimento mentre invece l'autore del testo dice che in java si uso solo il passaggio per riferimento.
    Quando invoco un metodo così me lo aspetto quasi come un fatto
    obbligato che raccolga il paramentro con il valore al momento dell'invocazione.
    Nei procedurali é cosi poi sperò capirò meglio più avanti non ho studiato tutti i costrutti del linguaggio.

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Originariamente inviato da anx721
    In java i parametri sono passati SEMPRE PER VALORE: se passi un riferimento ad un oggetto è vero che se modifichi i campi dell'oggetto questi restano modificati, ma se modifichi il riferimento stesso, cioè riasseggni l'oggetto, la modifica non è visibile all'esterno.
    Sì, questo è vero... però ha poco senso parlare del tipo di passaggio dei parametri in Java, dato che il suo comportamento differisce dagli altri linguaggi di programmazione. In pratica, se l'oggetto non viene riassegnato, esso è a tutti gli effetti un "puntatore" all'oggetto passato, altrimenti si considera come un passaggio per valore.

    Il programmatore, in Java, non si deve preoccupare del tipo di passaggio dei parametri, in quanto i puntatori in Java non esistono.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2024 vBulletin Solutions, Inc. All rights reserved.