Differenze tra le versioni di "Java/Classi e oggetti"

Vediamo uno dei componenti fondamentali dei programmi in Java, la '''classe'''.
 
== ClasseIntroduzione ==
 
Una '''classe''' è un tipo di dato creato dal programmatore, ed è l'essenza della [[w:Programmazione orientata agli oggetti|programmazione ad oggetti]].
<br/>
Con l'evolversi dell'informatica e il crescere della complessità delle applicazioni, i programmatori hanno trovato sempre più difficile trovare gli errori nei codici già scritti, riutilizzare codice scritto per altri programmi e modificare funzionalità già esistenti senza effetti collaterali imprevedibili.
 
Il codice di un programma può essere lunghissimo, arrivare fino a milioni di righe di codice. Si rende necessaria, allora, una suddivisione del codice secondo certi criteri. La programmazione orientata agli oggetti, in particolare, propone di dividere il codice in parti ben precise, ciascuna delle quali occupa di un aspetto specifico dell'applicazione. L'applicazione viene costruita mettendole insieme e facendole interagire in modo appropriato.
 
Ciascuna di esse presenta all'esterno un'interfaccia, che specifica quali operazioni può compiere, a prescindere da come siano effettivamente realizzate (implementazione). Questo significa che, nel caso si renda necessaria una modifica sul modo in cui un certo compito viene svolto (ad esempio, per correggere un errore), è più facile per il programmatore operare la modifica, proprio perché circoscriverà la manipolazione all'implementazione. Le altre componenti del programma, che conoscono ed utilizzano solo l'interfaccia, non devono essere modificate.
La soluzione a questi problemi è rendere la programmazione più '''astratta''' e '''modulare'''. Se un codice è diviso in parti ben precise che si occupano di aspetti specifici dell'applicazione e queste parti presentano all'esterno delle interfacce che specificano '''quali''' operazioni possano compiere (specifica), indipendentemente da '''come''' poi le compiano (implementazione) poi è più facile per il programmatore individuare un errore o riutilizzare delle funzionalità, proprio perché circoscriverà la manipolazione alla parte che gli serve.
 
La programmazione ad oggetti propone di vedere un programma come un insieme di entità, chiamate "oggetti", che interagiscono tra loro. Ogni oggetto dovrebbe rispecchiare un elemento della vita reale.
 
===Altro esempio===
Immaginiamo di dover fare un programma per gestire gli stipendi: creeremoall'interno di un'azienda. Un programmatore proveniente da un ''bacground'' di programmazione procedurale creerà un vettore di stringhe per il nome dei dipendenti, un altro per il cognome e un vettore di <code>int</code> per gli stipendi. Dopo aver creato i codici che chiedono i dati e li inseriscono o li mostrano a richiesta, il programma funziona e siamo contenti.<br/>
Dopo qualche anno, però, l'azienda apre una filiale negli USA. Dobbiamo quindi riadattare il programma perché gestisca anche i dollari.
Dopo qualche anno, però, l'azienda apre una filiale negli USA. Poiché il nostro programma era stato scritto presupponendo che la valuta da usare fossero gli Euro, dobbiamo riadattare il programma perché gestisca anche i dollari. Facile: creiamo un vettore stringa che contiene l'indicazione della valuta e riadattiamo tutto il programma per gestirla.<br/>
 
Creiamo un vettore stringa che contenga l'indicazione della valuta e riadattiamo tutto il programma per gestirla. Peccato che l'azienda decida poi di aprire una filiale in India. Adattiamo il programma anche alle Rupie e i dipendenti indiani ricevono uno stipendio ridicolo.<br/>
Perché? Perché quando avevamo due valute abbiamo creato un if di questo tipo:
 
che ora, nel caso di tre valute possibili non è più corretto.
 
Sarebbe bello che la funzione che stampa a video il valore della valuta potesse, in qualche modo, chiedere direttamente al dipendente qual è il valore del suo stipendio in dollari, in Euro o in rupie. C'è bisogno di qualcuno che si occupi di gestire tutti i dati relativi al dipendente. In questo modo, alla funzione di stampa non "interesserà" più se il dipendente vive in India, in America o in Europa: le interessa solo sapere che il dipendente deve ricevere un certo stipendio, e quale è il valor eid questo stipendio.
Per evitare di passare notti insonni a affrontare situazioni del genere sarebbe bello poter definire un tipo di dato "Dipendente" e dargli tutte le caratteristiche del dipendente (nome, ruolo, stipendio) in modo da condensare in esso tutto ciò che riguarda la sua logica di gestione e creare il resto del programma richiamando le funzioni interne di Dipendente. Aggiungere una nuova caratteristica al dipendente vorrebbe dire modificare solo il tipo di dato Dipendente e non tutto il programma che ne fa uso.
 
Per questa operazione esiste la classe.
PerPossiamo evitarerisolvere, diquindi, passareil nottiproblema insonnimettendo ainsieme affrontaretutti situazionii deldati genererelativi sarebbea belloun potersingolo dipendente. definireDefiniamo un tipo di dato "Dipendente" e dargligli diamo tutte le caratteristiche del dipendente (nome, ruolo, stipendio) in modo da condensare in esso tutto ciò che riguarda la sua logica di gestione e creare il resto del programma richiamando le funzionii internemetodi di Dipendente. Aggiungere una nuova caratteristica al dipendente vorrebbevuole dire modificare solo il tipo di dato Dipendente e non tutto il programma che ne fa uso.
Il tipo di dato che abbiamo creato è una classe.
 
===Sintassi===
La classe ha lo scopo di delineare le proprietà e le caratteristiche degli elementi che ci servono. Questi elementi possono poi essere creati realmente (''istanziati'') e diventano così “oggetti”: le istanze della classe sono gli oggetti.
La classe è un po' come un modello di qualcosa e l'oggetto è questo qualcosa realizzato concretamente. Gli elementi che compongono la classe possono essere: tipi primitivi, metodi, costruttori, oggetti di altre classi, classi stesse. Questi elementi sono tutti racchiusi in un contenitore (la classe) “class”. Vi è quindi la classe e gli oggetti: sono due cose diverse. Grazie all'esistenza delle classi possiamo creare gli oggetti. Gli oggetti sono allocati in memoria dalla JVM.