Pagina Iniziale | Preferiti Comunity: Login | Registrati | Newsletter | Forum | Concorsi Newsgroup
Canali: Hardware | Software | Files | Webmaster | Cellulari | Shop | Guadagna con i tuoi acquisti     
Nel sito: News | Articoli | Files | Manuali | Consigli PC | Schede cellulari | Programmaz. | Hosting | Motori Ricerca | Glossario | Link
Servizi: Shopping | Forum | Crea un BLOG | Cartucce Compatibili | Hosting Aruba | Tool News |   Sponsor: Automazione Industriale
  Articoli

Recensioni
Consigli per PC


  News e files

Software
Telefonia
Internet
Tecnologia
Files e Download


  Manualistica

Guide HW/SW
Scripts ASP
Scripts HTML
Scripts Java
Scripts Delphi
Glossario


  Shopping

Hardware
Software e Giochi
Elettronica
Cinema e Film
Console e Accessori
Prodotti Ufficio
Formazione e Corsi

Tieniti aggiornato sul mondo della tecnologia con la nostra newsletter!
La tecnologia sulla tua
casella e-mail

[Info Newsletter]


Concessionaria Pubblicitaria


<< News Precedente [Fine Pagina] News Successiva >>
Il linguaggio Java: lez.4

Un articolo di: Alberto Zilli del 03/12/2002      Letture: 8777
Vai alla pagina:
 3 - Unità didattica 3.3)


  Buono sconto 4% su Toner e Cartucce agli utenti AZpoint. SU Iomiricarico.it!!

- Tipi di dati non primitivi: reference

Abbiamo già visto come istanziare oggetti da una certa classe. Dobbiamo prima dichiarare un oggetto di tale classe con una sintassi di questo tipo:

    NomeClasse nomeOggetto;

per poi istanziarlo utilizzando la parola chiave new. Dichiarare un oggetto quindi è del tutto simile a dichiarare un tipo di dato primitivo. Il "nome" che diamo ad un oggetto è detto "reference". Infatti, non si sta parlando di una variabile tradizionale bensì di un puntatore. Possiamo definire un puntatore come una variabile che contiene un indirizzo in memoria. C’è una sottile e potente differenza tra la dichiarazione di un tipo di dato primitivo ed uno non primitivo. Consideriamo ora un esempio, partendo dalla definizione di una classe che astrae in maniera banale il concetto di data.

class Data

{

    int giorno;

    int mese;

    int anno;

}

Data sarà quindi un tipo di dato non primitivo (astratto) per il nostro esempio. Come tipo di dato primitivo consideriamo un double. Consideriamo le seguenti righe di codice, supponendo che si trovino all’interno di un metodo main di un’altra classe:

    double unNumero=5.0;

    Data unGiorno=new Data();

Graficamente potremmo immaginare la situazione in memoria con questo tipo di schematizzazione:

 

La differenza pratica tra un reference ed una variabile, è evidente nelle assegnazioni. Consideriamo il seguente frammento di codice:

    double unNumero=5.0;

    double unAltroNumero=unNumero;

    Data unGiorno=new Data();

    Data unAltroGiorno=unGiorno;

La variabile unAltroNumero, assumerà lo stesso valore della variabile unNumero, ma, le due variabili, rimarranno indipendenti l’una dall’altra. Infatti, il valore della variabile unNumero, sarà copiato nella variabile unAltroNumero. Se il valore di una delle due variabili sarà successivamente modificato, l’altra variabile non apporterà modifiche al proprio valore.

Invece, il reference unAltroGiorno, semplicemente assumerà il valore (cioè l’indirizzo) del reference unGiorno. Ciò significa che unAltroGiorno punterà allo stesso oggetto cui punta unGiorno. Ecco la situazione rappresentata graficamente:

Quindi, se successivamente sarà apportata una qualche modifica tramite uno dei due reference all’oggetto comune, ovviamente questa sarà verificabile anche tramite l’altro reference. Per intenderci:

    unGiorno.anno

è sicuramente equivalente a:

    unAltroGiorno.anno

 - Passaggio di parametri per valore

Come abbiamo già accennato nel precedente capitolo il passaggio di parametri in Java avviene sempre per valore. Ciò significa che quando viene invocato un metodo che come parametro prende in input una variabile, al metodo stesso viene passato solo il valore (una copia) della variabile, che quindi rimane immutata anche dopo l'esecuzione del metodo. Per esempio consideriamo la classe:

    class CiProvo

        {

        public void cambiaValore(int valore)

        {

            valore = 1000;

        }

        }

il seguente frammento di codice:

    CiProvo ogg = new CiProvo();

    int numero = 10;

    ogg.cambiaValore(numero);

    System.out.println(“il valore del numero è ” + numero);

produrrà il seguente output:

    il valore del numero è 10

Infatti il parametro valore del metodo cambiaValore(), nel momento in cui è stato eseguito il metodo, non coincideva con la variabile numero, bensì immagazzinava solo la copia del suo valore (10). Quindi ovviamente la variabile numero non è stata modificata.

Stesso discorso vale per i tipi reference: viene sempre passato il valore del reference, ovvero, l'indirizzo in memoria. Per esempio consideriamo la seguente classe:

    class CiProvoConIReference

        {

        public void cambiaReference(Data data)

        {

        data = new Data(); // Un oggetto appena istanziato

        // ha le variabili con valori nulli

        }

        }

il seguente frammento di codice:

    CiProvoConIReference ogg = new CiProvoConIReference();

    Data dataDiNascita = new Data();

    dataDiNascita.giorno = 26;

    dataDiNascita.mese = 1;

    dataDiNascita.anno = 1974;

    ogg.cambiaReference(dataDiNascita);

    System.out.println(“Data di nascita = ” + dataDiNascita.giorno

+ “-”+ dataDiNascita.mese + “-” +dataDiNascita.anno );

produrrà il seguente output:

    Data di nascita = 26-1-1974

Quindi valgono le stesse regole anche per i reference.

N.B.: Attenzione che se il metodo cambiaReference() avesse cambiato i valori delle variabili d'istanza dell'oggetto avremmo avuto un output differente. Riscriviamo il metodo in questione:

    public void cambiaReference(Data data)

    {

        data.giorno=29; // data punta allo stesso indirizzo

        data.mese=7 // della variabile dataDiNascita

    }

Il fatto che il passaggio avvenga sempre per valore, garantisce che un oggetto possa essere modificato, e contemporaneamente, si è certi che dopo la chiamata del metodo il reference punti sempre allo stesso oggetto.

N.B.: altri linguaggi come il C, permettono anche il passaggio di parametri “per riferimento”. In quel caso al metodo viene passato l'intero riferimento, non solo il suo indirizzo, con la conseguente possibilità di poter mutarne l'indirizzamento. Java ha scelto ancora una volta la strada della robustezza e della semplicità, favorendola alla potenza del linguaggio.

Vai alla pagina:

Elenco delle pagine di "Il linguaggio Java: lez.4"

Obbiettivi e Unità Didattica 3.1) - Pagina 1
Unità didattica 3.2) - Pagina 2
Unità didattica 3.3) - Pagina 3
Unità didattica 3.4) - Pagina 4
Unità didattica 3.5) - Pagina 5
Unità didattica 3.6) - Pagina 6



[Indietro]    [Su]      [Home]      [Commenti]      [V. Stampabile]

Commento di Anonimo, scritto il 02/09/2004 alle 15:45:01
Peccato che le immagini non si vedano e che il testo del codice sorgente sia formattato malamente, comunque grazie mille per il contenuto che mi ha splendidamente chiarito un errore concettuale che facevo. Complimenti e grazie ancora fabio.

Commento di Anonimo, scritto il 01/12/2004 alle 12:25:30
mmmmm

Commento di Anonimo, scritto il 01/12/2004 alle 12:27:00
hghjj

Commento di Anonimo (ip: 81.208.106.71), scritto il 11/01/2005 alle 18:24:14
ottimo

Commento di Anonimo (ip: 82.51.17.216), scritto il 19/03/2005 alle 16:24:31
bravo!

Commento di Anonimo (ip: 80.20.97.114), scritto il 13/10/2005 alle 18:04:28
cioa

Commento di Anonimo (ip: 87.3.211.45), scritto il 08/11/2005 alle 16:33:29
Contenuto ottimo, ma come mai le immagini non si vedono?
Sarebbe interessante per un neofita poter consultare il listato di un programma con commenti riga per riga.Comunque grazie

Commento di Anonimo (ip: 194.149.232.85), scritto il 02/02/2006 alle 10:09:01
Semplice, conciso, preciso

Commento di Anonimo (ip: 81.174.56.146), scritto il 27/04/2007 alle 14:46:12
aaaa

Commenta questa notizia:
Non hai ancora fatto il
Login, puoi inserire commenti solo come anonimo.
ATTENZIONE: il tuo IP verrà memorizzato e mostrato a fianco del commento; con la pressione del tasto invia commento si esprime il consenso alla pubblicazione di tale informazione personale.
A discrezione dello staff, i commenti ritenuti non adatti od offensivi potranno essere rimossi. Nel caso di utilizzo di espressioni volgari od offensive il comportamento verrà segnalato al provider interessato.
Se non ti sei ancora registrato, cosa aspetti? Registrati subito.

Da ora puoi discutere dei problemi informatici anche sul nostro FORUM

Testo del commento:




  News correlate

 Corso Java @ilsoftware.it
 Il linguaggio Java: lez.10/10
 Il linguaggio Java: lez.9
 Il linguaggio Java: lez.8
 Il linguaggio Java: lez.7
 Il linguaggio Java: lez.6
 Il linguaggio Java: lez.5
 Il linguaggio Java: lez.4


Domini Email SpazioWeb
a partire da € 9.99+IVA annui



  Ultime dal Forum

Desperate housewives is really good!!!
Watching weeds to late…
Just love u ----criminal minds !!! (dvdsuperdeal)
I am pretty sure…24 dvd !!(dvdsuperdeal.com)
GEOSTRING
MONETIZZIAMO.COM NUOVO E OTTIMO PROGRAMMA DI AFFILIAZIONE
Lockerz:proposta molto interessante
E' SE LA VIA DELL'ASCENSIONE IN CORPO...
KLIKOT IL NUOVO SOCIAL NETWORK CHE TI PAGA SU PAYPAL

Comunicazioni / Note Legali / Staff / Collabora / Pubblicità / Contatti


Copyright JuiceADV S.r.l. (P.IVA : 02387250307), tutti i diritti riservati Utenti Connessi: 379


Pagina creata in 21,00sec. Powered by JuiceADV S.r.l.

Stats v0.1 (0,000sec.)