|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#41 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
intendo dire che in java un'oggetto è una variabile che contiene il riferimento a un'area di memoria. questa variabile è passata per valore come tutte le altre variabili, non c'è un trattamento speciale per gli oggetti.
|
|
|
|
|
|
#42 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
quello che tu chiami variabile identifica il reference, non l'object il reference è passato per valore e tale fatto implica che l'object identificato dal reference è passato per riferimento |
|
|
|
|
|
|
#43 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
|
|
|
|
|
|
|
#44 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
un oggetto è una variabile che contiene un reference, ma non per questo possiamo dire che esiste il passaggio per riferimento in java. è proprio lo stesso discorso del C, ne più ne meno certamente: Codice:
public class Prova {
public static void main(String[] args) {
Integer number = new Integer(1);
foo(number);
System.out.println(number.toString());
}
public static void foo(Integer number) {
Integer anotherNumber = new Integer(4);
number = anotherNumber;
}
}
|
|
|
|
|
|
|
#45 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
guarda: Codice:
public class Test1 {
public static void main(String[] args) {
int i = 0;
foo(i);
System.out.println(i);
Integer j = 0;
foo(j);
System.out.println(j);
Bla b = new Bla();
foo(b);
System.out.println(b.value);
}
private static void foo(int i) {
i = 4;
}
private static void foo(Integer i) {
i = 4;
}
private static void foo(Bla b){
b.value = 4;
}
static class Bla {
int value;
}
}
|
|
|
|
|
|
|
#46 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
|
|
|
|
|
|
|
#47 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Come spiega in maniera molto approfondita il link che avevo postato, in java esiste solo ed esclusivamente il passaggio per valore. Infatti in java esistono essenzialmente i primitive type e i reference type. I primitive type sono tutti i tipi primitivi, mentre i reference type comprendono i vari oggetti e arrays. Quando tu passi un parametro ad un metodo esso non fa altro che ricevere per copia il contenuto della variabile che gli stai passando. Poichè i primitive type contengono al loro interno semplicemente un valore, all'interno della funzione vedrai direttamente questo valore. Poichè i reference type contengono al loro interno un riferimento (come dice il nome stesso d'altronde), allora in quel caso viene passato per copia il valore del reference type, che non è altro che il riferimento dell'oggetto. Ovviamente tale passaggio NON è assolutamente un passaggio per riferimento dato che non puoi in alcun modo modificare il riferimento iniziale, ma puoi semplicemente agire sulla copia di tale riferimento. Tanto per concludere, è inutile continuare a dibattere dato che Gosling stesso aveva ben chiarito questo concetto nelle specifiche del linguaggio Java, come evidenziato lungo il corso del thread che ho linkato. Se volete continuare a credere che in java esista il passaggio per riferimento, allora fate pure. Però state sbagliando dato che non è una questione di opinioni personali, ma di definizioni che sono state date in un certo modo all'atto della creazione del linguaggio Java e contenute nelle sue specifiche.
__________________
Ultima modifica di ^TiGeRShArK^ : 18-01-2008 alle 13:09. |
|
|
|
|
|
|
#48 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
per dirla in altro modo, sullo stack non viene posta una copia dell'oggetto, ma una copia del reference che punta a d esso. è giusto o sbaglio? |
|
|
|
|
|
|
#49 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
ecco per essere più chiari faccio un esempio di passaggio per riferimento in C++ Codice:
#include <stdio.h>
#include <stdlib.h>
void foo(int &number)
{
int anotherNumber = 4;
number = anotherNumber;
}
int main(int argc, char* argv[])
{
int number = 1;
foo(number);
printf("\n%d\n", number);
return EXIT_SUCCESS;
}
ora guardando in giro per internet, pare che il tipo di passaggio dei parametri usato da java per gli oggetti e da C per i puntatori si chiami per indirizzo. ma in realtà non è altro che un passaggio per valore (con il valore che è un indirizzo) |
|
|
|
|
|
|
#50 | ||
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Quote:
http://www.javaworld.com/javaworld/j...0526-pass.html http://www.yoda.arachsys.com/java/passing.html
__________________
|
||
|
|
|
|
|
#51 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
|
|
|
|
|
|
#52 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
ho usato la parola "concettualmente" apposta... e cmq non vedo perché ti debba scaldare |
|
|
|
|
|
|
#53 | |
|
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Quote:
Una curiosità (sì, lo so, basterebbe leggersi le specifiche del C++ ma... forse voi mi potete dare la risposta più velocemente): nemmeno in C++ credo che esista la variabile in grado di contenere un'oggetto... semplicemente, immagino che il passaggio per riferimento sia implementato come un passaggio doppiamente inderetto, cioè, mentre in Java ciò che viene passato è il riferimento ad un oggetto copiandone il valore nello stack della funzione chiamata (e ogni operazione su di esso, meno l'assegnamento, viene fatta dereferenziandolo, cioè in Java non esiste un'aritmetica dei puntatori), in C++ è possibile passare il riferimento al riferimento, cioè un puntatore all'area di memoria contenente il puntatore all'oggetto... in sostanza, l'indirizzo di (&) una variabile che è già un puntatore. Ho indovinato?
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN |
|
|
|
|
|
|
#54 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Dovrei scrivere un romanzo, ma vedo che mad_hhatter ha già scritto tutto
quello che avevo in mente, e si è pure beccato vari insulti al mio posto, quindi grazie Visto che parlate di specifiche, gosling e sua nonna in carriola, magari postate dei link risolutivi, non i soliti swap non funzionanti, che dimostrano solo che i riferimenti sono passati per valore (grazie, già lo sapevo!) Come detto molto prima, se per voi oggetto = riferimento allora avete ragione, per me l'oggetto è quello a cui il riferimento punta. Oppure diciamo che in java gli oggetti non esistono, è una posizione accettabile, ma allora tutto il modello di astrazione di java non ha più senso. A presto.
__________________
|Java Base| |
|
|
|
|
|
#55 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
ps. ti potrà sembrare una sottigliezza, ma non comprendere a fondo il meccanismo di passaggio dei parametri è fonte di innumerevoli errori pps. se sapevi che i riferimenti sono passati per valore allora sapevi anche che gli oggetti non sono passati per riferimento Ultima modifica di k0nt3 : 19-01-2008 alle 19:20. |
|
|
|
|
|
|
#56 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
per me puoi tenerti tutte le convinzioni che vuoi.. Ma come ho scritto prima in java esistono solo due tipi: i primitive type e i reference type. Ovviamente gli oggetti appartengono ai reference type dato che come ho riportato e come è spiegato molto chiaramente nei link che ho riportato in java non esiste alcuna variabile che contiene un oggetto.
__________________
|
|
|
|
|
|
|
#57 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
1) "oggetto" E' un reference type 2) "variabile" non contiene un oggetto implica: "variabile" non contiene un sottoinsieme di tutti i reference type domanda: come si usano i reference type che rappresentano oggetti se non sono nominabili tramite variabile? ovviamente da qualche parte il tuo discorso non quadra. Ora RIespongo il mio pensiero cercando di essere piu' formale e preciso di quanto sia stato in precedenza (visto che, rileggendomi, ho notato parecchie imprecisioni). Un reference type e' una variabile che contiene un riferimento, un link, un puntatore a un'entita' residente nello heap e che costituisce un oggetto, cioe' un'istanza di una classe. ATTENZIONE: "oggetto" e' diverso da "reference"! Ora, i parametri di un metodo possono essere reference type o primitive type, concentramoci sui reference type... concordiamo tutti sul fatto che un parametro in java e' passato solo per valore. MA, poiche' un reference type ha senso solo in quanto rappresentante dell'oggetto a cui esso fa riferimento, e' comune identificare (SOLO A LIVELLO CONCETTUALE, per semplicita' di ragionamento) il reference con l'oggetto. In questo senso diciamo (consci di commettere un abuso di notazione, e sempre parlando a livello di rappresentazione concettuale e a puro scopo semplificativo) che il fatto di passare per valore un reference EQUIVALE (nel senso che "e' come se... anche se tecnicamente non succede per davvero") a passare per riferimento l'oggetto a cui punta il reference passato. Ora, siccome il secondo dei link che hai postato per ultimi dice a un certo punto che in C (dove abbiamo appuranto che esiste solo il passaggio per valore) e' possibile simulare il passaggio per riferimento usando i puntatori (ma di fatto sto passando per valore il puntatore di qualcosa), non vedo perche' io debba essere accusato di dire stronzate quando dico che in java passare per valore il riferimento a un oggetto equivale concettualmente a passare l'oggetto per riferimento (sto persino usando gli stessi termini Piu' terra terra: un oggetto e' passato per riferimento perche' l'unica cosa che mi permette di operare su e con un oggetto e' il suo riferimento. Se non e' chiaro, la parola importante del mio discorso e' quel "concettualmente". Ultima modifica di mad_hhatter : 19-01-2008 alle 21:29. |
|
|
|
|
|
|
#58 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
|
|
|
|
|
|
|
#59 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
Nella versione java stai dicendo: "prendi il rimerimento number e fallo puntare a questo nuovo oggetto". ovviamente number e' una copia e il riferimento originario (quello del chiamante) non viene toccato. In C++: ti fai dare l'indirizzo di un'entita' e poi dici: all'entita' presente a quell'indirizzo fai assumere questo valore il che mi sembra assomigliare molto a quello che, in java, si fa partendo dal riferimento a un oggetto che contiene un dato membro e si cambia il valore di quest'ultimo. nota che ho detto assomigliare, non "essere esattamente la stessa cosa" |
|
|
|
|
|
|
#60 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
certo, in C++ sovrascrivi l'oggetto (o almeno questo e' quello che deduco dal tuo esempio), in java non puoi, ok. pero' in java, limitatamente agli oggetti, posso modificarne i membri emulando una sovrascrittura. di sicuro in java un oggetto non e' passato per valore, quindi io lo chiamo, per semplicita', passaggio per riferimento. sempre concettualemte e consapevole dell'imprecisione. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:01.












|








