|
|
|
![]() |
|
Strumenti |
![]() |
#81 | ||
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
Quote:
![]() Quote:
voi dite: in java i tipi primitivi sono passati per valore mentre gli oggetti sono passati per riferimento (beh ad eccezione degli oggetti immutabili ecc..) mentre in realtà: in java tutto viene passato per valore quale ti sembra più semplice? ![]() |
||
![]() |
![]() |
![]() |
#82 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
e in ogni caso se uno programma in java e pretende che un reference SIA un oggetto non so cosa farci |
|
![]() |
![]() |
![]() |
#83 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
prima di uscire avevo scritto un post piuttosto esplicativo.. ma dato cheu nsimpatico fulmine ha deciso di far andare via la corrente e quel genio di mio fratello ha distrutto il gruppo di continuità si è perso tutto. Riassumendo in breve : non esite il termine "concettualmente" o "immaginando che". Le specifiche del linguaggio java sono ben chiare in proposito. una variabile, o un l-value se ti piace di + NON è un oggetto. E' il riferimento di un oggetto, che è cosa ben diversa. Quando tu passi un parametro ad un metodo passi per copia il suo riferimento. E tutto ciò è assolutamente lineare ed auto-esplicativo ed elimina ogni possibilità di errore. Quando tu dici che in java esiste il passaggio per copia dei primitivi e per riferimento dei reference type stai affermando qualcosa che è contrario alle specifiche del linguaggio. Infatti in java non è mai ammesso il passaggio per riferimento, ma avviene SEMPRE il passaggio per valore. Quindi il tutto è perfettamente semplice e lineare analizzato in quest'ottica. Per i primitive type il passaggio per valore implica il passaggio per copia del valore della variabile, nel caso dei reference type avviene sempre il passaggio per copia del valore del riferimento (che è il contenuto della variabile). Quindi non vedo perchè complicarsi la vita introducento un passaggio per riferimento "fittizio" che non è un vero passaggio per riferimento e che semplicemente, a quanto ci dicono le specifiche del linguaggio, non ha modo di essere e che, in alcuni casi, potrebbe indurre in errore.
__________________
![]() |
|
![]() |
![]() |
![]() |
#84 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Oltre ad essere una complicazione perchè introduce una disomogeneità nel modo (perfettamente omogeneo) con cui sono trattati i parametri in java, in realtà è anche sbagliato perchè in alcuni casi può portare a errori (come nell'esempio della funzione swap).
__________________
![]() |
|
![]() |
![]() |
![]() |
#85 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
Quote:
ma se tu mi dici che non stiamo parlando della realtà ok, non c'è problema. potrei pensare alle variabili come dromedari che contengono un certo valore di liquido nella gobba e questo valore è il contenuto della variabile. il passaggio dei dromedari avviene prendendo un dromedario nuovo e mettendoci nella gobba lo stesso valore di liquido del dromedario originario. ![]() ![]() |
|
![]() |
![]() |
![]() |
#86 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
per un principiante la seconda e' molto ambigua: lo puo' portare a pensare che un oggetto sia passato per valore. ma il punto e' che io non voglio DIRE che gli oggetti sono passati per riferimento, voglio solo poterlo PENSARE mentre ragiono tra me e me o mentre colloquio con qualcuno che conosce java permettendomi di mantenere impliciti alcuni dettagli NOTI. poi perche' una String o un array non dovrebbero avere lo stesso trattamento? sono passati per copia? assolutamente no, e' solo che ogni metodo della classe String, ad esempio, che abbia lo scopo di modificare una stringa in realta' ritorna un nuovo oggetto String, cosa che, assieme alla semantica dell'operatore = e al fatto che lavoro con reference e non con oggetti, fa si' che un oggetto String sia immutabile... a me pare straordinariamente semplice |
|
![]() |
![]() |
![]() |
#87 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
|
|
![]() |
![]() |
![]() |
#88 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
@mad_hhatter
beh senti nessuno ti vieta di pensare come ti pare, ma nel momento in cui ammetti che quello che pensi non corrisponde alla realtà non vedo perchè continuiamo a discuterne ![]() in breve: esiste il passaggio per riferimento in java? no posso pensare che esiste comunque? certo, esattamente come puoi pensare che le variabili siano dromedari |
![]() |
![]() |
![]() |
#89 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
dai, sul serio, queste prese per i fondelli mi fanno sorridere fino a un certo punto. ho detto e ripetuto che mi ponevo dal punto di vista dell'oggetto: avete continuato a puntualizzare che cio' che viene passato e' un reference. va bene, vorra' dire che poiche' le specifiche di un linguaggio sono quelle e' vietata qualsiasi rappresentazione informale a solo scopo semplificativo. va beh, prendo atto. concludendo: in java tutto e' passato per valore... ah no, scusate, non tutto: gli oggetti no, quelli non vengono passati (giustamente, tanto perche' non mi veniate a dire che che sono convinto che accada il contrario). ma allora non dovreste aver scritto, per precisione: in java _tutti i parametri_ sono passati per valore? ah, era implicito? eh, ma uno potrebe fraintendere... epilogo ![]() passaggio per riferimento: viene passato l'indirizzo del parametro. punto. detto questo, in java, volendo capire cosa implica il passaggio di un parametro a un metodo quando il parametro e' un reference type E volendo guardare la cosa dal punto di vista dell'oggetto rappresentato da tale reference, cioe' considerando come parametro l'oggetto piuttosto che il reference, a puro scopo speculativo (analisi lecita, spero, anche se quello che succede veramente coinvolge il reference e non l'oggetto, ma questo e' inessenziale ai fini dell'analisi che sto facendo), ho che al metodo viene passato il reference, cioe' il riferimento, cioe' l'indirizzo dell'oggetto, cioe' l'indirizzo di quella cosa che in questo contesto per me rappresenta il vero parametro (al di la' del fatto che, a rigore, questo sia impreciso). Toh, guarda... ho descritto, pur in termini puramete concettuali, quello che avviene nel passaggio per riferimento. Posso allora usare un'espressione colorita e imprecisa a puro scopo di concisione e brevita' discorsiva e dire che "e' come se passassi al metodo l'oggetto per riferimento"? NO, al massimo mi e' concesso chiamarlo passaggio per indirizzo... che altro non e' se non il riferimento all'oggetto, ma pare che chiamarlo passaggio per riferimento faccia incazzare gli inquilini dell'olimpo. Insomma, persino quando voglio esplicitamente essere impreciso devo usare delle sottigliezze lessicali... va beh bon, direi che le cose ce le siamo dette in tutte le salse, siamo ben trincerati nei nostri rispettivi sofismi lessicali pur condividendo che la sostanza, dal punto di vista del linguaggio, e' una sola. ottimo, direi che non c'e' altro da aggiungere, almeno da parte mia. |
|
![]() |
![]() |
![]() |
#90 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
I veri programmatori, quelli duri e puri, quelli che vogliono il massimo senza alcun compromesso, la loro scelta l'hanno già fatta da tempo. Non ci sono storie: non esiste nulla, ma veramente nulla di più potente del linguaggio macchina. Ovviamente è gente che ha letteralmente divorato tutti questi http://www.intel.com/products/processor/manuals/ manuali, e in particolare quello sulle ottimizzazioni: Intel® 64 and IA-32 Architectures Optimization Reference Manual. Un MUST: non ci si può definire veri programmatori senza averlo digerito. Poiché i veri programmatori ottimizzano il codice per qualunque processore esistente, altrettanto ovviamente si saranno divorati anche i manuali di AMD: http://developer.amd.com/documentati...s/default.aspx Anche qui è un MUST questo: Software Optimization Guide for AMD Athlon™ 64 and AMD Opteron™ Processors Inutile dire che i veri programmatori non usano nemmeno il notepad per generare gli eseguibili. Infatti aprono un prompt dei comandi, scrivono: copy con mycoolprogram.exe e digitano il codice di tutti i byte dell'eseguibile, uno dietro l'altro, utilizzando la famigerata combinazione Alt + tastierino numerico. ![]()
__________________
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 Ultima modifica di cdimauro : 20-01-2008 alle 07:33. |
|
![]() |
![]() |
![]() |
#91 | |||
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
Quote:
devi distinguere la fase di progettazione dalla fase di implementazione IMHO (che non sono necessariamente sequenziali comunque). quando progetto penso agli oggetti in maniera astratta, quando implemento penso a variabili, reference ecc.. altrimenti se continuassi a pensare in maniera astratta produrrei codice prono a errori, cosa da evitare assolutamente. il fatto che le variabili non contengono oggetti è una cosa che TUTTI i programmatori java devono sapere per poter essere definiti tali, quindi se dico che in java tutto viene passato per valore, dò una definizione che può essere interpretata in una sola maniera, cioè quella corretta. arrivando al tuo epilogo: Quote:
nel passaggio per riferimento L-value del parametro coincide con l'L-value della variabile passata come parametro e ho già spiegato che ciò non avviene MAI in java. Quote:
ti ripeto che non è una questione di sottigliezze lessicali, ma proprio di significato. il passaggio per riferimento è quello che puoi fare in C++ punto. quando mi dimostrerai che puoi fare la stessa cosa in java sono pronto a darti ragione. ps. perchè non potrei scrivere una cosa così altrimenti? Codice:
void foo(String string) { string = "I was passed by reference :P"; } Ultima modifica di k0nt3 : 20-01-2008 alle 10:04. |
|||
![]() |
![]() |
![]() |
#92 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Ma quali sarebbero questi errori dovuti al nostro
scandaloso modo di pensare? Certo, tutti possono pensarla come vogliono, ma siete voi che considerate eretico chi dice che "un oggetto viene passato per riferimento". Se nelle specifiche non c'è scritto che gli oggetti sono passati per riferimento non significa che nella realtà dei fatti non accada proprio questo. Ringrazio sempre mad_hhatter che sta tenendo duro in mia assenza.
__________________
|Java Base| |
![]() |
![]() |
![]() |
#93 | ||
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
Quote:
allontanandoci un attimo dal passaggio dei parametri (di cui sono già stati fatti almeno due esempi di possibile errore), un'altro errore potrebbe essere il seguente: Codice:
import java.util.ArrayList; public class Prova { private ArrayList<Integer> rep; public static void main(String[] args) { Prova prova = new Prova(); prova.addNumber(new Integer(1)); prova.addNumber(new Integer(5)); prova.addNumber(new Integer(3)); ArrayList<Integer> numbers = prova.getRep(); numbers.add(new Integer(1)); System.out.println(prova.getRep().toString()); } public Prova() { this.rep = new ArrayList<Integer>(); } public ArrayList<Integer> getRep() { return this.rep; } public void addNumber(Integer number) { if(!this.rep.contains(number)) this.rep.add(number); } public void removeNumber(Integer number) { this.rep.remove(number); } } in pratica questo esempio vi potrà sembrare scemo, ma in situazioni più complesse è di cruciale importanza evitare questi comportamenti. Quote:
le specifiche dicono molto di più, e cioè che _nella realtà dei fatti_ tutto viene passato per valore. ripeto per l'ennesima volta che il concetto di passaggio per riferimento non l'ho inventato io, al contrario ha una definizione universalmente accettata ben precisa che non è quella di passare per valore un riferimento. quella è un'altra cosa, se volete dategli un altro nome (passaggio per indirizzo ad esempio), ma sappiate che sempre di passaggio per valore di parla. C++ e C# per esempio hanno il passaggio per riferimento e infatti si comportano in maniera diversa rispetto a java Ultima modifica di k0nt3 : 20-01-2008 alle 12:28. |
||
![]() |
![]() |
![]() |
#94 | ||||||
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Quote:
Poi vi potete fare tutte le rappresentazioni mentali che volete, nessuno ve lo vieta. Ma, quantomeno non venite a scrivere su un forum pubblico cose del genere: Quote:
Quote:
Quote:
Quote:
Se poi volete addirittura confutare le specifiche del linguaggio allora create voi un vostro linguaggio e scrivete le specifiche come meglio vi aggrada.
__________________
![]() |
||||||
![]() |
![]() |
![]() |
#95 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
temo di non capire cosa volesse dimostrare quell'esempio. comunque, visto che evidentemente sono stupido e non capisco, mi spieghi tecnicamente e passo passo cosa succede a livello di stack quando faccio un passaggio per riferimento e quando uso il passaggio per valore di un reference type? cosi' vedo finalmente dove sbaglio. a tal proposito, citando per l'ennesima volta dal link di ^TiGeRShArK^, http://www.yoda.arachsys.com/java/passing.html: "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." saro' anche idiota, ma quando dico: "passaggio per riferimento: viene passato l'indirizzo del parametro." non penso di sbagliare... qualcosa viene passato al metodo e quel qualcosa non e' certo il valore del parametro... e allora cosa? se non ne passo l'indirizzo, mi dici cosa usa sto benedetto processore per andare a modificare il parametro? Ultima modifica di mad_hhatter : 20-01-2008 alle 22:15. |
|
![]() |
![]() |
![]() |
#96 | |
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Quote:
__________________
"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 |
|
![]() |
![]() |
![]() |
#97 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
|
|
![]() |
![]() |
![]() |
#98 | ||
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
Quote:
Quote:
l'L-value del parametro è lo stesso della variabile che passi come parametro, cioè le due variabili sono la stessa variabile (hanno lo stesso indirizzo). nel caso di java hanno lo stesso contenuto, ma non lo stesso indirizzo, perciò non è passaggio per riferimento. |
||
![]() |
![]() |
![]() |
#99 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
leggi la mia risposta al suo post
Quote:
|
|
![]() |
![]() |
![]() |
#100 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
Quote:
nel passaggio per riferimento il parametro è la variabile che passi come parametro. sono proprio la stessa area di memoria, stesso L-value. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:18.