|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#101 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
e, esattamente come hai detto tu, quando considero il passaggio "concettuale" di un oggetto ottengo che il metodo lavora con lo stesso oggetto puntato dal reference passato come parametro. guarda un po', proprio come da te descritto a proposito del passaggio per riferimento se mi spiegassi cosa accade sullo stack forse ci capiremmo una volta per tutte Ultima modifica di mad_hhatter : 20-01-2008 alle 23:47. |
|
|
|
|
|
|
#102 | ||
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
il suo post è chiaro. come è evidente dal metodo addNumber nell'ArrayList non dovrebbero esserci elementi duplicati, ma a causa del fatto che considero le cose a livello di oggetti astratti non mi rendo conto che restituendo l'oggetto "rep" espongo la rappresentazione dell'oggetto "prova". e come conseguenza posso inserire elementi duplicati in prova.
uno che pensa in termini di riferimenti non avrebbe mai scritto una porcheria simile. Quote:
Quote:
il compilatore gestirà in maniera opportuna questa cosa.. l'importante è che il parametro abbia lo stesso L-value della variabile che passi come parametro. se è così stiamo parlando di passaggio per riferimento. il "passaggio concettuale" degli oggetti l'hai inventato tu, perciò non so cosa dirti. l'unica cosa certa è che non si tratta di passaggio di parametri per riferimento, perchè quello non l'hai inventato te ed ha una definizione ben precisa |
||
|
|
|
|
|
#103 | |||
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
in ogni caso rep NON e' la rappresentazione di prova: prova contiene un arrayList, rep e' un arrayList... ti sembra la stessa cosa? anche ragionando in termini astratti sono 2 oggetti completamente diversi che espongono 2 comportamenti assolutamente diversi. Quote:
Quote:
e' proprio cercando di analizzare cosa avviene sullo stack che mi porta a discutere del fatto che e' come se l'oggetto venisse passato per riferimento! avanti, ancora una volta... dal solito link: "reference The L-value of the formal parameter is set to the L-value of the actual parameter. In other words, the address of the formal parameter is the same as the address of the actual parameter. Any modifications to the formal parameter also immediately affect the actual parameter. FORTRAN only has reference mode (expressions are evaluated and stored in a temporary location in order to obtain an L-value). C++ has reference parameters by putting a & before the formal parameter name in the function header. Reference mode can be simulated in C using pointers and adding the & to the actual parameter and dereferencing the formal parameter within the function." toh guarda, anche quel link super rigoroso adotta un'espressione che suona come un "e' come se"... la consideri un'imperdonabile fonte di fraintendimenti ed errori anche quella? ma quello che mi preme e': se considero per un momento l'oggetto, non la variabile, come parametro ho proprio che copiando il valore del reference type si ha la situazione in cui "the address of the formal parameter is the same as the address of the actual parameter" dove, ripeto, parameter qui indico (io, volutamente, cosciente del fatto che tecnicamente cio' non corrisponde a quello che realmente viene passato) l'oggetto, non la variabile. neghi che cio' sia vero? in alternativa rispondi a questa domanda: sia b un oggetto, di tipo B, rappresentato dal riferimento rb e sia f(B p) un metodo. dei tipi di passaggio di parametri elencati al solito link, quale descrive la relazione tra p e b quando invoco f(rb)? Ultima modifica di mad_hhatter : 21-01-2008 alle 00:34. |
|||
|
|
|
|
|
#104 | ||
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
potresti definire il passaggio di oggetti, ma di sicuro se parliamo di passaggio di parametri (e in questo thread è quello che stiamo facendo) stiamo parlando di variabili e quindi non di oggetti (nel caso di java). Quote:
per rispondere all'ultima tua domanda: immagino che è sottointeso che parliamo di java, quindi senza ombra di dubbio passaggio per valore. |
||
|
|
|
|
|
#105 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
sia b un oggetto, di tipo B, rappresentato dal riferimento rb e sia f(B p) un metodo. dei tipi di passaggio di parametri elencati al solito link, quale descrive la relazione tra l'oggetto rappresentato da p e l'oggetto b quando invoco f(rb)? certo simulare non significa essere, appunto per questo ho sempre aggiunto le espressioni "e' come se", "concettualmente", "abuso di notazione", "ragionamento astratto". non sto analizzando cosa e' in java, sto analizzando come si puo' concettualizzare (a puro scopo di analisi) in maniera alternativa un aspetto molto particolare e circoscritto. resto in attesa della dimostrazione che ragionare in termini di riferimenti impedisce errori come quello descritto nell'esempio visto in precedenza (posto che si possa parlare di errore visto che si sono usati due oggetti completamenti diversi di proposito) PS: @lovaz: sono quasi allo stremo delle forze Ultima modifica di mad_hhatter : 21-01-2008 alle 01:05. |
|
|
|
|
|
|
#106 | ||
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
Quote:
infatti il passaggio dei parametri usato da java per gli oggetti non è come se fosse per riferimento, altrimenti potresti fare le cose che fai in C++ (vedi esempi nelle pagine precedenti). e non è nemmeno concettualmente la stessa cosa visto che si parla di riferimenti passati per valore mentre tu dici che gli oggetti sono passati per riferimento. è proprio un concetto diverso e non sei l'unico tiger help meeeeee!!
|
||
|
|
|
|
|
#107 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
6 pagine per discutere sul passaggio di parametri in Java?
E' per valore. E' scritto nelle specifiche. E' così che lavora il compilatore. Fine della questione.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#108 | ||
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
è da tempo immemore che sto cercando di farglielo capire... e il bello è che mi sono dovuto anche smazzare le specifiche per quotare il punto esatto dove veniva enunciato dato che ancora questi insistono che nelle specifiche non è scritto in nessun posto.. E dopo averlo riportato quanti hai visto che hanno quotato il mio messaggio? NESSUNO. Continuano ad interpretare MALE quanto scritto nei due link che avevo postato precedentemente senza cercare di capirne le parole nell'ottica di quanto scritto nelle specifiche, ovvero: Quote:
Tradotto in italiano, nel caso fosse questa la difficoltà, le specifiche dicono chiaramente che: Per ogni parametro dichiarato nella signature di un metodo, viene creata una variabile a seguito di ogni invocazione. La nuova variabile è quindi inizializzata con il corrispondente valore ricevuto dall'invocazione del metodo (viene effettuata una copia N.D.T.). Il parametro del metodo cessa definitivamente di esistere alla conclusione del esecuzione del corpo del metodo. Quindi il passaggio per riferimento non esiste, ma, al massimo, solo ed esclusivamente per i reference type, esiste il passaggio per copia del riferimento, che è cosa semanticamente differente. E dopo questo spero sia chiaro perchè, sinceramente, meglio delle specifiche del linguaggio Java non lo so spiegare.
__________________
|
||
|
|
|
|
|
#109 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Chiarissimo e d'accordissimo. Anzi, per me è a dir poco lapalissiano. Spero che la cosa finisca qui, perché, davvero non ha proprio senso continuare.
Sui reference... beh... sono valori. Le variabili definite con tipi "standard" contengono dati "standard"? Va benissimo. Sono valori / dati. Le variabili definite come istanze contengo l'indirizzo dell'area di memoria allocata per l'oggetto. E' un dato? Sì. Va benissimo anche questo. Sono valori / dati. In entrambi i casi, quando vengono passate come parametri, cosa si fa? Una COPIA del valore. Che corrisponde al dato "standard" nel primo caso, e all'indirizzo dell'area di memoria nel secondo caso. Ma sempre una COPIA DEL VALORE CONTENUTO NELLA VARIABILE è! A meno che non si debba considerazione come "valore" un indirizzo di memoria, ma a questo punto vorrei capire la differenza fra copiare i 4 byte di un intero a 32 bit e copiare i 4 byte di un indirizzo di memoria (su macchine a 32 bit) quando un oggetto "reference" viene passato come parametro. Vorrei capirlo perché, se non è così, credo di avere evidenti difficoltà cognitive, e ho bisogno di essere illuminato.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#110 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
@^TiGeRShArK^
io non ho bisogno di quotare le tue citazioni dalle specifiche del ling java: so benissimo che in java il passaggio dei parametri è esclusivamente per valore, come ho più volte puntualizzato nei miei post. se non è ancora chiaro qual è il punto di vista da cui sto considerando la faccenda non so cosa farci, làho già ripetuto fino alla nausea. se non è ancora chiaro non sto tentando di dare una nuova definizione di cose già perfettamente definite, sto soltanto facendo delle considerazioni. se tu a queste considerazioni mi rispondi con le spec sulle quali siamo già tutti in accordo non so cosa ti aspetti che ti risponda @cdimauro non sto discutendo delle specifice, sto facendo un'analisi sull'implicazione di tali specifiche quando si consideri non il reference type ma l'oggetto da esso rappresentato. @tutti comincio a chiedermi a che pro continuare a discutere visto che proseguiamo su 2 binari che non sembrano avere possibilità di incontrarsi |
|
|
|
|
|
#111 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Ok...
allora quando parliamo di qualcosa è inutle appellarsi alle specifiche... E' un pò come dire........ dissertare sulla caduta dei gravi senza considerare la forza di gravità. Se noi usiamo uno strumento, mi pare il minimo attenersi alle specifiche di quello strumento quando si fa una discussione, altrimenti tutti potrebbero iniziare a dire cose senza senso. Stai facendo praticametne lo stesso discorso dell'Intelligent Design quando non consideri le specifiche. Poichè ottieni quel risultato allora *potrebbe essere che*, *concettualmente avviene* e cose del genere. Ma quelle sono solo rappresentazioni ipotetiche del problema che non hanno alcuna attinenza con la realtà. Esattamente come la teoria del Flying Spaghetti Monster che ha la stessa valenza dell'Intelligent Design. La realtà è una: In java esiste solo ed esclusivametne il passaggio per valore. Poi tu e lovaz potete pensarla come volete, siete liberissimi di farlo. Basta che non scrivete il vostro personale pensiero su un forum pretendendo che vi sia dato credito maggiore rispetto alle specifiche del linguaggio java, che, a quanto ne so, non avete scritto voi.
__________________
|
|
|
|
|
|
#112 | ||
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
Quote:
non ho scritto io le specifiche: ovvio. Ma posso analizzarle secondo un dato punto di vista a scolo scopo d'indagine o le specifiche vanno prese come itestimoni di Geova prendono la Bibbia? OT: nelle scienze fisiche e naturali si usano spesso modelli concettuali che non hanno realtà sostanziale (si veda la teoria corpuscolare/ondulatoria della luce, il concetto di momento di una forza, tanto per citarne un paio)... questi modelli non descrivono la realtà, aiutano a comprenderla, a concepirla. Perché è tanto scadaloso fare la stessa cosa con un linguaggio di programmazione e neanche con lo scopo di descrivere un aspetto di tale linguaggio, ma soltanto al fine di discorrerne in maniera informale? |
||
|
|
|
|
|
#113 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Dal leggere la discussione mi sembra che tu abbia fatto un'affermazione rivelatasi scorretta e/o imprecisa e invece di ammetterlo candidamente tu stia cercando di giustificarla in qualche modo, arrampicandoti sugli specchi. Java passa tutti i parametri per valore. Fine della questione.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#114 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
non ho forse sempre insistito sul fatto che consideravo l'oggetto, non il reference type ad esso corrispondente? non ho forse insistito sul fatto che era, la mia, una dissertazione concettuale? ho forse mai messo in discussione le specifiche? è probabile che nei primi post abbia peccato di imprecisione, ma mi pare di essermi sbrigato a chiarire... se questo è arrampicarsi sugli specchi. ti ringrazio per la scarsa onestà intellettuale che mi attribuisci. |
|
|
|
|
|
|
#115 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Ti capisco...
Visto che ognuno è arroccato sulle sue posizioni io mi ritiro, ho altro da fare in questo periodo, queste discussioni portano via un sacco di tempo ed energie nervose. Ma voi continuate pure se volete, eh... @tiger et altri: Ho letto quel pezzo delle specifiche, non contrasta con quanto ho detto io fin dall'inizio, ma comunque non ti convincerò mai, quindi... Il fatto dell'aliasing appare chiarissimo praticamente a tutti, in vari libri/tutorial/corsi viene chiarito che un riferimento punta a un oggetto e che questo riferimento viene copiato all'interno del metodo, e che questa copia scompare all'uscita, quindi chi fa questi errori o lo fa per distrazione, o perche' non ha capito questo... Le altre affermazioni tipo "è così e basta" non le commento neanche. Fine delle trasmissioni.
__________________
|Java Base| |
|
|
|
|
|
#116 | |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
Quote:
Premettendo che sono del partito "JAVA passa parametri per valore" e che il post http://www.hwupgrade.it/forum/showpo...9&postcount=47 non poteva spiegarlo meglio provo a fare capire perchè tutto ciò è vero: Creo un oggetto: Codice:
Object x=new Object(); x.a=5; //supponiamo che a e b esistano e siano interi x.b=6; // Ora creo il metodo e per parametro gli passo oggetto Codice:
void metodo_cambia_a_b(Object obj){
obj.a= 100;
obj.b= 200;
}
Codice:
metodo_cambia_a_b(x); Codice:
System.out.println(x.a); System.out.println(x.b); Questo è un passaggio per riferimento? NO! x punta e punterà sempre all'indirizzo MILLEMILA e non c'è metodo che possa fare la magia! ERGO: JAVA non ha il passaggio per riferimento nemmeno concettualmente! |
|
|
|
|
|
|
#117 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
e non è nemmeno "come se fosse" perchè ti ho già fatto degli esempi in C++ che non è possibile riprodurre in java semplicemente perchè C++ ha il passaggio per riferimento, mentre java no. nessuno ti impedisce di inventare tutte le definizioni che vuoi, ma non puoi ridefinire il concetto di passaggio per riferimento come ti pare, perchè quello è già stato definito ed è universalmente accettato. se proprio chiamalo passaggio per indirizzo come ho letto in qualche articolo su internet, ecco questo lo posso anche accettare perchè non crea confusione con il passaggio per riferimento che è tutta un'altra cosa. anche se poi bisogna ricordarsi che il passaggio per indirizzo non è altro che il passaggio per valore di un indirizzo. |
|
|
|
|
|
|
#118 | |
|
Member
Iscritto dal: Jan 2008
Messaggi: 111
|
Quote:
L-valore contiene l'indirizzo di RAM dove si trova (in realtà, inizia...) l'R-valore R-valore contiene il valore "vero e proprio" della variabile Ora, in JAVA: - le variabili di tipo primitivo hanno nell'R-valore il "valore" della variabile; - le variabili di tipo oggetto hanno nell'R-valore l'indirizzo della prima parola in RAM dell'area di memoria che contiene i bit che rappresentano l'oggetto; - l'L-valore di una variabile non è MAI ACCESSIBILE al programmatore; - è accessibile R-valore di una variabile di tipo oggetto (e questo int rappresenta effettivamente un indirizzo di memoria) Quando si dice che in JAVA tutti i parametri sono passati per valore, si intende che: - per variabili di tipo primitivo, è effettuata la COPIA del valore effettivo (quindi, l'R-valore); - per variabili di tipo oggetto, è effettuata la COPIA dell'indirizzo della prima parola in RAM dell'area di memoria che contiene i bit che rappresentano l'oggetto (quindi, ancora l'R-valore) Ora, cara blue_blue, ti dovrei tirare le orecchie... perché queste cose potevi chiederle al TJ ... |
|
|
|
|
|
|
#119 |
|
Senior Member
Iscritto dal: Aug 2006
Messaggi: 1192
|
primesinp, hai pm
__________________
blue_blue: nickname proprio di persona, femminile, singolare "Wait, before you close the curtain/There’s still another game to play/And life is beautiful that way"(Beautiful that way, Noa & Nicola Piovani) Fiore, sei un mito
|
|
|
|
|
|
#120 |
|
Junior Member
Iscritto dal: Jun 2008
Messaggi: 1
|
Ciao a tutti.
La lettura di questi thread e dei i link segnalati è stata molto interessante. Lo riapro perchè mi è venuto un dubbio: public class Main { public static void main(String[] args) { Integer a = 0; Integer[] riferimento =new Integer[1]; riferimento[0] = a; prova(riferimento); System.out.println(riferimento[0]); } private static void prova(Integer[] riferimento) { riferimento[0] = 1; } } Questo codice simula un passaggio per riferimento. La modifica dell'array all'interno del metodo prova è visibile all'esterno, cioè nel main. Perchè? Saluti |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:43.












|








