Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182

    [java]dubbio passaggio per valore

    Salve,
    non so se ho capito male io,ma in java il passaggio dei parametri avviene per valore ma se si passano dei tipi reference come nel caso sotto in teoria la funziona chiamata può modificare il valore degli oggetti in quanto gli viene passato un "puntatore".

    Nel caso sotto ciò non avviene.


    codice:
    /* Defined in ArrayClassObj3.java
    class Point {
    	int x;
    	int y;
    		
    	public Point(int i, int j){
    		x=i;
    		y=j;
    	}
    }
    */
    
    public class Swap2 {
    
    	public static void swap(Point p1, Point p2) {
    		Point temp = p1;
    		p1 = p2;
    		p2 = temp;
    		
    		System.out.println("p1.x " + p1.x);
    		System.out.println("p2.x " + p2.x);
    		
    		
    		
    	}
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		Point p1 = new Point(100,200);
    		Point p2 = new Point(300,400);
    		//System.out.println("p1=" + p1.toString());
    		System.out.println("p1=" + p1);		
    		System.out.println("p2=" + p2);
    		swap( p1, p2 );
    		System.out.println("p1=" + p1);
    		System.out.println("p2=" + p2);
    
    	}
    
    }

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [java]dubbio passaggio per valore

    Originariamente inviato da felpone
    Salve,
    non so se ho capito male io,ma in java il passaggio dei parametri avviene per valore ma se si passano dei tipi reference come nel caso sotto in teoria la funziona chiamata può modificare il valore degli oggetti in quanto gli viene passato un "puntatore".
    No. In Java esiste solo il passaggio per valore. Nel caso degli oggetti quella che viene passata è la copia del riferimento.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Sposto nel forum dedicato al linguaggio Java.

    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Il tuo metodo non scambia niente: all'invocazione i riferimenti ai due oggetti vengono copiati nelle due variabili locali (i parametri), a questo punto scambi il contenuto di queste due variabili (cioé quella che prima si riferiva ad uno ora si riferisce all'altro, e viceversa), poi il metodo termina e queste due variabili vengono deallocate. Chiaramente questo non modifica in alcun modo i due oggetti.

    Modificare un oggetto e modificare un riferimento ad esso sono cose differenti (e in linea di massima distinte).
    effeffe

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    719
    Non funziona così. Per fare quello che ti serve non devi mai sostituire gli oggetti.

    codice:
    	public static void swap(Point p1, Point p2) {
    		int tempx = p1.x; 
    		int tempy = p1.y
    		p1.x = p2.x;
    		p1.y = p2.y;
    		p2.x = tempx;
    		p2.y = tempy;
    	}
    Il problema è che quando assegni un nuovo valore al tuo oggetto viene riallocato, modificandone il contenuto solo durante l'esecuzione della funzione stessa. Con questo metodo gli oggetti rimangono nello stesso indirizzo di memoria e tutto funziona correttamente.


  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da simo22
    Il problema è che quando assegni un nuovo valore al tuo oggetto viene riallocato, modificandone il contenuto solo durante l'esecuzione della funzione stessa. Con questo metodo gli oggetti rimangono nello stesso indirizzo di memoria e tutto funziona correttamente.

    Non viene allocato nessun oggetto (ci mancherebbe!), nè viene modificato.
    effeffe

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.