Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
07/01/11 14:51
f.l.c.r
Sto leggendo il manuale reperito sul sito mokabyte (consigliato da netarrow nel topic principale).

Spero di poter postare un pezzo di tale manuale, in quanto non ne sono pienamente daccordo, spero di non sbagliarmi.
Se cosi non fosse, vi prego di correggermi :pat:

"Al contrario di quanto avviene con le variabili dei tipi primitivi (int, long ecc.), quando si passa a un metodo un array (o qualsiasi altro oggetto), esso viene passato “by ref”, o “per riferimento”: in altre parole, il parametro formale i presente nel metodo non punta a una copia dell’array definito nel metodo
main, ma punta allo stesso identico array, e qualsiasi modifica effettuata su di esso all’interno del
metodo andrà ad agire sull’array stesso."

Leggendo altre fonti s Java, ho sempre trovato documentato che in Java tutti i passaggi avvengono per copia.
Se si verifica un comportamento simile al passaggio per riferimento, è dovuto esclusivamente al fatto che viene copiato il ref, e che appunto viene copiato, e non passato per riferimento.

Ovviament, come descritto, tutte le modifiche effettuate all'oggetto passato come paramentro al metodo, ricadono anche sull'oggetto stesso, perchè, avendo lo stesso riferimeno, puntano allo stesso oggetto.

Spesso di essere stato chiaro nella mia concisa, ma "irruenta" opinione.
aaa
07/01/11 15:36
a_butta
Guarda... interessantissima questione anche se di soluzione altrettanto rapida.
Non so di preciso per il Java, ma sono certissimo (perchè l'ho usato in uno script per il mio sito) che in JavaScript avviene esattamente così: non esistono passaggi per riferimento per quanto riguarda variabili "basilari", ma un array viene SEMPRE passato per riferimento.

Hai provato a costruire un banalissimo esempio per vedere chi ha ragione, se la guida o la tua idea? :D

qualcosa del genere (non mi intendo di Java, conosco a malapena la sintassi, quindi chiedo scusa per qualche errore grossolano):
class main {
function prova(int[] i) {
  i[0] += 3;
}

function main() {
  int[] i;  
  i[0] = 2;
  prova(i);
  System.Out.PrintLn(i[0]);
}
}



Ripeto: la sintassi o la struttura potrebbe presentare errori :d
Ultima modifica effettuata da a_butta 07/01/11 15:38
aaa
07/01/11 16:35
f.l.c.r
Si, ho provato.

Sostanzialmente java non ha le funtion, ma in questo caso, credo ce si possa banalmente sostituire con un metodo.

Java ha come costrutti base Classi che contengono attributi e metodi.

quando chiami un metodo e passi un argomento a tale metodo, viene effettuata una copia del valore della variabile passata come parametro attuale.

In java tutte le strutture dati complesse dovebbero essere trattate come oggetti, quindi array sono oggetti, stringhe sono oggetti e via dicendo.

Dichiarando un array:

int array[]; si dichiara una variabile che contiene un riferimento ad un area di memoria allocata nello heap, dove è presente l'oggetto vero e proprio.

Praticamente, lasciando così la dichiarazione si dichiara un ref (o riferimento) a null, perchè l'oggetto non è stato ancora creato o instanziato.

con l'istruzione:

new int[10] si invoca il costruttore che alloca l'oggetto in memoria e restituisce l'indirizzo che si riferisce a tale area di memoria alla variabile array.

Quindi quando lavori su array e li passi come parametri di metodi, non fai altro che passare il ref, che poi dovebbe essere l'indirizzo di memoria di quell'oggetto.


E "facendo funzionare" quel metodo, ora si che si modifica direttamente l'oggetto, ma perchè ciò che si è passato referenzia direttamente a quella particolare area di memoria.

In pratica è avvenuta una copia di un riferimento.

è per questo che secondo me avviene tutto per copia.

Purtroppo non conosco bene gli altri linguaggi, a parte pascal e qualcosa di C, dove so che si può specificare se passare per copia(valore) o per riferimento.
In java non si può specificare, perciò tutto avviene per copia.

Questo è, in sostanza, il succo del mio ragionamento, se c'è qualcosa che non va fatemelo sapere subito che tiro de testate alla scrivania :heehee::heehee::heehee:

Spero a_butta di averti aperto leggermente la visione su Java. è un bel linguaggio.
aaa
07/01/11 18:32
TheKaneB
Anche in C avviene tutto per copia.

Dal punto di vista concettuale, il processore lavora "sempre per copia".
Però siccome in Java non esiste il concetto di "puntatore", allora la copia del puntatore non è esplicita e si parla tecnicamente (e correttamente) di riferimento.

Se il Java avesse i puntatori, allora sarebbero tutti passaggi per copia, ma siccome i puntatori in Java sono impliciti, è corretto (e necessario) distinguere tra passaggi per copia e per riferimento.
aaa
07/01/11 19:16
f.l.c.r
Ora è tutto molto più chiaro. :hail:

Grazie
aaa
29/09/15 17:07
pb
Ciao una strategia per simulare il passaggio per riferimento è quella di passare come parametro class[], ovvero un vettore di oggetti del genere classe di interesse ( se serve un solo parametro si inizializza ad uno questo vettore ) . Internamete al metodo si effettueranno i cambiamenti all'oggetto registrato nella prima posizione del vettore, in questo modo non saranno persi, esternamente sarà sufficiente prendere il primo elemento di class[] !
aaa
29/09/15 17:34
pierotofy
pb, questo è un topic del 2011... solitamente nel forum non rispondiamo a domande di diversi anni fa (a meno che non siano prive di risposte). :ot:
Il mio blog: piero.dev