|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2006
Messaggi: 1192
|
[JAVA] Passaggio di parametri per valore
Rieccomi con una nuova, entusiasmente domanda
![]() qualcuno mi spiega in soldoni cosa vuol dire che in java "i parametri vengono passati per valore"?? La prof non l'ha mai chiesto e sul libro c'è mezza riga, ma vorrei capirlo io per curiosità..non riesco proprio a focalizzare il concetto ![]() Grazie ![]()
__________________
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 ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
Le variabili associate a tipi primitivi sono passate a un metodo come valore.
Cioe' viene fatta una copia e questa e' passata al metodo. Modifiche al valore passato non influenzano la variabile nel codice che richiama il metodo. mentre con gli oggetti questo non succede, si chiama passaggio per riferimento ![]()
__________________
My gaming placement |
![]() |
![]() |
![]() |
#3 | ||
Senior Member
Iscritto dal: Aug 2006
Messaggi: 1192
|
Quote:
![]() Quote:
![]() e poi non mi torna con quello che c'è scritto nel mio libro (Concetti di informatica e fondamenti di Java, CAY HORTSMANN, pag 316), dove dice(non riporto tutta la pagina altrimenti ci metto una vita): "Nei manuali Java talvolta leggete che i numeri sono passati per valore e gli oggetti sono passati per riferimento. Tecnicamente ciò non è del tutto corretto, perché in Java sia i numeri sia i riferimenti a oggetto vengono passati per valore [qui fa un esempio e poi conclude dicendo:] Come potete vedere, un metodo Java può aggiornare lo stato di un oggetto, ma non può sostituire il contenuto di un riferimento a oggetto. Questo dimostra che, in Java, i riferimenti a oggetto vengono passati per valore" ![]() ![]()
__________________
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 ![]() |
||
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Tanto il nocciolo è questo. Quello che nel tuo libro si spiega, è che in Java, sia le primitive che gli oggetti sono passati per valore, cioè con operazione di copia del loro contenuto. Ma la differenza tra il fare una copia del contenuto di una variabile primitiva e il fare una copia del contenuto di una variabile riferimento (gli oggetti) è questa: 1) variabile primitiva --> prendo il suo contenuto e lo copio per passarlo al metodo chiamato es: Codice:
... int numero = 4; mioMetodo(numero); ... Viene passato "per valore": ma cos'è il valore di un int? il contenuto dell'int stesso, nel nostro esempio conterrà il valore 4. 2) variabile riferimento --> prendo il suo contenuto e lo copio per passarlo al metodo chiamato es: Codice:
... Oggetto mioOggetto = new Oggetto(); mioAltroMetodo(mioOggetto); ... Viene passato "per valore": ma cos'è il valore di un riferimento ad un oggetto? il contenuto del riferimento stesso, nel nostro esempio conterrà l'indirizzo in memoria in cui l'operatore "new" ha allocato l'oggetto istanziato. Per questa ragione, tecnicamente, in Java i passaggi di parametri a metodi sono tutti "per valore" Infatti i riferimenti, in Java, li puoi passare solo per valore: cioè puoi passare il valore di un riferimento, ovvero quello che esso contiene (un indirizzo in memoria) ma non puoi passare il riferimento "per riferimento", ovvero non puoi passare il suo stesso indirizzo (infatti anche un riferimento viene istanziato in memoria, da qualche parte, e contiene a sua volta come valore un altro indirizzo). In altri linguaggi invece (es C++) puoi passare sia per valore che per riferimento. Spero di non aver fatto troppo casino ![]() Ultima modifica di banryu79 : 09-01-2008 alle 09:57. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
in pratica passi il valore dell'oggetto....l'indirizzo.
prova a fare così: Codice:
public class TestingMain { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { Oggetto ogg=new Oggetto(3,4); System.out.println(ogg); } } class Oggetto{ private int x, y; Oggetto(int x, int y){ this.x=x; this.y=y; } }
__________________
My gaming placement |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Vero, primitivi e riferimenti sono passati per valore,
eppure non ho ancora trovato un argomento che mi convinca che gli oggetti non sono passati per riferimento... ![]() ![]()
__________________
|Java Base| |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
Quote:
![]()
__________________
My gaming placement |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Certo se definisci oggetto = riferimento allora è passato per valore,
se invece lo consideri (come me) qualcosa a cui il riferimento punta non vedo perché non sia passato per riferimento... Un po' contorto, eh?
__________________
|Java Base| |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Già, ma l'importante alla fine è capirsi
![]() |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Oct 2001
Città: Pd
Messaggi: 142
|
In Java tutto è passato per valore. Nulla è passato per riferimento. Passare per valore un oggetto vuol dire copiare l'indirizzo di memoria dell'oggetto e quindi l'oggetto di riferimento rimane invariato.
__________________
"La cosa più bella degli standard è che ce ne sono molti tra cui scegliere." Grace Hopper |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Le tue sono affermazioni assolutistiche che non spiegano/dimostrano/giustificano alcunché.
Magari supporta con qualche argomento l'affermazione "in Java tutto è passato per valore". Certamente se per "tutto" intendi primitivi e riferimenti hai ragione...
__________________
|Java Base| |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
da leggere interamente.
__________________
![]() |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Fossi matto
![]() fammi un riassuntino ![]()
__________________
|Java Base| |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Tentativo (non mi ricordo tutto il thread, però l'ho letto, eh!
![]() Codice:
public class PassaggioPerValore { private void faQualcosa() { String[] array = new String[] {"Array", "originale"}; // C'è una casella che si chiama "array", e "punta" ad un array di stringhe. faQualcosAltro(array); // La casella è sempre quella, non le è successo niente. System.out.println(array[0] + array[1]); // Altrimenti qui avrei ricevuto un'eccezione! } private void faQualcosAltro(String[] array) { // Qui arriva il valore del riferimento alla'array "array". // Un creato una nuova casella, che "punta" allo stesso oggetto array. array = null; // Adesso ho svuotato la nuova casella array. Quella vecchia non ne sa nulla. } } L'istruzione "array = null" avrebbe veramente distrutto l'oggetto originale, e il programma avrebbe dato un errore quando in seguito cercava di accedere al contenuto dell'oggetto stesso.
__________________
"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 |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Aug 2006
Messaggi: 1192
|
Ragazzi, vi voglio bene
![]() Dopo le mie ultime parole famose: Quote:
![]() Per fortuna avevo chiesto a voi, ho fatto anche la splendida riportando le due posizioni "opposte" e dimostrando che alla fine la conclusione è la stessa ![]() ![]() mi sono incartata un po' con un esempio ma vabbè, senza di voi avrei fatto una deliziosa scena muta ![]() Grazie grazie mille!! ![]()
__________________
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 ![]() |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Quote:
![]() Comunque questo non dipende dal fatto che array non è un vero riferimento, ma dal fatto che l'operatore di assegnamento in java agisce sul riferimento, in effetti l'assegnamento tra oggetti in java non esiste...
__________________
|Java Base| |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Volevo fare un disegno ma mi sono stufato.
![]() Questo non mi torna: per favore, spiegati.
__________________
"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 |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Volevo dire che "array = null;" invalida il riferimento, che a quel punto non
ha piu' alcun legame con l'oggetto originale, e quindi non capisco cosa c'entri col passaggio dell'oggetto.
__________________
|Java Base| |
![]() |
![]() |
![]() |
#19 |
Registered User
Iscritto dal: Sep 2002
Messaggi: 1025
|
veramente interessante. Letto di gusto.
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7253
|
beh se fosse stato un passaggio per riferimento avrebbe invalidato l'array anche fuori dalla funzione in cui c'è stato l'assegnamento. invece questo non si verifica (infatti l'array quando esce dalla funzione è tale e quale), quindi se ne deduce che il passaggio dei parametri non è mai per riferimento. ma al massimo può essere per copia del riferimento nel caso degli oggetti.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:04.