Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    20

    passaggio di valori a metodi

    ciao...
    ho dei problemi (dubbi) per quanto riguardo il passaggio di valori tra metodi....
    tipo:

    codice:
    package prova;
    import java.util.*;
    
    public class NewClass2 {
    
        int U=0;
        List<Integer> s=new ArrayList<Integer>();
        String[]r=new String[2];
        String y="e";
        es4[] es4=new es4[4];
    
    
    	public static void main(String[] args) {
    
               new NewClass2().t();
    
               
            }
            public void t()
            {
                es4[0]=new es4(U,s,r,y);
                es4[0].c(10);
    
                U=5;
                y="w";
                s.add(15);
                r[0]="mao";
                es4[0].c(10);
            }
    }
    e il metodo chiamato....

    codice:
    package prova;
    
    import java.util.*;
    public class es4 {
    
        int T;
        List<Integer> l;
        String[] A;
        String h;
        public es4(int T,List<Integer> L,String[] A,String h)
        {
            this.T=T;
            this.l=L;
            this.A=A;
            this.h=h;
            //System.out.println("es4 "+T);
        }
    
        public void c(int t2)
        {
            System.out.println("T "+T+" t "+t2);
            System.out.println("L "+l);
            System.out.println("a "+A[0]+" "+A[1]);
            System.out.println("H "+h);
           
        }
    
    }
    ...il risultato....
    codice:
    T 0 t 10
    L []
    a null null
    H e
    T 0 t 10
    L [15]
    a mao null
    H e
    perchè la lista e l array cambiano valore?!?!

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    51
    Quando passi un oggetto ad un metodo, gli viene passato il reference all'oggetto cosa che non accade per tipi primitivi e gli oggetti String, di cui viene eseguita una copia.
    Quindi quando tu passi "s" al costruttore di es4, quell'oggetto conterrà un reference ad un oggetto List caricato nell'heap, e qualunque modifica effettuata su quell'oggetto sarà visibile dall'oggetto es4 creato.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    20
    uh....
    ...intanto grazie per la risposta.!
    ma ci sarebbe un modo per passare una lista o array senza che questa venga modificata nel metodo??

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    51
    Per la lista te la puoi cavare con una chiamata a clone sulla lista visto che si tratta di oggetti Integer, mentre per la copia dell'array puoi usare il metodo Arrays.copyOf(originalArray, lengthNewArray), stai attento al comportamento di questi metodi in caso di oggetti.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    20
    ok,grazie.!.
    ora provo a fare qualche esperimento.!.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da detrots
    cosa che non accade per tipi primitivi e gli oggetti String, di cui viene eseguita una copia.
    Anche le stringhe vengono passate, come tutti gli oggetti, per riferimento... ma essendo essi stessi oggetti immutabili, non si possono modificare.

    Un esempio:
    codice:
    public class Confronto {
       private String a;
    
       public boolean test(String s) {
          return ( s == a );
       }
    
       public void confronta() {
          a = new String("Ciao");
          String b = new String("Ciao");
          System.out.println("Confronto la stringa usando il metodo: " + test(a));
          System.out.println("Confronto la stringa con un'altra con lo stesso contenuto: " + (a == b));
       }
    
       public static void main(String[] args) {
          Confronto c = new Confronto();
          c.confronta();
       }
    }
    Nell'esempio, l'oggetto "a" viene prima passato ad un metodo, il quale confronta il reference locale "s" con il reference globale "a"... e stampa true (dimostra che l'oggetto è esattamente lo stesso, non una copia).

    Viene anche effettuato un confronto fra reference usando lo stesso oggetto "a" e un secondo oggetto "b" con lo stesso contenuto e viene stampato false (sono due oggetti con stesso contenuto, ma distinti).


    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

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    20
    ....grazie a tutti per le risposte.!.
    ora è tutto più chiaro e sono riuscito a completare il lavoro.!
    ciao e grazie ancora.!

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.