Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [JAVA] Passaggio per riferimento e per valore

    Stavolta, e ringrazio anticipatamente ancora una volta il santo che mi rispondera' (Andbin sindaco!!!), affronto un problema di cui so gia' qualcosa (incredibile!!!).

    In java, i tipi primitivi sono passati per valore.

    Cio' implica che, se scrivo

    int i = 7;
    int p = 3;
    i = p;
    p = 4
    alla fine, p avra' valore 4 e i avra' valore 3. (E comunque mi sfugge una cosa... Questo vuol dire che, quando all'interno di un metodo creo nello stack dinamicamente una variabile valore, nella cella dello stack non c'e' un indirizzo ma un vero e proprio valore vero??? Da qui, passaggio per valore...)

    Ma se scrivo
    Data d = new Data (29/06/1982);
    Data f = new Data (01/07/1985);
    d = f;
    f = new Data (17/02/1949
    adesso f punta all'indirizzo in cui c'e' il valore 17/02/1949 e d all'indirizzo che contiene il valore 01/07/1985, e soprattutto che il garbage collector si pappa le celle di memoria dello heap che contenevano 29/06/1982...
    Se poi non avessi scritto l'ultima riga e stampavo i due valori d e f, avrei avuto come output una riga che testimoniava che era stata eseguita una copia degli indirizzi, dato che avrei ottenuto 2 date uguali...

    Pero', se implemento un metodo del tipo

    public void assegnaDate ( Data a, Data c) {
    a = c;
    }
    e nel main lo richiamo

    Date compl1 = new Date (29/06/1982):
    Date compl2 = new Date (01/07/1985);
    Classe.assegnaDate (compl1, compl2);
    alla fine perche' sia compl1 che compl2 non puntano allo stesso indirizzo che conterrebbe il valore 01/07/1985???

    Cosa accade nei metodi???

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Semplice: nel metodo, alla variabile locale a, viene assegnato l'indirizzo della variabile locale c... ma questo non ha alcun effetto sui parametri attuali.

    Vediamo la situazione in memoria:
    codice:
    Indirizzo di compl1 = x;
    Indirizzo di compl2 = y;
    Indirizzo di a = w;
    Indirizzo di c = z;
    Al passaggio dei riferimenti (chiamata della funzione) accade questo:
    codice:
    Indirizzo di compl1 = x;
    Indirizzo di compl2 = y;
    Indirizzo di a = x;
    Indirizzo di c = y;
    L'esecuzione della funzione fa questo:
    codice:
    Indirizzo di compl1 = x;
    Indirizzo di compl2 = y;
    Indirizzo di a = y;
    Indirizzo di c = y;
    Punto.

    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 L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Passaggio per riferimento e per valore

    Originariamente inviato da ragnonerodocet
    In java, i tipi primitivi sono passati per valore.
    Sì ma anche i reference ... tra poco capirai perché.

    Comunque la questione del passaggio per valore o per riferimento riguarda in generale (quindi non solo per Java) il passaggio degli argomenti a una funzione/metodo/subroutine/sottoprogramma (chiamalo come vuoi ... dipende comunque dal linguaggio).

    Non per semplici "assegnamenti" tra variabili.


    Originariamente inviato da ragnonerodocet
    Questo vuol dire che, quando all'interno di un metodo creo nello stack dinamicamente una variabile valore, nella cella dello stack non c'e' un indirizzo ma un vero e proprio valore vero??? Da qui, passaggio per valore...)
    Beh, non centra molto il passaggio .... se una variabile locale (quindi sullo stack) è di tipo primitivo, allora ovviamente sullo stack c'è il valore vero e proprio!

    Originariamente inviato da ragnonerodocet
    Pero', se implemento un metodo del tipo

    public void assegnaDate ( Data a, Data c) {
    a = c;
    }

    e nel main lo richiamo

    Date compl1 = new Date (29/06/1982):
    Date compl2 = new Date (01/07/1985);
    Classe.assegnaDate (compl1, compl2);
    Ecco qui la questione. Anche per i tipi reference il passaggio è sempre per valore. Ovvero al metodo viene passata una copia del valore del reference.
    La variabile 'a' nel metodo assegnaDate() è completamente diversa da compl1 nel main (idem per 'b' e compl2) e ha una copia del valore che è contenuto in compl1.
    Cosa assegni ad 'a' e 'c' non va minimanente ad influire sulle variabili nel main.

    Nel metodo potresti eventualmente cambiare lo stato dell'oggetto referenziato (invocando metodi o accedendo ai campi) ma solo se l'oggetto fosse "mutabile".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Credo che poi l'esempio scelto sia anche un po particolare...mi sbaglio o l'oggetto Date è come quello String...ovvero immutabile?
    Administrator of NAMDesign.Net

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da LeaderGL
    mi sbaglio o l'oggetto Date è come quello String...ovvero immutabile?
    No, Date è mutabile, ha il metodo setTime(long time) più gli altri setXXX() (che però sono "deprecati").
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.