La struttura del codice
lezione
Lezione 2
2
La struttura del codice
In questa lezione impareremo...
• a scrivere un primo programma e a compilarlo ed eseguirlo
• a comprendere il ruolo del metodo main
• a utilizzare le funzioni di input output
• a creare la documentazione con javadoc
Prima di poter scrivere un programma mediante il linguaggio Java vogliamo introdurre il concetto
di ◀ programma ▶: si tratta di una astrazione del problema che si vuol fare risolvere al computer;
in qualsiasi tipologia di programma, dal più semplice al più complesso, l’elaborazione lavora sui dati
di ingresso, denominati input, e li trasforma nei dati di uscita, chiamati output.
Java è un linguaggio di programmazione ◀ object
oriented ▶ in cui l’astrazione del problema avvie◀ Programma È un insieme di
ne tramite l’isolamento e la definizione dei singoistruzioni che è necessario eseguili concetti che è necessario considerare al fine di
re al fine di risolvere uno specifico
raggiungere lo scopo prefissato.
problema. ▶
◀ Object oriented La programmaIn un programma che deve gestire per esempio un
zione orientata agli oggetti, definita
magazzino di merci secondo la programmazione
anche OOP (Object Oriented Proa oggetti i concetti coinvolti potrebbero essere: le
gramming), è un tipo di programmerci, gli scaffali e i codici a barre. Le azioni conmazione che permette di definire
crete che deve svolgere il programma per risolvere
oggetti software in grado di interail problema possiedono una importanza relativa in
gire gli uni con gli altri attraverso lo
quanto il peso maggiore è dato dalla rappresentascambio di messaggi. ▶
zione dei concetti coinvolti nel problema.
■■ Le classi
Nei linguaggi di programmazione orientati agli oggetti, un programma è costituito da un insieme di oggetti che cooperano tra di loro per raggiungere lo scopo
per cui è stato scritto il programma. Gli ◀ oggetti ▶
rappresentano i concetti coinvolti nel problema.
◀ Oggetti Un oggetto è una entità
dotata di specifici attributi e che è in
grado di cooperare con altri oggetti
svolgendo specifiche azioni. ▶
27
UdA 1
La sintassi Java e l’ambiente di sviluppo
Un oggetto può rappresentare qualsiasi cosa. Per esempio, l’oggetto Cane può avere come attributi
il peso, il colore del pelo, l’età; le sue azioni possono includere il correre, il dormire e il mangiare
un osso. L’oggetto Smartphone ha attributi come la risoluzione dello schermo, il peso e il colore,
mentre le azioni includono l’invio di email, l’installazione di Apps, la composizione di un numero,
l’accensione e lo spegnimento.
Una classe è invece lo schema dal quale è possibile creare singoli oggetti. Possiamo paragonare una
classe al progetto di una automobile. Per esempio, il progetto della Fiat Bravo, completo di tutti i
dettagli che definiscono gli attributi e le azioni che questa macchina può svolgere, viene utilizzato
dalla fabbrica per produrre i singoli esemplari. Paragonando queste definizioni alla programmazione,
il progetto è la classe, mentre le singole autovetture sono i diversi oggetti presenti nel programma.
Si pensi a un’azienda di noleggio macchine Fiat: per poter operare necessita di diversi esemplari di
Fiat Bravo, che vengono forniti ai clienti per viaggiare. Allo stesso modo, un programma può aver
bisogno di molteplici oggetti di una stessa classe al fine di raggiungere il proprio scopo.
■■ Un programma Java
Una volta appresa la struttura generale di un generico programma orientato agli oggetti, è necessario
approfondire la struttura di un programma specificatamente scritto nel linguaggio Java.
L’unità minima di azione che è possibile definire in Java è detta espressione. Una istruzione è invece
ogni espressione che termina con un punto e virgola. Un esempio basilare di istruzione Java è la
seguente dichiarazione di variabile:
Variabili e tipi verranno approfonditi più avanti, in una lezione dedicata. Un altro esempio di istruzione tipica è quella che consente di eseguire una assegnazione:
L’istruzione assegna alla variabile x il valore 20.
Le istruzioni vengono raggruppate in unità esecutive chiamate metodi. Per esempio, un metodo il
cui scopo è quello di riprodurre un motivo musicale memorizzato come file mp3 potrebbe eseguire
le seguenti operazioni:
Nel codice presentato, le istruzioni leggiCanzone(), decodifica() e riproduci() si occupano, rispettivamente, di leggere il file
mp3, decomprimerne il contenuto e di riprodurlo nell’altoparlante del computer.
A loro volta, i metodi sono contenuti all’interno delle classi,
per esempio, il metodo play() potrebbe essere contenuto nella
classe LettoreMp3: ▶
28
La struttura del codice
Lezione 2
Zoom su...
Il metodo che aziona la classe
Ciascun programma necessita di un punto di inizio: è necessario indicare la prima istruzione da
eseguire. A questo proposito esiste un metodo con un nome particolare, chiamato main() che
rappresenta il punto di partenza dell’esecuzione di un programma scritto in Java. Ogni programma Java deve possedere almeno un metodo main per poter fare incominciare l’esecuzione
del programma stesso. Il codice che segue mostra il codice del metodo main di una classe ipotetica che esegue una stampa di una stringa a video:
Come possiamo notare questo metodo deve essere preceduto da tre parole chiave, assolutamente obbligatorie chiamate public static void che verranno discusse ampiamente più avanti. Inoltre
il codice del metodo che viene eseguito deve essere racchiuso all’interno delle parentesi graffe.
■■ La classe System
La classe System, presente nel ◀ package ▶ java.lang è il punto di accesso a diverse funzioni strettamente legate alle funzionalità di base di Java, come la Virtual Machine, i meccanismi di sicurezza
e le proprietà di sistema. Oltre a queste, la classe System dispone di tre campi, che forniscono l’accesso all’I/O di sistema:
◗◗ in che consente di accedere all’input;
◗◗ out che permette l’accesso all’output;
◗◗ err che rappresenta un canale dedicato agli errori.
◀ Package I package di Java non sono altri che un insieme di classi impacchettate in un unico file di
estensione .jar. Sono delle vere e proprie librerie alle quali possiamo dal codice Java. Possono essere
create dal programmatore, anche se esamineremo i package già definiti in Java. Il nucleo del linguaggio Java contiene solo le parole chiave per la costruzione delle classi, i commenti, i normali costrutti if,
switch, while, do-while, for, etichette, break, continue e return, tutto il resto è implementato nei package del linguaggio, comprese le istruzioni di Input e di Output. ▶
Per usare un package in una classe, prima della definizione della classe dobbiamo inserire l’istruzione import, per esempio volendo usare il package java.awt dobbiamo inserire all’inizio del codice la
seguente istruzione, che indica l’intenzione di usare le classi presenti nel package:
import java.awt.*;
Il package java.lang è il più importante di Java e racchiude le classi fondamentali del linguaggio,
infatti anche se non scriviamo l’istruzione import per questo package, fa lo stesso in quanto esso
verrà importato automaticamente.
29
UdA 1
La sintassi Java e l’ambiente di sviluppo
Attraverso l’asterisco (*) indichiamo al compilatore l’intenzione di utilizzare tutte le classi;
qualora intendessimo usarne solo alcune dovremmo specificarlo per esteso. Per esempio
l’istruzione:
import java.awt.Frame;
limita l’accesso alla sola classe Frame del package awt.
Il primo di questi campi è di tipo InputStream, mentre gli altri sono di tipo PrintWriter; queste classi
appartengono al package java.io e dispongono di funzionalità di lettura e scrittura: in e out consentono di accedere all’input/output di sistema, mentre err viene utilizzato per la gestione degli errori:
quando un programma ha la necessità di segnalare un evento critico, lo può inviare a err; quando la
comunicazione è un normale output, viene inviata ad out.
La visualizzazione dei dati
Il linguaggio Java, come tra l’altro tutti i linguaggi di programmazione, consente di comunicare con
l’utente tramite due modalità:
◗◗ input;
◗◗ output.
L’input (dati in ingresso) consente al programma di ricevere dati e informazioni dall’esterno allo scopo
di poterli elaborare, mentre la fase di output (dati in uscita), consiste nella comunicazione all’utente
dei dati e delle informazioni così elaborati. Tutti i programmi si basano sul seguente schema:
Dati in ingresso
(Input)
Istruzioni
(Elaborazione)
Dati in uscita
(Output)
Tradotto in parole, significa che il risultato (output) è ottenuto mediante le operazioni elementari
descritte nell’algoritmo ed è il prodotto della elaborazione (trasformazione) dei dati in ingresso
(input). In un computer i tipici dispositivi di input sono la tastiera e il mouse, mentre il monitor è
il tipico dispositivo di output.
Queste funzionalità sono disponibili in Java attraverso le classi presenti nella libreria di Java. La
presentazione dei risultati sul video viene definita standard output, a cui si accede tramite l’oggetto
◀ System.out ▶.
Il codice sotto riportato mostra come visualizzare il contenuto di una variabile intera e di una a
doppia precisione. L’output è riportato a fianco del codice.
◀ System La classe System raccoglie alcune funzionalità di sistema; uno dei suoi attributi è
out, un oggetto che contiene diversi metodi per produrre un output, studiati per operare con
i tipi di dati presenti nel linguaggio Java. ▶
30
La struttura del codice
Lezione 2
In questi esempi è stato utilizzato il metodo println() che stampa il parametro passato andando successivamente a capo; per scrivere sempre sulla stessa riga è possibile utilizzare print().
Il codice seguente produce in output la scritta “Prezzo: 100 Euro”:
Il programma produce in output quanto segue
La lettura dei dati
Le gestione dell’input avviene mediante la classe InputStream fornita da System. Tale classe tuttavia
dispone solo delle funzionalità basilari di gestione dell’input; il metodo read() in essa definito, infatti,
consente di leggere la tastiera solo un carattere per volta. Se vogliamo sviluppare un programma
dobbiamo utilizzare funzioni più evolute, come per esempio la lettura di una intera riga di testo,
quella che l’utente digita e termina con la pressione del tasto INVIO.
Il metodo readLine() della classe BufferedReader,
legge buffers (sequenze di caratteri) che restituisce
◀ Lettore di stream L’utilità di un
sotto forma di stringhe. La classe BufferedReader, a
lettore è quella di trasformare la
sequenza di byte letti tramite qualsua volta, deve essere inizializzata fornendo un reader
siasi oggetto di tipo InputStream
(◀ lettore di stream ▶) di input. Tale lettore è rapprein una sequenza di caratteri. ▶
sentato da un’istanza della classe InputStreamReader.
Per leggere una sequenza di byte da un oggetto di tipo
InputStream dobbiamo usare un oggetto System.in, di classe InputStream. Un lettore bufferizzato può
essere creato istanziando un oggetto della classe BufferedStreamReader nel seguente modo:
InputStreamReader leggi= new InputStreamReader(System.in);
A questo punto faremo uso del lettore bufferizzato che abbiamo chiamato leggi per istanziare un
oggetto di tipo BufferedReader. Quest’ultimo mette a disposizione del programmatore il metodo
readLine() che consente la lettura di intere stringhe. Per istanziare un oggetto di classe BufferedReader dobbiamo procedere nel seguente modo:
BufferedReader input = new BufferedReader( leggi);
Una volta che l’oggetto di lettura è stato costruito correttamente, possiamo utilizzarlo per leggere
una linea di testo, operazione che viene eseguita dal metodo readLine():
input.readLine();
L’istruzione di inizializzazione dell’oggetto di tastiera (input) può essere ridotta alla seguente
forma compatta:
31
UdA 1
La sintassi Java e l’ambiente di sviluppo
Esempio2
Stampa di un
numero
Il programma acquisisce da
tastiera un nome e un numero
che rappresenta il saldo di un
conto corrente e lo visualizza
in output. ▶
È importante sottolineare come sia necessario aggiungere
all’inizio del codice la riga:
import java.io.*;
per poter utilizzare le istruzioni di input e output viste nella
lezione.
Nel codice è presente il costrutto try/catch: viene utilizzato per gestire eventuali errori che
si possono verificare in fase di lettura da un flusso di informazioni. In questo specifico caso è
difficile che si verifichino problemi di lettura dalla tastiera: se questa smettesse di funzionare,
probabilmente non si vedrebbero più sul video i caratteri digitati.
Si pensi però se la lettura delle informazioni avvenisse da un dischetto removibile, evenienza
che, dal punto di vista di Java, è equivalente come classi e metodi coinvolti: l’espulsione
anticipata del dischetto farebbe mancare le informazioni che si stanno leggendo; in tal caso
viene individuato da Java un errore di tipo IOException. La gestione degli errori sarà oggetto
di una trattazione più approfondita più avanti nel testo.
In questo programma sono state usate due variabili, una per il nome da visualizzare e l’altra per
memorizzare l’importo. Il concetto di variabile verrà tuttavia trattato nella prossima lezione.
■■ I commenti
Tutti i linguaggi di programmazione mettono a disposizione uno spazio per commentare il codice
sorgente. Lo scopo è quello di documentare, descrivere o annotare informazioni importanti per lo
sviluppatore. Tali messaggi prendono il nome di ◀ commenti ▶.
◀ Commenti Un commento fa parte del codice di un programma, ma non viene considerato al momento dell’esecuzione. In questo modo il programmatore può descrivere lo scopo di porzioni particolari di codice, in modo che sia più semplice ricordare perché un certo programma è stato scritto in
quel modo, soprattutto quando è passato un certo tempo dopo la stesura del programma ed è difficile
ricostruire le sue funzionalità. ▶
32
La struttura del codice
Lezione 2
A volte possiamo usare i commenti anche per non far eseguire alcune istruzioni senza doverle
necessariamente cancellare dal codice.
Il linguaggio Java dispone di tre modalità per inserire i commenti:
◗◗ doppio slash (//) a inizio commento;
◗◗ slash asterisco (/*) all’inizio e viceversa (\*) alla fine del commento;
◗◗ slash e doppio asterisco (/**) all’inizio e viceversa (**/) alla fine del commento.
Il primo tipo permette di considerare come commento tutto ciò che è scritto dopo di essa, fino al
termine della riga.
Quando invece il commento è composto da diverse righe, è più pratico utilizzare il secondo tipo
in grado di identificare quanto contenuto tra delimitatore di inizio (/*) e delimitatore di fine (*/)
commento. L’esempio che segue mostra i due tipi di commento indicati:
Il terzo tipo di commento si chiama commento Javadoc e consente di documentare le classi con
un browser Web. All’interno dei
commenti Javadoc è possibile inserire alcuni marcatori particolari, che permettono di specificare
alcune informazioni utili, quali la
versione e l’autore della classe, e
che avranno un posto specifico
nella documentazione generata.
Per esempio, per includere autore e versione nella classe Automobile possiamo scrivere: ▶
A questo punto, dopo aver compilato la classe passiamo alla generazione dei codici di documentazione aprendo l’ambiente JDK. Per fare questo apriamo l’ambiente Prompt dei comandi e posizioniamoci nella cartella del progetto (quella che contiene la classe da documentare):
33
UdA 1
La sintassi Java e l’ambiente di sviluppo
Il comando necessario per
generare i file della documentazione è javadoc seguito dal nome del file che
contiene la classe sorgente,
quindi in questo caso Automobile.java: ▶
Vengono generati moltissimi file che concorrono alla creazione della documentazione all’interno
della cartella del progetto:
Aprendo il file index.html otteniamo la finestra di consultazione della nostra classe Automobile:
34
La struttura del codice
Lezione 2
Verifichiamo le conoscenze
g Esercizi a scelta multipla
1 Una istruzione Java è una espressione che:
a) corrisponde a una qualunque riga del programma, anche vuota
b) effettua un ciclo
c) contiene almeno una variabile
d) termina con il punto e virgola
2 Ogni programma Java deve possedere almeno un metodo main?
a) no, non è vero
b) no, per poter far finire il programma
c) no, per poter far iniziare il programma
d) no, per poter salvare le variabili
3 Quale campo della classe System, tra i seguenti, consente di stampare a video una stringa?
a)in
b)out
c)err
d)print
4 I package sono:
a) un insieme di classi salvate in un file .jre
b) un insieme di classi salvate in un file .jar
c) un insieme di variabili salvate in un file .jar
d) un insieme di metodi salvati in un file .jar
5 Quale istruzione tra le seguenti istanzia un oggetto utile per la lettura da tastiera?
a) BufferedReader input = new BufferedReader(System.in);
b) BufferedReader input = new BufferedReader(System.out);
c) InputStreamReader input = new InputStreamReader(System.in);
d) Reader input = new Reader(System.in);
6 Quale tra i seguenti frammenti di codice rappresenta correttamente il metodo main?
a) public void main( String[] args );
b) public static void main( String[] argv, int argc );
c) public final void main();
d) public static void main( String[] args );
7 Un commento su singola riga è specificato dall’identificatore:
a)/*
b)/**
c)//
d)*/
e)//**
8 Un blocco di commenti su più righe è delimitato da:
a) /* ... */
b) /** ... **/
c) // ... //
d) */ ... /*
9 Quali tra i seguenti sono commenti Javadoc standard? (tre risposte)
a) /* @version 1.0 */
b) /** Commento @version 1.0 */
c) /* Commento @ejb.bean */
d) /** Commento */
e) /** Commento @ejb.bean */
10 Un programma è normalmente formato da:
a)figure
b)istruzioni
c)comandi
d) lettere e numeri
35
UdA 1
La sintassi Java e l’ambiente di sviluppo
g Test vero/falso
1
2
3
4
5
6
7
8
9
10
11
12
Il package fondamentale di Java è java.lang.
Tutte le istruzioni sono espressioni.
Tutte le espressioni sono istruzioni.
Nell’istruzione import l’asterisco (*) indica al compilatore l’intenzione di utilizzare tutte le classi.
Un oggetto è composto da più classi.
Un metodo definisce le proprietà di un oggetto.
I metodi contengono il codice.
Il metodo print() e println() sono esattamente identici.
Un programma è formato da un insieme di attributi.
Un oggetto è dotato di attributi e metodi.
Una classe definisce la struttura di un oggetto.
Un oggetto è un tipo particolare di classe.
VF
VF
VF
VF
VF
VF
VF
VF
VF
VF
VF
VF
g Esercizi di completamento
1 Lo standard output viene utilizzato per produrre una stampa a ...........................................................................................................; a questo
oggetto si accede tramite System..........................................................
2Un ........................................................................................................... fa parte del codice di un programma, ma non viene considerato al
momento dell’esecuzione.
3 Il costrutto try/catch viene utilizzato per gestire eventuali ........................................................................................................... che si possono
verificare in fase di ............................................................................................................
4 Ogni programma Java deve possedere almeno un metodo ........................................................................................................... per poter
fare incominciare l’esecuzione del programma stesso.
36