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

→‎Introduzione: rm esempi prolissi e poco efficaci
(→‎Introduzione: rm esempi prolissi e poco efficaci)
== Introduzione ==
 
Una '''classe''' è un tipo di dato creato dal programmatore, ed è allausata basecome della"stampo" per la creazione di [[w:Programmazione orientata agli oggetti|programmazione ad oggetti]].
 
LaUn programmazioneoggetto adpuò oggettiessere propone di vedere un programmaconsiderato come un insieme di entità,dati chiamate(memorizzati "oggetti",nei checampi) e di operazioni interagiscono(definite tradai lorometodi). Ogni oggetto dovrebbe rispecchiarerappresentare un elemento della vita reale e gli aspetti che lo identificano sono raggruppati insieme in un unico punto del programma, cioè la definizione della classe da cui è stato istanziato l'oggetto.
Di seguito, si cerca di chiarire con esempi il concetto di ''classe'' a chi entra per la prima volta nel mondo della OOP.
 
===Primo esempio===
Si pensi ai tipi base, già visti nella sezione sui tipi. Un tipo è definito come ''un insieme di valori, sui quali sono definite determinate operazioni''.
 
I tipi base del Java soddisfano pienamente questa definizione. Ad esempio, il tipo ''int'' ammette 2<sup>32</sup> valori possibili e su ciascuno di essi sono definite sempre le stesse operazioni: somma (+), prodotto (*), modulo (%), ecc.<br/>
Anche il tipo ''boolean'' ha queste caratteristiche: esso ammette solo due valori, ''true'' e ''false'', e su entrambi sono definite le stesse operazioni: and (&&), or (||), not (!), ecc.<br/>
Come si vede, ognuno dei valori dei tipi esaminati corrisponde ad un elemento della vita mentale degli esseri umani (numeri, valori di verità).
 
Una classe è un tipo, i cui valori (chiamati ''oggetti'', o anche ''istanze della classe'' in questione), a differenza dei tipi base, sono in numero potenzialmente infinito (si possono creare tutti gli oggetti che si vuole, ovviamente memoria permettendo).
 
Su ciascuna delle istanze di una stessa classe, possono essere richiamate le stesse operazioni (dette ''metodi''); per esempio, su una classe ''Cane'' si può chiamare il metodo ''abbaia()'', oppure il metodo ''dormi()''. Metodi come questi possono essere considerati operazioni "unarie"; ma sono possibili anche metodi che accettano argomenti, come ad es. ''camminaInAvanti(int passi)''.
 
Un oggetto dovrebbe rappresentare un elemento della vita reale.
 
 
===Altro esempio===
Immaginiamo di dover fare un programma per gestire gli stipendi all'interno di un'azienda. Un programmatore proveniente da un ''background'' 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. 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/>
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:
 
'' IF la valuta è EUR applica questo valore, ELSE quest'altro''
 
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 (o a un'entità che lo rappresenta all'interno del programma) 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 valore di questo stipendio. Un altro punto del programma si occupa di gestire la nazionalità del dipendente e la valuta in cui bisogna calcolare lo stipendio. In questo modo, se un giorno dovremo aggiornare il programma per aggiungere una nuova valuta, la funzione di stampa resterà la stessa, mentre dovremo cambiare solo quel pezzo di programma in cui avevamo scritto il codice che gestisce i dati del dipendente.
 
Sappiamo che tutti i dipendenti del mondo hanno una cosa in comune: essi devono ricevere uno stipendio, espresso in una certa valuta. Anzi, sappiamo che ''dobbiamo poter chiedere loro'', in qualche modo, quale sia il valore dello stipendio espresso nella sua valuta locale. Questo "chiedere un'informazione" all'entità che rappresenta il dipendente non è altro che eseguire una certa operazione; operazione che si chiama ''metodo''.
 
Possiamo risolvere, quindi, il problema mettendo insieme tutti i dati relativi a un singolo dipendente. Definiamo un tipo di dato "Dipendente" e gli 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 i metodi di Dipendente. Aggiungere una nuova caratteristica al dipendente vuole 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===