Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Il metodo rappresenta una sorta di metodo di avvio (o di entry
main
point) per la nostra applicazione e deve essere sempre presente almeno in
una classe, poiché è invocato automaticamente dall’interprete java
all’atto dell’esecuzione dell’applicazione.
main è preceduto dalle keyword descritte di seguito.
indica che il metodo non restituisce alcun valore. Ovviamente
void
un metodo può restituire un valore e in questo caso occorre
indicarne il tipo di appartenenza, per esempio per la
int
restituzione di un tipo intero.
indica che si tratta di un metodo di classe che può essere
static
invocato senza la creazione del relativo oggetto.
indica che il metodo è accessibile da client esterni alla
public
classe dove il metodo stesso è stato definito.
Le keyword static e public permettono al metodo main di essere
invocato pubblicamente dall’interprete , in quanto client esterno, e di
java
avviarne il relativo programma. Seguono il main una serie di parentesi
tonde all’interno delle quali è posta una variabile denominata args che
rappresenta il parametro del metodo. Ogni metodo, infatti, può avere zero
o più parametri che rappresentano, se presenti, delle variabili che saranno
riempite con valori (detti argomenti) passati al metodo medesimo all’atto
della sua invocazione. I parametri di un metodo devono avere, inoltre, un
tipo di dato associato; infatti, il parametro args è dichiarato come di tipo
array di stringhe (String[]).Il parametro args permette al metodo main di
ottenere in input gli argomenti eventualmente passati quando si invoca
dalla riga di comando il programma che lo contiene.
6 Concetti di base di programmazione
Un paradigma, o stile di programmazione, indica un determinato modello
concettuale e metodologico, offerto in termini concreti da un linguaggio
di
programmazione, al quale fa riferimento un programmatore per la
progettazione e scrittura di un programma informatico e dunque per la
risoluzione del suo particolare problema algoritmico. Si conoscono molti
differenti paradigmi di programmazione, ma quelli che seguono ne
rappresentano i più comuni.
Il paradigma procedurale, dove l’unità principale di programmazione è,
per l’appunto, la procedura o la funzione che ha lo scopo di manipolare i
dati del programma. Questo paradigma è a volte indicato anche come
imperativo perché consente di costruire un programma indicando dei
comandi (assegna, chiama una procedura, esegui un loop e così via) che
esplicitano quali azioni si devono eseguire, e in quale ordine, per risolvere
un determinato compito.
Questo paradigma si basa dunque sul seguente concetto chiavi: lo stato
del programma cambia a causa delle istruzioni eseguite (si pensi al
cambiamento del valore di una variabile in un determinato tempo durante
l’esecuzione del programma);
Esempi di linguaggi che supportano il paradigma procedurale sono
FORTRAN, COBOL, Pascal e C. Il paradigma ad oggetti, dove l’unità
principale di programmazione è l’oggetto (nei sistemi basati sui prototipi)
oppure la classe (nei sistemi basati sulle classi). Questi oggetti, definibili
come virtuali, rappresentano, in estrema sintesi, astrazioni concettuali
degli oggetti reali del mondo fisico che si vogliono modellare. Questi
ultimi possono essere oggetti più generali (pensate a un computer, per
esempio) oppure oggetti più specifici, ovvero maggiormente specializzati
(per esempio una scheda madre, una scheda video e così via). Noi
utilizziamo tali oggetti senza sapere nulla della complessità con cui sono
costruiti e comunichiamo con essi attraverso l’invio di messaggi (sposta il
puntatore, digita dei caratteri) e mediante delle interfacce (il mouse, la
tastiera). Inoltre, essi sono dotati di attributi (velocità del processore,
colore del case e così via) che possono essere letti e, in alcuni casi,
modificati. Questi oggetti reali vengono presi come modello per la
costruzione di sistemi software a oggetti, dove l’oggetto (o la classe) avrà
metodi per l’invio di messaggi e proprietà che rappresenteranno gli
attributi da manipolare. Esempi di linguaggi che supportano il paradigma
ad oggetti sono: Java, C#, C++, JavaScript, Smalltalk e Python.
6.1 Programmazione a oggetti
Java è un linguaggio di programmazione a oggetti Object-Oriented
Programming - OOP). Che cos’è, quindi, la OOP? Il mondo che ci
circonda è costituito da oggetti: persone. automobili, costruzioni, alberi,
negozi, navi, zucche e re. Ciascuno di questi oggetti ha la capacità di
svolgere azioni e ciascuna di queste azioni può influenzare altri oggetti
del mondo. La OOP è una metodologia di programmazione che considera
il programma come costituito da oggetti (o istanze) che possono agire da
soli e anche interagire fra loro. In un programma, un oggetto software può
rappresentare un oggetto del mondo reale o una sua astrazione.
Si consideri, per esempio, un programma che simula un incrocio stradale,
con lo scopo di analizzare il flusso del traffico. Questo programma
utilizzerà tanti oggetti, ognuno dei quali rappresenta una singola
automobile che entra nel incrocio, e probabilmente anche altri oggetti che
rappresentano ciascuna corsia della strada, i semafori e cosi via. Le
interazioni fra questi oggetti permettono di giungere ad alcune
conclusioni riguardanti la progettazione dell‘incrocio.
La programmazione a oggetti ha una propria terminologia. Un oggetto ha
diverse caratteristiche, dette attributi. Per esempio, un oggetto
automobile potrebbe avere attributi come il nome, la velocità corrente e il
livello di carburante. I valori degli attributi di un oggetto costituiscono lo
stato dell’oggetto stesso. Le azioni che un oggetto può effettuare sono
dette comportamenti (behavior). Come si è visto in precedenza, ciascun
comportamento è definito in una porzione di codice Java, detta metodo.
Gli oggetti di uno stesso tipo condividono lo stesso tipo di dato. Una
classe definisce il tipo di dato di un oggetto; è una sorta di “stampo” che
consente di creare (in gergo di istanziare) oggetti; il tipo di dato di un
oggetto è dato dal nome della classe. Per esempio, in un programma di
simulazione del traffico, tutte le automobili possono essere create dalla
stessa classe, probabilmente chiamata Automobile; quindi il loro tipo è
Automobile.
Tutti gli oggetti di una classe hanno gli stessi attributi e lo stesso
comportamento,per esempio si spostano avanti o indietro. Questo non
vuol dire che tutte le automobili simulate siano identiche. Sebbene
abbiano gli stessi attributi, ognuna di esse può trovarsi in uno stato
differente. Cioè ogni loro attributo può assumere diversi valori per
ognuna di esse. Quindi potremmo osservare che tre automobili prodotte
da altrettanti costruttori differenti viaggiano a tre diverse velocità. Tutto
questo risulterà più chiaro quando si inizierà a scrivere le prime classi
Java.
Come si vedrà, la stessa metodologia a oggetti può essere applicata a
qualsiasi tipo di programma e non si limita ai programmi di simulazione.
6.2 Oggetti, metodi e classi
Un oggetto è un costrutto programmativo che possiede dati, detti attributi,
e che può effettuare certe operazioni, note come comportamenti
dell’oggetto. Una classe definisce un tipo di oggetto; rappresenta una
sorta di stampo per definire gli oggetti. Tutti gli oggetti della stessa classe
hanno gli stessi tipi di dato e gli stessi comportamenti. Quando un
programma viene avviato, ciascun oggetto può operare da solo o
interagire con altri oggetti per raggiungere gli obiettivi del programma. Le
azioni effettuate dagli oggetti sono definite dai metodi.
La programmazione orientata agli oggetti utilizza classi e oggetti, ma li
usa in modo diverso da come avviene in altri linguaggi meno recenti.
Occorre seguire alcuni principi di progettazione. I tre principi
fondamentali della progettazione orientata agli oggetti sono
incapsulamento, polimorfismo ed ereditarietà.
6.3 Incapsulamento
Il termine incapsulamento fa pensare all’atto di mettere qualcosa in una
capsula, di impacchettare le cose. Questa intuizione è fondamentalmente
corretta. La caratteristica principale dell’incapsulamento, tuttavia, non
consiste semplicemente nel racchiudere gli Oggetti in una capsula» ma
nel rendere visibile solamente una parte di questa capsula. Quando si
produce un frammento di software, occorre descriverlo in modo che altri
programmatori possano utilizzarlo e sorvolare su tutti i dettagli del suo
funzionamento. Si sottolinea che l ‘ incapsulamento nasconde i dettagli
del contenuto della capsula. Per questo motivo, l’’incapsulamento è
spesso chiamato information hiding (letteralmente “nascondere le
informazioni”).
I principi dell’incapsulamento si applicano a tutta la programmazione in
generale, non solamente alla programmazione orientata agli oggetti.
6.4 Il polimorfismo
II termine polimorfismo deriva dal greco e vuol dire “molte forme”.
L’idea alla base del polimorfismo consiste nel permettere a una stessa
istruzione di un programma di avere significati differenti in contesti
differenti. Il polimorfismo ricorre comunemente nella lingua italiana e il
suo utilizzo in un linguaggio di programmazione lo rende più simile a un
linguaggio umano. Per esempio, la frase “vai pure agli allenamenti”
assume un significato diverso a seconda della persona con cui si sta
parlando. Per uno lo sport potrebbe essere la pallavolo, per un altro il
calcio.
In un linguaggio di programmazione come Java, il termine polimorfismo
india che il nome di un metodo, usato come istruzione, può causare azioni
differenti a seconda degli oggetti che svolgono l’azione richiesta. Per
esempio, un metodo mostraStato() potrebbe mostrare lo stato di un
oggetto. Tuttavia il tipo di attributi, il loro numero e la modalità con cui
vengono presentati dipende dal tipo di oggetto che esegue l’azione
6.5 Ereditarietà
L’ereditarietà è un modo di organizzare le classi. Grazie all’ereditarietà è
possibile definire una sola volta gli attributi e i comportamenti comuni e
applicarli poi a un intero insieme di classi. Se si definisce una classe
generica, si può utilizzare l’ereditarietà a posteriori per definire classi
specializzate che aggiungono o perfezionano alcuni dettagli della classe
generica. Un esempio di un insieme di classi di questo tipo è
rappresentato nella Figura 3, dove si può notare che a ogni livello la