Cos’è la programmazione ad oggetti?
La
programmazione orientata agli oggetti (
OOP,
Object
Oriented
Programming) è un paradigma di programmazione che permette di definire oggetti software in grado di interagire gli uni con gli altri attraverso lo scambio di messaggi. È particolarmente adatta nei contesti in cui si possono definire delle relazioni di interdipendenza tra i concetti da modellare (contenimento, uso, specializzazione). Un ambito che più di altri riesce a sfruttare i vantaggi della programmazione ad oggetti è quello delle interfacce grafiche.
Alcuni vantaggi della programmazione orientata agli oggetti:
- fornisce un supporto naturale alla modellazione software degli oggetti del mondo reale o del modello astratto da riprodurre
- permette una più facile gestione e manutenzione di progetti di grandi dimensioni
- l’organizzazione del codice sotto forma di classi favorisce la modularità e il riuso del codice
_____________________________________________________________________________________________________________________________________________________________________________________
Caratteristiche del linguaggio
Java ha alcune importanti caratteristiche che permetteranno a chiunque di apprezzarne i vantaggi.
- Sintassi: è simile a quella del C e del C++, e questo non può far altro che facilitare la migrazione dei programmatori da due tra i più importanti ed utilizzati linguaggi esistenti. Chi non ha familiarità con questo tipo di sintassi può inizialmente sentirsi disorientato e confuso, ma ne apprezzerà presto l’eleganza e la praticità.
- Gratuito: per scrivere applicazioni commerciali non bisogna pagare licenze a nessuno. Sun ha sviluppato questo prodotto e lo ha migliorato usufruendo anche dell’aiuto della comunità “open-source”.
- Robustezza: essa è derivante soprattutto da una gestione delle eccezioni chiara e funzionale, e ad un meccanismo automatico della gestione della memoria (Garbage Collection) che esonera il programmatore dall’obbligo di dover deallocare memoria quando ce n’è bisogno. Inoltre il compilatore Java, è molto “severo”. Il programmatore è infatti costretto a risolvere tutte le situazioni “poco chiare” , garantendo al programma maggiori chance di corretto funzionamento.
- Libreria e standardizzazione: Java possiede una enorme libreria di classi standard che forniscono al programmatore la possibilità di operare su funzioni comuni di sistema come la gestione delle finestre, dei collegamenti in rete e dell’input/output. Il pregio fondamentale di queste classi sta nel fatto che rappresentano un’astrazione indipendente dalle piattaforme per un’ampia gamma di interfacce di sistema comunemente utilizzate. Inoltre se utilizziamo Java non avremo problemi di standardizzazione, come per esempio, compilatori che compilano in modo differente grazie alle specifiche dettate da Sun.
- Indipendenza dall’architettura: grazie al concetto di macchina virtuale ogni applicazione, una volta compilata, potrà essere eseguita su di una qualsiasi piattaforma (per esempio un PC con sistema operativo Windows o una workstation Unix). Questa è sicuramente la caratteristica più importante di Java. Infatti, nel caso in cui si debba implementare un programma destinato a diverse piattaforme, non ci sarà la necessità di doverlo convertire radicalmente a seconda della piattaforma. E’ evidente quindi che la diffusione di Internet favorirà sempre di più la diffusione di Java. Recentemente una statistica ha affermato che questo linguaggio diventerà il più utilizzato in assoluto a livello mondiale nel 2003, operando uno straordinario sorpasso al C++.
- Java Virtual Machine: Ciò che rende possibile di fatto l’indipendenza dalla piattaforma è la Java Virtual Machine, un software che svolge un ruolo da interprete (ma non solo) per le applicazioni Java. Più precisamente dopo aver scritto il nostro programma Java, prima bisogna compilarlo (per i dettagli riguardante l’ambiente e il processo di sviluppo, vi rimandiamo al paragrafo successivo). Otterremo così, non direttamente un file eseguibile (ovvero la traduzione in linguaggio macchina del file sorgente che abbiamo scritto in Java), ma un file che contiene la traduzione del nostro listato in un linguaggio molto vicino al linguaggio macchina detto “byte code”. Una volta ottenuto questo file dobbiamo interpretarlo. A questo punto la J.V.M. interpreterà il byte code ed il nostro programma andrà finalmente in esecuzione. Quindi, se piattaforme diverse posseggono una Java Virtual Machine, ciò sarà sufficiente per renderle potenziali esecutrici di byte code. Infatti, da qualche anno a questa parte, i Web Browser più diffusi implementano all’interno di essi una versione della J.V.M., capace di mandare in esecuzione le applet Java. Ecco quindi svelato il segreto dell’indipendenza della piattaforma. Si parla di “macchina virtuale” perché in pratica questo software è stato implementato per simulare un hardware. Si potrebbe affermare che il linguaggio macchina sta ad un computer come il byte code sta ad una Java Virtual Machine. Oltre che permettere l’indipendenza dalla piattaforma, la J.V.M. permette a Java di essere un linguaggio multithreaded (caratteristica di solito dei sistemi operativi), ovvero capace di mandare in esecuzione più processi in maniera parallella. Inoltre garantisce dei meccanismi di sicurezza molto potenti, e la “supervisione” del codice della Garbage Collection
- Orientato agli oggetti: Java ci fornisce infatti degli strumenti che praticamente ci “obbligano” a programmare ad oggetti. I paradigmi della programmazione ad oggetti (ereditarietà, incapsulamento, polimorfismo) sono più facilmente apprezzabili e comprensibili. Java è più chiaro e schematico che qualsiasi altro linguaggio orientato agli oggetti. Sicuramente, chi impara Java, potrà in un secondo momento accedere in modo più naturale alla conoscenza di altri linguaggi orientati agli oggetti, giacché, avrà di certo una mentalità più “orientata agli oggetti”.
- Semplice: in realtà, relativamente a questo argomento, bisogna fare una precisazione. Java è un linguaggio molto complesso considerandone la potenza e tenendo presente che ci obbliga ad imparare la programmazione ad oggetti. Ma, in compenso, si possono ottenere risultati insperati in un tempo relativamente breve. Apprezzeremo sicuramente le semplificazioni che ci offre Java durante questo corso. Abbiamo già accennato al fatto che non esiste l’aritmetica dei puntatori grazie all’implementazione della Garbage Collection. Provocatoriamente Bill Joy, vice-presidente della Sun microsystems negli anni in cui Java è stato creato, propose come nome sostitutivo di Oak il nome “C + + – -” , a sottolineare che il nuovo linguaggio voleva essere un nuovo C++, ma senza le sue caratteristiche peggiori (o se vogliamo, senza le caratteristiche più difficili da utilizzare e quindi pericolose).
- Sicurezza: ovviamente, avendo la possibilità di scrivere applicazioni interattive in rete, Java possiede anche delle caratteristiche di sicurezza molto efficienti. Come c’insegna la vita quotidiana nulla è certo al 100%. Esistono una serie di problemi relativi alla sicurezza di Java che ricercatori dell’Università di Princeton hanno scoperto e reso pubblici su Internet. Ma di una cosa possiamo essere certi: la Sun sta dando priorità assoluta proprio alla risoluzione di questi problemi. Intanto, oggi come oggi, Java è semplicemente il linguaggio “più sicuro” in circolazione.
_____________________________________________________________________________________________________________________________________________________________________________________
L'ambiente di sviluppo
Per scrivere un programma
Java abbiamo bisogno, in primo luogo, di un programma che ci permetta di scrivere del testo, ovvero di un
Text Editor (come ad esempio il NotePad di Windows, l’Edit del Dos, o il Vi di Unix). Abbiamo quindi bisogno di un
compilatore e di una
Java Virtual Machine capace di interpretare il byte code generato dalla compilazione del codice Java.
In questo corso utilizzeremo il famoso
Java Development Kit, scaricabile gratuitamente dal sito
http://www.java.sun.com, con le relative note di installazione e documentazione, che ci offre sia un compilatore, che un ambiente interpretato per permetterci di lavorare in modo completo.
Il
J.D.K. implementa infatti una suite di applicazioni, come un compilatore, una J.V.M., un formattatore di documentazione, una J.V.M. per interpretare applet e così via. Si possono scaricare diverse versioni di questo software, ovviamente scaricate la più recente.
Esistono poi anche
ambienti di sviluppo visuali che integrano Text Editor, compilatore, ed interprete come
JBuilder della Borland,
Visual Cafè della Symantec,
Visual Age for Java della IBM o
Forte for Java della stessa Sun. Ognuno di questi strumenti favorisce di sicuro una velocità di sviluppo maggiore, ma per quanto riguarda il periodo di apprendimento del linguaggio, ma per iniziare è preferibile scrivere tutto il codice senza aiuti da parte di questi strumenti, per non correre il rischio di non raggiungere una conoscenza “seria” del linguaggio di programmazione.
Abituatevi quindi ad avere a che fare con più finestre aperte contemporaneamente. Infatti, dopo aver installato correttamente il J.D.K. e settato opportunamente le eventuali
variabili di ambiente (consultare la note di installazione), scriveremo il nostro codice sorgente su di un Text Editor: il NotePad (blocco note) di Windows può andare bene.
Salveremo il nostro file con suffisso .java (attenzione: se utilizziamo il NotePad dobbiamo salvare il nostro file chiamandolo
nomeFile.java ed includendo il nome tra virgolette in questo modo:
“nomeFile.java”). Una volta ottenuto il nostro file Java dobbiamo aprire una Prompt di Dos.
A questo punto dobbiamo spostarci nella cartella in cui è stato salvato il nostro file sorgente e compilarlo tramite il comando
“javac nomeFile.java”. Se la compilazione ha esito positivo verrà creato un file chiamato
“nomeFile.class”. In questo file, come abbiamo già detto, ci sarà la traduzione in byte code del file sorgente. A questo punto potrò mandare in esecuzione il programma invocando l’interpretazione della Java Virtual Machine tramite il comando
“java nomeFile” (
senza l'estensione .java).
_____________________________________________________________________________________________________________________________________________________________________________________
Il primo programma
Diamo subito uno sguardo alla classica applicazione “
Hello World“. In questo modo inizieremo a familiarizzare con la sintassi e con qualche concetto fondamentale come quello di
classe e di
metodo. Vedremo anche come compilare e come mandare in esecuzione il nostro mini programma che stamperà a video il famigerato messaggio “Hello World!”.
- Codice: Seleziona tutto
class HelloWorld
{
public static void main(String args[])
{
System.out.println(“Hello World!”);
}
}
Analisi del codice
- Codice: Seleziona tutto
class HelloWorld
Dichiarazione della
classe HelloWorld. Come vedremo, ogni programma Java utilizza il concetto fondamentale di classe, che sarà trattato in dettaglio nel prossimo capitolo. Tutti i codici Java fanno uso di classi: l’intero codice, a parte le importazioni di librerie e le dichiarazioni d’appartenenza ad un
package, è sempre incapsulato all’interno di classi.
Questo programma deve essere salvato esattamente col nome della classe, prestando attenzione anche alle lettere maiuscole o minuscole. Questa condizione è necessaria per mandare in esecuzione il nostro programma.
- Codice: Seleziona tutto
{
Questa parentesi graffa aperta (ottenuta tenendo premuto il tasto ALT e scrivendo 123 con i tasti numerici che si trovano sulla destra della vostra tastiera, e poi rilasciando l’ALT) indica l’inizio della classe HelloWorld, che si chiuderà alla riga 7 con una parentesi graffa chiusa. Il blocco di codice compreso da queste due parentesi definisce la classe HelloWorld.
- Codice: Seleziona tutto
public static void main(String args[])
Questa riga è bene memorizzarla da subito, dato che essa deve essere definita in ogni applicazione Java. Trattasi della
dichiarazione del metodo main. In Java, metodo è sinonimo di azione
(i metodi saranno trattati in dettaglio più avanti) ed il metodo main definisce il
punto di partenza dell’esecuzione di ogni programma. La prima istruzione che verrà quindi eseguita in fase di esecuzione, sarà quella che la J.V.M. troverà subito dopo l’apertura del blocco di codice che definisce questo metodo.
La riga 3 contiene però anche altre parole, di cui studieremo in dettaglio il significato nei prossimi capitoli:
- public = modificatore del metodo. I modificatori sono utilizzati in Java come nel linguaggio umano sono utilizzati gli aggettivi. Se si antepone un modificatore alla dichiarazione di un elemento Java (un metodo, una variabile, una classe etc.) questo cambierà in qualche modo (a seconda del significato del modificatore) la sua funzionalità. In questo caso trattasi di uno specificatore d’accesso che rende di fatto il metodo accessibile anche al di fuori della classe in cui è stato definito.
- static = altro modificatore del metodo. La definizione di static è abbastanza complessa. Per ora accontentiamoci di sapere che è essenziale per la definizione del metodo main.
- void = è il tipo di ritorno del metodo. Significa “vuoto” e quindi questo metodo non restituire nessun tipo di valore. Il main non deve mai avere un tipo di ritorno diverso da void.
[*]main = come abbiamo già detto, trattasi del nome del metodo (detto anche identificatore del metodo). - (String args[]) = alla destra dell’identificatore di un metodo, si definisce sempre una coppia di parentesi tonde che racchiude a vikte una lista di parametri (detti anche argomenti) . Il metodo main, in ogni caso, vuole sempre come parametro un array di stringhe (agli array verranno spiegati successivamente). Notare che args è l’identificatore (nome) dell’array, e quindi è l’unica parola che può variare nella definizione del metodo main, anche se per convenzione si utilizza sempre args.
- Codice: Seleziona tutto
{
Questa parentesi graffa indica l’inizio del metodo main, che si chiuderà alla riga 6 con una parentesi graffa chiusa. Il blocco di codice compreso da queste due parentesi definisce il metodo.
- Codice: Seleziona tutto
System.out.println("Hello World!");
Questo comando, che, come già detto, verrà eseguito non appena avremo mandato in esecuzione il programma, stamperà a video la stringa
“Hello World!”. Anche in questo caso, giacché dovremmo introdurre argomenti per i quali il lettore non è ancora pronto, preferiamo rimandare la spiegazione dettagliata di questo comando ai prossimi capitoli. Per ora ci basterà sapere che stiamo chiamando un metodo appartenente alla
libreria standard di Java, che si chiama
println e che gli stiamo passando come parametro la stringa che dovrà essere stampata.
- Codice: Seleziona tutto
}
Questa parentesi graffa chiusa (ottenuta tenendo premuto il tasto ALT e scrivendo 125 con i tasti numerici che si trovano sulla destra della vostra tastiera, e poi rilasciando l’ALT) chiude l’ultima che è stata aperta, ovvero chiude il blocco di codice che definisce il metodo main
- Codice: Seleziona tutto
}
Questa parentesi graffa invece chiude il blocco di codice che definisce la classe HelloWorld.