Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613

    [java] passaggio variabil per riferimento

    Non so se la domanda è una emerita minkiata però vorrei sapere se è possibile effettuare un passaggio di variabile all'interno di una classe ad un suo metodo per riferimento.

    Il fatto è che devo fare una funzione ricorsiva che crei un albero...


  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613

    Mi sono risposto da solo

    Da

    WMLScript.it
    [...]altri linguaggi come il C, permettono anche il passaggio di parametri “per riferimento”. In quel caso al metodo viene passato l'intero riferimento, non solo il suo indirizzo, con la conseguente possibilità di poter mutarne l'indirizzamento. Questa caratteristica non è stata importata in Java, perché considerata (a ragione) una minaccia alla sicurezza. Molti virus, worm etc… sfruttano infatti la tecnica del passaggio per riferimento.
    Come piffero faccio?!

  3. #3
    In Java gli oggetti sono sempre passati per riferimento (in quanto puntatori) mentre i tipi primitivi sempre per valore.
    Se vuoi passare un tipo primitivo per riferimento puoi usare la classe associata (Integer per int, Float per float, etc...)
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    grassie

  5. #5
    Oddio...
    Ripensandoci, io sta cosa l'ho letta, l'ho memorizzata... pero' non faccio mai passsaggi di parametri in quel modo, uso sempre funzioni membro della classe.
    Mo' faccio un po' di prove...
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  6. #6
    Ah, ecco, ho capito che cavolo c'era scritto in quel sito!!! Si', quello su cui lavori nel metodo che richiami e' un puntatore allo stesso oggetto (ergo, e' possibile modificare permanentemente l'oggetto che dai come parametro) ma non lo stesso puntatore (ergo, non puoi arbitrariamente puntare ad un altro oggetto)
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    adesso non ho capito io
    [...]ma non lo stesso puntatore (ergo, non puoi arbitrariamente puntare ad un altro oggetto)

  8. #8
    Intendo che la dicitura "per indirizzo", anziche' "per riferimento" e' certamente piu' corretta.
    Quando scrivo

    codice:
    Date data = new Date (12, 3, 1979);
    sto dicendo:

    1) crea un nuovo oggetto di classe Date e inizializzalo coi valori che ti ho dato
    2) crea una variabile che punta a un oggetto Date e inizializzala facendola puntare all'(indirizzo dell')oggetto appena creato

    L'oggetto "12/3/1979" sara' creato in una certa locazione di memoria (chiamiamola 1000, cosi' per dire) in maniera indipendente dalla mia variabile data... Mi spiego, o meglio, ci provo...

    codice:
    Date miaDataDiNascita = data;
    In questo modo ho un'altra variabile che punta allo stesso oggetto puntato da data. Pero' attenzione: a miaDataDiNascita viene passato l'indirizzo dell'oggetto. In pratica punta a 1000! Quindi, se io scrivo:

    codice:
    data= new Date ();
    avro' che data punta ad un nuovo oggetto, che si trovera' in una locazione diversa (chiamiamola 2000) mentre miaDataDiNascita continua a puntare al 12 marzo 1979 (nella locazione 1000)

    Nota che l'unico modo che ho per accedere al nuovo oggetto e' tramite la variabile data che lo punta. Se io la annullo:

    codice:
    data=null
    l'oggetto e' perduto, non ho piu' modo di accedervi (e di li' a poco sara cannibalizzato dal Garbage Collector in quanto occupa spazio inutile!)

    Detto cio'.
    Quello che dice sul sito e' questo: mettiamo che ora l'assegnazione fra data e miaDataDiNascita la voglio fare in un metodo che richiamo appositamente:

    codice:
    public void assegna (Date d1, Date d2) {
       d2=d1;
    }
    e quindi nel mio programma scrivo:

    codice:
    Date data = new Date (12, 3, 1979);
    Date miaDataDiNascita;
    assegna (data,miaDataDiNascita);
    non ottengo l'effetto desiderato. Perche'?
    Nel mio programma, prima di richiamare assegna ho che data punta lo stesso oggetto di prima (12/3/1979 alla locazione 1000) mentre miaDataDiNascita e' una variabile non inizializzata, quindi punta a un fantomatico oggetto "null"...
    Quando richiamo assegna, avro' quindi questa situazione: d1 punta lo stesso oggetto puntato da data, quindi 12/3/1979 alla locazione 1000; d2 punta a "null".
    Eseguo: d2 puntera' ora allo stesso oggetto puntato da d1. Cosa ho risolto? Nulla! Perche' miaDataDiNascita continuera' a puntare a "null"!!!

    ...

    Credo di averti finito di confondere le idee, giusto?
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  9. #9
    già già già....

    Porcazza la miseria io ho un problema elgato proprio al fatto che con sto fatto di puntatori mi perdo un oggetto..
    Vado a spiegare l'inghippo...

    Lavarando su applicazione WeB e per motivi di sviluppo ho dovuto mettere un oggetto in session ...

    Ora però questo oggetto deve essere preso e distrutto...

    quindi dopo avere fatto

    MioObject mioObject = session.getAttribute(mioAttribute)

    faccio

    session.remove(mioAttribute).
    Ma dopo ciò.. il mio Puntatore mioObject punta a null per l'appunto e non ho idea di come fare... e il remove deve essere fatto immediatamente.. mi serve di fare un clone dell'oggetto.. avete qualche suggerimento?

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.