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

    riferimenti in java e passaggio dei parametri

    Salve a tutti,sono alle prese con java (in realtà ho da poco iniziato a studiare) e vorrei capire innanzitutto alcuni concetti base.Allora per prima cosa ho capito che in java non si parla di puntatori in maniera esplicita,ma di riferimenti. Per la mia esperienza in C++,un riferimento altro non è che un puntatore costante, ossia un puntatore che punta in maniera costante ad un indirizzo!Però se considero tale esempio :

    class Location{
    private int x;
    private int y;
    private int z;
    .....
    .....
    }

    poi mi dichiaro ed inizializzo due riferimenti ad oggetti di tipo Location :

    Location p1=new Location(..);
    Location p2=new Location(..);

    ora in questo caso ho creato due riferimenti che puntano a due porzioni di memoria differenti!
    ma se faccio p2=p1; allora faccio si che p2 punti alla stessa area di memoria a cui punta p1.giusto??ma in tal caso, il riferimento p2 cambia,quindi non punta più in maniera costante ad un indirizzo!come mai??forse i concetti di riferimento in C++ e java sono intesi in maniera differente?
    Se invece faccio p2.equals(p1), allora sto considerando se lo stato dei due oggetti (e dunque le variabili x,y,z) sono uguali??
    Inoltre vorrei capire meglio come funziona il passaggio dei parametri : infatti a lezione mi hanno detto che i tipi primitivi vengono passati per valore, mentre tt gli altri oggetti (tra cui anche gli array) vengono scambiati per riferimento..
    GRAZIE a tutti per le risposte

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: riferimenti in java e passaggio dei parametri

    Originariamente inviato da thedreamer84
    Location p1=new Location(..);
    Location p2=new Location(..);

    ora in questo caso ho creato due riferimenti che puntano a due porzioni di memoria differenti!
    Sì.

    Originariamente inviato da thedreamer84
    ma se faccio p2=p1; allora faccio si che p2 punti alla stessa area di memoria a cui punta p1.giusto??
    Sì.

    Originariamente inviato da thedreamer84
    ma in tal caso, il riferimento p2 cambia,quindi non punta più in maniera costante ad un indirizzo!come mai??
    No alt. Una cosa è una variabile di tipo reference .... (il cui valore può cambiare se non final) e un'altra è proprio il reference dell'oggetto. Non è quest'ultimo che si cambia!!!

    Originariamente inviato da thedreamer84
    forse i concetti di riferimento in C++ e java sono intesi in maniera differente?
    No, concettualmente esattamente uguale .... salvo il fatto che in Java cosa sia davvero a livello di JVM un reference e cosa contenga come valore una variabile di tipo reference non è generalmente affatto importante per il programmatore.

    In C/C++:

    char *s1 = "hello";
    char *s2 = "world";

    Hai due variabili di tipo puntatore che puntano a locazioni di memoria differenti. Se fai s2=s1; semplicemente il valore contenuto in s1 (che è un indirizzo) viene copiato nella variabile s2. E entrambe punteranno alla stessa locazione.

    In Java è concettualmente la stessa identica cosa:

    String s1 = "hello";
    String s2 = "world";

    Hai 2 oggetti String differenti e due variabili reference con valori ovviamente differenti. Se fai s2=s1; semplicemente entrambe le variabili faranno riferimento allo stesso identico oggetto.

    Originariamente inviato da thedreamer84
    Se invece faccio p2.equals(p1), allora sto considerando se lo stato dei due oggetti (e dunque le variabili x,y,z) sono uguali??
    L'obiettivo di equals(), se ridefinito opportunamente in una classe, è quello di verificare se due oggetti sono di "significato equivalente" ovvero hanno lo stesso contenuto e cioè lo stesso "stato".

    Originariamente inviato da thedreamer84
    Inoltre vorrei capire meglio come funziona il passaggio dei parametri : infatti a lezione mi hanno detto che i tipi primitivi vengono passati per valore, mentre tt gli altri oggetti (tra cui anche gli array) vengono scambiati per riferimento..
    In Java il passaggio dei parametri è sempre per valore. Per i tipi reference quello che passi è una copia del valore del reference.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: riferimenti in java e passaggio dei parametri

    Originariamente inviato da andbin
    No alt. Una cosa è una variabile di tipo reference .... (il cui valore può cambiare se non final) e un'altra è proprio il reference dell'oggetto. Non è quest'ultimo che si cambia!!!
    M allora perchè dai corsi di C++ si diceva che un riferimento è come un puntatore costante (C &r equivale a C*const p) e che :
    un riferimento deve essere inizializzato quando viene creato;
    una volta creato,un riferimento NON può essere modificato!!

    cosa intendi + esattamente per copia del valore del reference?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: riferimenti in java e passaggio dei parametri

    Originariamente inviato da thedreamer84
    M allora perchè dai corsi di C++ si diceva che un riferimento è come un puntatore costante (C &r equivale a C*const p) e che :
    un riferimento deve essere inizializzato quando viene creato;
    una volta creato,un riferimento NON può essere modificato!!
    Mi sa che stai facendo confusione tra quello che è l'indirizzo di un qualcosa in memoria e il valore che è contenuto in una variabile di tipo puntatore (C/C++) o tipo reference (Java).

    Se in C/C++ fai: char *s = "hello";
    Quella stringa hello è una sequenza di 6 caratteri (nullo incluso) che è da qualche parte in memoria ad un certo indirizzo. Questo indirizzo non lo cambi.
    Così come in una funzione:
    codice:
    void pippo() {
        int arr[10];
    }
    L'array 'arr' è allocato (sullo stack, essendo una variabile locale) ad un certo indirizzo stabilito a runtime. Anche qui l'indirizzo non lo puoi cambiare.

    Quello che puoi cambiare è il contenuto di una variabile di tipo puntatore (tipo reference in Java).
    Se poi il linguaggio permette di dichiarare una variabile di tipo puntatore "costante", vuol solo dire che è il compilatore a verificare se da qualche parte nel codice vengono fatte assegnazioni a quella variabile. Non che hai fatto una variabile che fisicamente in memoria è davvero "read-only".

    Originariamente inviato da thedreamer84
    cosa intendi + esattamente per copia del valore del reference?
    String s = "hello";

    Questa variabile 's' è di tipo reference. Avrà anch'essa un valore ... sarà fatta di un certo numero di bit, no? Bene: quanti bit abbia, quali valori possa avere ecc... cosa sia realmente, al programmatore Java tutto questo tipicamente non interessa.

    Se passi la variabile 's' ad un metodo, il metodo potrà usare il parametro che poi è una variabile locale (sullo stack) a cui inizialmente viene assegnato lo stesso valore di 's'.
    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 © 2026 vBulletin Solutions, Inc. All rights reserved.