Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [Java] Passaggio di parametri per riferimento

    Salve a tutti.
    Non riesco a capacitarmi di come non riesca a risolvere un problema semplicissimo.
    Ho bisogno di un metodo che restituisca più valori, e l'unica idea che mi è venuta è quella di passargli parametri per riferimento affinchè possa modificarli e mettervi i risultati.
    Non ho capito se sbaglio nel concetto o nella pratica, fatto sta che non riesco a fare una cosa del genere. Ho fatto il seguente test:
    codice:
    public class Test {
    	public static void main(String[] args) {
    		int c;
    		c=2;
    		System.out.println(c);
    		Integer b = new Integer(c);
    		prova(b);
    		System.out.println(b);
    	}
    
    	static void prova(Integer a){
    		a=new Integer(a.intValue() + 5);
    		System.out.println(a);
    	}
    }
    ma restituisce 2-7-2 invece di 2-7-7.
    Ho sbagliato qualcosa? E' valida l'idea di farsi restituire dei risultati tramite gli argomenti o si può risolvere in altro modo?

    ...e se avessi bisogno di passare degli interi, è necessario per forza usare gli oggetti Integer come ho fatto oppure si può fare anche con gli "int"?

    Grazie in anticipo.

  2. #2
    Bhè, innanzi tutto non ti serve creare degli oggetti Integer da passare alla tua funzione, ti basta solamente passare gli int
    e poi il risultato che ottieni è giusto, il metodo prova va a modificare solo il parametro passato, che poi è passato appunto per valore: viene creata una copia del parametro originario e sulla copia si applicano le modifiche
    se hai la neccessità di modificare b, devi dichiararla come variabile a livello della classe e non del metodo, e nel metodo prova andare a modificare direttamente b
    in questo caso, non servirebbe passare il paramerto a
    23-08-2005: Udinese in cémpions lìg
    Questa estate l'ho passata a Tallin

  3. #3
    il metodo prova va a modificare solo il parametro passato, che poi è passato appunto per valore: viene creata una copia del parametro originario e sulla copia si applicano le modifiche
    Non esiste un modo per passare parametri per riferimento? Ripeto: devo implementare funzioni che restituiscano più valori disomogenei, ed utilizzare variabili pubbliche non risolve il problema (sono funzioni riorsive).

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,317
    In Java tutti gli oggetti vengono passati per riferimento. Il problema di chi passa da linguaggi come C/C++ a Java è quello che non riescono a capire che non si devono preoccupare del tipo di passaggio degli oggetti. Se io passo un oggetto ad un metodo e questo metodo lo modifica, al ritorno dal metodo l'oggetto sarà modificato. Il perchè non ha senso andarselo a chiedere.

    Un modo alternativo per restituire più di un parametro è quello di restituire un array. Dato che Java è Object Oriented, nessuno ti vieta di restituire un array di Object, che, per quanto brutto sia e da sconsigliarsi, è pur sempre un modo valido per restituire più di un 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
    Originariamente inviato da LeleFT
    In Java tutti gli oggetti vengono passati per riferimento. Il problema di chi passa da linguaggi come C/C++ a Java è quello che non riescono a capire che non si devono preoccupare del tipo di passaggio degli oggetti. Se io passo un oggetto ad un metodo e questo metodo lo modifica, al ritorno dal metodo l'oggetto sarà modificato. Il perchè non ha senso andarselo a chiedere.
    Beh... non c'e' bisogno di tutta questa enfasi... quello che hai detto è esattamente quello che mi aspettavo, ma il piccolo test che ho postato nel primo messaggio sembra non essere daccordo. Ho sbagliato nel test inviato o la mia JVM non è daccordo con te?

  6. #6
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    Devi distinguere i riferimenti dagli oggetti veri e propri: i riferimenti sono solo dei "puntatori" (termine forse pericoloso in Java) a le aree di memoria in cui sono memorizzati gli oggetti veri e propri.

    I riferimenti vengono copiati quando li passi da un metodo all'altro (cioè viene creato un nuovo puntatore che si riferisce sempre allo stesso oggetto).

    Quando chiami la funzione il riferimento a punta allo stesso oggetto a cui punta il riferimento b del main. Poi tu crei un nuovo oggetto e modifichi a facendolo puntare a questo. Quindi a non è piu una copia di b

    Per passarlo per riferimento bastava non fare niente
    Linux user number 403381

    Stop TCPA!

  7. #7
    Ho capito dove sta l'inghippo. Ma come faccio a modificare il valore di "a" senza creare un nuovo oggetto? In Java 1.5.0 esiste "valueOf(int)" che potrebbe porre rimedio al problema, ma lo stesso metodo non esiste nelle versioni precedenti (esiste ma non supporta int come parametro).

    ...non riuscire a manipolare un "Integer" mi fa sentire proprio niubbo, ma la maggior parte delle guide si concentrano tanto sul concetto di ereditarietà, polimorfismo e menate sugli oggetti tralasciando di approfondire i concetti base.

  8. #8
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    Il problema è che la classe Integer (come tutte le classi "wrapper" cioè quelle classi che rappresentano dei tipi primitivi) sono read-only, cioè non puoi modificare il valore dell'oggetto una volta che è stato costruito.
    Linux user number 403381

    Stop TCPA!

  9. #9
    Potresti crearti una classe tua con una variabile privata di tipo intero e due metodi get e set per andare a leggerer/scrivere su di essa. Modificando il valore tramite set, l'oggetto risulterà modificato. Naturalmente devi farlo direttamente:
    static void prova(MyInteger a){
    a.setInt(a.getInt() + 5);
    System.out.println(a);
    }

  10. #10
    E' esattamente quello che ho fatto (e, credo, l'unico modo di farlo)

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.