Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Programmazione Introduzione a Java, Appunti di Programmazione Java

Programmazione 1 Introduzione teorica a Java Definizioni Classi e metodi

Tipologia: Appunti

2019/2020

Caricato il 25/04/2020

Prosecco2020
Prosecco2020 🇮🇹

4.4

(36)

31 documenti

1 / 25

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Giacomo Savazzi
1
Introduzione all’Informatica
L’informatica è una scienza che studia l’informazione e tutti quei processi che portano alla sua
memorizzazione, elaborazione e trasmissione/diffusione. Non si occupa della parte fisica
(computer) e non è neanche focalizzata sul solo sviluppo di applicativi.
INFORMAZIONE entità che raccoglie la conoscenza derivata dallo studio e descrizione di qualcosa;
L’informazione, una volta ottenuta, va poi rappresentata e memorizzata in particolari supporti. La
stessa informazione potrebbe essere rappresentata e memorizzata anche in più modi diversi.
RAPPRESENTARE trascrivere l’informazione su supporti materiali non volatili con opportuna
codifica (convenzione condivisa per la scrittura, necessaria per rendere l’informazione
comprensibile a tutti);
Il calcolatore (PC, in particolare il processore) può lavorare solo con informazioni codificate tramite
la codifica binaria, codifica che permette di rappresentare qualunque informazione sotto forma di
sequenza di 0 e 1. Questa codifica è l’unica compresa da tutti i calcolatori e deve essere rispettata
per garantire la comprensione tra calcolatori diversi.
BIT il bit (BInary digiT) è l’unità minima di informazione;
CALCOLATORE macchina per l’elaborazione di dati in grado di comprendere la sola codifica
binaria. Il calcolatore è un dispositivo attivo infatti è in grado di elaborare i dati prendendo decisioni
in base a particolari input. Esempio: una pagina web mostra all’utente solo i dati che gli competono
in base alle sue autorizzazioni. A differenza delle altre macchine, il calcolatore può essere
programmato e quindi specializzato in base al compito che dovrà eseguire. Per tale motivo è detto
dispositivo di General Purpose (di scopo generale);
Per specializzare un calcolatore sono necessari particolari algoritmi, insiemi di operazioni eseguibili
in modo automatico dalla macchina e non ambigue, comprensibili al calcolatore. La macchina non
lavora però direttamente con l’algoritmo, ma si basa sui programmi, rappresentazioni dell’algoritmo
a lei comprensibili: la macchina decodificherà il programma e otterrà le varie operazioni da eseguire.
Sistema di numerazione binario
Sistema di numerazione basato sui bit. Il bit permette di implementare un sistema di numerazione
in base 2 con uniche cifre ammesse 0 e 1. Ogni bit assume o 0 o 1 e con più bit sono in grado di
rappresentare informazioni di qualunque grandezza. Si decise di usare il bit perché facilmente
rappresentabile a livello fisico (0 assenza tensione, 1 presenza tensione) ed anche perché in
corrispondenza con i valori logici 1, vero, e 0, falso. Aumentando il numero di bit aumento il numero
di informazioni rappresentabili, infatti, con N bit posso rappresentare 2N informazioni diverse. Al
contrario, se voglio rappresentare M informazioni mi serviranno:
log(2, M) bit
Approssimando poi il risultato per eccesso.
Unità di misura del binario
Byte 1 byte corrisponde a 8 bit;
Kilo byte 1 Kilo byte corrisponde a 1024 byte;
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19

Anteprima parziale del testo

Scarica Programmazione Introduzione a Java e più Appunti in PDF di Programmazione Java solo su Docsity!

Giacomo Savazzi

Introduzione all’Informatica

L’informatica è una scienza che studia l’informazione e tutti quei processi che portano alla sua memorizzazione, elaborazione e trasmissione/diffusione. Non si occupa della parte fisica (computer) e non è neanche focalizzata sul solo sviluppo di applicativi. INFORMAZIONE → entità che raccoglie la conoscenza derivata dallo studio e descrizione di qualcosa; L’informazione, una volta ottenuta, va poi rappresentata e memorizzata in particolari supporti. La stessa informazione potrebbe essere rappresentata e memorizzata anche in più modi diversi. RAPPRESENTARE → trascrivere l’informazione su supporti materiali non volatili con opportuna codifica (convenzione condivisa per la scrittura, necessaria per rendere l’informazione comprensibile a tutti); Il calcolatore (PC, in particolare il processore) può lavorare solo con informazioni codificate tramite la codifica binaria, codifica che permette di rappresentare qualunque informazione sotto forma di sequenza di 0 e 1. Questa codifica è l’unica compresa da tutti i calcolatori e deve essere rispettata per garantire la comprensione tra calcolatori diversi. BIT → il bit (BInary digiT) è l’unità minima di informazione; CALCOLATORE → macchina per l’elaborazione di dati in grado di comprendere la sola codifica binaria. Il calcolatore è un dispositivo attivo infatti è in grado di elaborare i dati prendendo decisioni in base a particolari input. Esempio: una pagina web mostra all’utente solo i dati che gli competono in base alle sue autorizzazioni. A differenza delle altre macchine, il calcolatore può essere programmato e quindi specializzato in base al compito che dovrà eseguire. Per tale motivo è detto dispositivo di General Purpose (di scopo generale); Per specializzare un calcolatore sono necessari particolari algoritmi, insiemi di operazioni eseguibili in modo automatico dalla macchina e non ambigue, comprensibili al calcolatore. La macchina non lavora però direttamente con l’algoritmo, ma si basa sui programmi, rappresentazioni dell’algoritmo a lei comprensibili: la macchina decodificherà il programma e otterrà le varie operazioni da eseguire.

Sistema di numerazione binario

Sistema di numerazione basato sui bit. Il bit permette di implementare un sistema di numerazione in base 2 con uniche cifre ammesse 0 e 1. Ogni bit assume o 0 o 1 e con più bit sono in grado di rappresentare informazioni di qualunque grandezza. Si decise di usare il bit perché facilmente rappresentabile a livello fisico (0 assenza tensione, 1 presenza tensione) ed anche perché in corrispondenza con i valori logici 1, vero, e 0, falso. Aumentando il numero di bit aumento il numero di informazioni rappresentabili, infatti, con N bit posso rappresentare 2N^ informazioni diverse. Al contrario, se voglio rappresentare M informazioni mi serviranno: log( 2 , M) bit Approssimando poi il risultato per eccesso.

Unità di misura del binario

Byte → 1 byte corrisponde a 8 bit; Kilo byte → 1 Kilo byte corrisponde a 1024 byte;

Mega byte → 1 Mega byte corrisponde a 1024 Kilo byte; Giga byte → 1 Giga byte corrisponde a 1024 Mega byte; Tera byte → 1 Tera byte corrisponde a 1024 Giga byte;

Codifica dei caratteri

Per rappresentare un carattere sotto di forma di una sequenza di bit ci si avvale di particolari standard che definisco una serie di sequenze che identificano i miei caratteri. La comprensione tra i vari calcolatori sarà poi ottenuta se tutti adottano lo stesso standard. Quelli più diffusi sono gli standard ASCII (American Standard Code for Information Interchange) e UNICODE:

  • ASCII, tale standard utilizza 7 bit per rappresentare i caratteri solo stampabili, offrendo 128 combinazioni diverse;
  • ASCII esteso, si passa da 7 a 8 bit, 256 valori diversi, riuscendo così a identificare anche i caratteri non stampabili;
  • UNICODE, anche detto UTF-8, sfrutta da 1 a 4 byte per rappresentare i caratteri e infatti ammette tutti gli alfabeti più caratteri speciali e non stampabili. L’UNICODE è comunque retrocompatibile con l’ASCII per non causare problemi di comprensione; N.B. visto che ora ogni carattere ha la sua rappresentazione binaria posso di conseguenza dire che ogni carattere è identificato da un numero in base dieci diverso (converto binario in decimale);

Architettura di Von Neumann

Fu la prima proposta di architettura hardware per un calcolatore e venne elaborata dall’ informatico John Von Neumann nel 1946. Questa architettura vede il calcolatore composto da più elementi:

  • CPU (Central Processing Unit) , in grado di acquisire, interpretare e eseguire programmi/istruzioni;
  • Memoria , per il salvataggio delle informazioni;
  • Periferiche , come la memoria di massa e le periferiche input/output (chiavette e stampanti), permettono lo scambio di informazioni con l’esterno;
  • Bus di sistema , ovvero i collegamenti tra i vari elementi;

Introduzione a JAVA

JAVA

Introduciamo intanto il concetto di astrazione… ASTRAZIONE → distinguere le proprietà esterne di un oggetto dai dettagli interni (utilizzo senza effettiva conoscenza). In informatica l’astrazione di un oggetto può essere divisa in livelli: dal basso verso l’alto, il livello di astrazione aumenta permettendo all’utente di utilizzare una risorse senza conoscerne tutti i dettagli (Es. Kernel del sistema operativo); ALGORITMI → insiemi di operazioni eseguibili in modo automatico dalla macchina e non ambigue, comprensibili al calcolatore. Proprietà che caratterizzano gli algoritmi sono la correttezza, riuscire a ottenere il risultato desiderato, e l’efficienza, ottenere quel risultato con il più basso spreco di risorse in termini di tempo e memoria. Unendo i concetti di algoritmo e astrazione nasce il paradigma dividi et impera basato sulla divisione del problema in sotto problemi, detti moduli, di più facile risoluzione. I vari moduli interagiranno poi tra loro per risolvere il problema iniziale.

Programma ≠ Algoritmo → infatti un programma è la rappresentazione dell’algoritmo;

Il computer non esegue direttamente l’algoritmo ma esegue il programma che implementa quel particolare algoritmo. Questi programmi sono sequenze di istruzioni scritte in particolari linguaggi, detti linguaggi di programmazione, comprensibili al calcolatore. Questi linguaggi, come quelli normali, definiscono per la comunicazione una serie di elementi divisi in:

  • Primitive , le componenti base;
  • Sintassi , che mi dice come sono fatte le primitive;
  • Semantica , che mi dice il significato delle varie primitive;
  • Regole , che mi dicono come combinare le primitive per arrivare a qualcosa di più complesso; L’unico linguaggio compreso dal calcolatore è il linguaggio macchina che si basa sulla codifica binaria (0 e 1). Dal linguaggio macchina sono stati poi sviluppati altri linguaggi la cui sintassi si avvicina di più a quella umana. Questi linguaggi comunque non sono comprensibili al calcolatore e, per tale motivo, le istruzioni vanno comunque tradotte in linguaggio macchina. N.B. Possono esistere anche più algoritmi diversi che risolvono lo stesso problema e lo stesso algoritmo può essere implementato anche con linguaggi diversi; Il linguaggio di livello subito superiore al linguaggio macchina è il linguaggio assembly , linguaggio ancora di basso livello che, anche se di difficile comprensione e codifica, offre primitive più comprensibili (ADD, SUM etc.) e permette di utilizzare al meglio il calcolatore, riducendo lo spreco di tempo e spazio. Salendo di livello ci si allontana dal linguaggio macchina per raggiungere i linguaggi di alto livello, linguaggi indipendenti dalla macchina, le cui istruzioni sono quindi comprensibili a qualunque calcolatore e più vicine alla sintassi umana. Questi linguaggi permettono una codifica molto più semplice perché offrono primitive più strutturate e pronte all’uso. Uno di questi linguaggi di alto livello è JAVA.

Le istruzioni scritte in assembly o con linguaggi di alto livello non sono comprensibili al calcolatore. Vanno quindi tradotte in linguaggio macchina. Ad adempiere a questo compito ci pensa o il compilatore o l’interprete:

  • Compilatore: traduce in linguaggio macchina tutto il programma e salva le nuove istruzioni in memoria (crea file .exe);
  • Interprete: traduce il programma eseguendolo riga per riga, senza memorizzarne il risultato; Il compilatore prima traduce il codice poi lo esegue; per tale motivo offre una traduzione più veloce ma l’eseguibile creato (.exe) sarà utilizzabile solo sul calcolatore su cui il codice è stato compilato e quindi non sarà portatile. L’interprete, anche se impiega più tempo, è in grado di eseguire lo stesso codice su qualunque macchina perché la traduzione verrà fatta ogni volta, senza salvarne poi il risultato. JAVA è un linguaggio ibrido che sfrutta i vantaggi sia del compilatore, in fatto di velocità di traduzione, che dell’interprete, in fatto di portabilità. Per fare ciò JAVA sfrutta il bytecode, un particolare file creato dal compilatore partendo dal programma e scritto in uno pseudo linguaggio macchina; questo linguaggio comunque non è ancora riconoscibile dal calcolatore, infatti, il bytecode viene successivamente interpretato dall’interprete che lo tramuta in linguaggio macchina e lo sottopone al calcolatore che ora è in grado di eseguilo. Ad interpretare il bytecode ci pensa la JVM (Java Virtual Machine) una macchina/calcolatore virtuale in grado di comprendere il bytecode; la JVM è indipendente dall’hardware su cui gira e, per tale motivo, è utilizzabile su qualunque dispositivo rendendo possibile la portabilità del programma. I passaggi che segue il codice java per essere eseguito sono:
  1. Compilazione del programma e creazione del bytecode;
  2. Interpretazione del bytecode da parte della JVM;
  3. Esecuzione del programma dal calcolatore;

Proprietà degli identificatori – OBBLIGATORIE Tutti gli identificatori (classi, variabili etc.) devono rispettare le seguenti regole in modo da non sollevare errori sintattici in fase di compilazione:

  • Non devono iniziare con numeri;
  • Non devono essere presenti spazi;
  • Sono ammesse solo lettere, numeri e i soli caratteri _ e $. Nessun altro carattere è ammesso;
  • Non usare parole riservate;
  • Due identificatori con lo stesso scope non possono avere lo stesso nome; Scope → con scope di un identificatore si fa riferimento alla sua visibilità. Ogni identificatore ha un determinato scope e quindi è visibile solo per certi metodi-classi; Convenzioni degli identificatori – FACOLTATIVE CLASSE → Ogni classe deve avere un nome che identificare bene il suo scopo. Il nome deve avere la prima lettera maiuscola e, nel caso sia formato da più parole, utilizzare la notazione CamelCase; VARIABILE → Ogni variabile deve avere un nome descrittivo, deve iniziare con la lettera minuscola e, se formata da più parole, utilizzare la notazione CamelCase; Variabili Le variabili sono locazioni di memoria (una riga della ipotetica tabella) utilizzate per salvare dei dati. Ogni variabile deve essere definita con:
  • Un identificatore, il suo nome, necessario per farvi riferimento;
  • Un tipo, per definire la tipologia di variabile che andremo a memorizzare (intero, stringa etc.);
  • Uno scope , che mi dice in che area del programma è utilizzabile; N.B. variabile con lo stesso scope non possono avere lo stesso nome, anche se hanno tipi diversi; Per usare una variabile devo prima dichiararla, definendone nome e tipo, in modo da riservare una particolare locazione di memoria. Una volta dichiarata, posso assegnarle un valore con l’operatore =. N.B. se dichiaro una variabile e non le assegno valore il suo valore sarà indefinito e JAVA non mi permetterà di usarla dandomi errore in fase di compilazione; Tipi delle variabili Il tipo di una variabile determina il valore che può contenere e le operazioni che sono consentite su di essa. I tipi in JAVA si dividono in:
  • Primitivi, più semplici e non scomponibili (int, float etc.);
  • Non primitivi, più complessi e composti a loro volta da altri tipi (Scanner, String, Array etc.);

I tipi primitivi in JAVA sono: Esempi di dichiarazioni e assegnamento a variabili di vario tipo: Intero → i valori interi assegnabili alle variabili intere sono numeri appartenenti all’insieme dei numeri relativi e sono identificati nel programma da numeri senza virgola (1 , 2 , 308 etc.); Virgola mobile → i valori in virgola mobile assegnabili alle variabili floating point sono numeri appartenenti all’insieme dei numeri reali approssimati in modo da poter essere rappresentati. I numeri DOUBLE sono identificati nel programma da numeri con il punto (1.2 , 2.0 , 3.4 etc.) mentre quelli FLOAT sono identificati da numeri con il punto più una F alla fine per dire che è FLOAT e non DOUBLE (1.2f , 3.0f , 3.4f etc.); Singolo carattere → un singolo carattere è identificato utilizzando i singoli pedici (‘a’ , ‘b’ , ‘1’ etc.). Ogni carattere ha un corrispondente codice UNICODE, infatti, in JAVA il carattere è gestito come un tipo intero solo che in fase di stampa, al posto del numero, viene stampato il corrispondete UNICODE.

La gerarchia dei tipi vista prima vale anche per le operazioni tra variabili, infatti: N.B. se divido tra loro due numeri interi sto eseguendo una divisione intera e infatti mi viene ritornato come risultato la sola parte intera della divisione. Per ottenere una divisione esatta devo utilizzare almeno un double o un float; N.B. l’operatore %, utilizzato per sapere il solo resto della divisione, può essere usato anche tra valori a virgola mobile e agisce in questo modo: N % D = N – (D*Q) dove Q è la parte intera di N/D Espressioni Le espressioni sono un misto di variabile, detti operandi, e operatori che producono come risultato un valore che può essere un valore intero, in virgola mobile, booleano etc. Gli operatori JAVA si dividono in:

  • Unari, agiscono su un solo valore (incremento, decremento, opposto, negazione etc.). Tali operatori ammettono una notazione prefissa, prima dell’operatore, dando così all’espressione precedenza massima, oppure notazione postfissa, dopo l’operatore, dando all’espressione precedenza minima;
  • Binari, agiscono su due valori (somma, differenza, prodotto, divisione etc.). Tali operatori, come i ternari, ammettono la solo notazione infissa, tra i valori;
  • Ternari, richiedono tre operatori. L’unico è il condizione : istVero? istFalso ; Ogni operatore ha una precedenza ben definita che determina poi l’ordine con cui vengono eseguite le varie operazione che compongono l’operazione.

N.B. l’operatore = è quello con precedenza minore perché sempre eseguito alla fine per assegnare il valore ottenuto dalla computazione dell’espressione alla variabile; Costanti In JAVA esistono altri valori, detti costanti o letterali, utilizzati per identificare quegli elementi il cui valore non può cambiare. Ad esempio, elementi come i numeri o i caratteri (2, 3, 5.0, ‘a’ etc.) non cambiano nel tempo. Queste costanti sono definite e sono utilizzate ad esempio nelle espressioni o negli assegnamenti. Anche le costanti si differenziano in base al tipo, infatti, 5 è diverso da 5.0. JAVA permette inoltre al programmatore di definire le proprie costanti dette costanti con nome. La sintassi è la seguente: Con la clausola PUBLIC definisco lo scope della costante, in questo caso tutta la classe, e con FINAL dico che il valore non è modificabile. Espressioni booleane Particolari espressioni che ritorna un valore di tipo booleane, true o false, e vengono utilizzate nelle strutture di selezione e nei cicli per decidere se eseguire alcune istruzioni oppure no. Tali espressioni sono composte da:

  • Operatori di confronto, necessari per confrontare due espressioni aritmetiche restituendo un valore booleano. Questi operatori sono: o > e <, maggiore e minore stretto; o >= e <=, maggiore e minore uguale; o ==, operatore di uguaglianza; o !=, operatore di disuguaglianza;
  • Operatori booleani, operatori utilizzati tra espressioni booleane. Questi operatori agiscono su una o più espressioni booleane e ritorna un valore booleano: o &&, operatore binario AND; o ||, operatore binario OR; o !, operatore unario di negazione; N.B. l’operatore && reputa l’intera espressione falsa non appena trova una espressione falsa, senza computare quelle avanzanti. Stesso vale per || che reputa l’intera espressione true non appena trova una espressione true, saltando poi tutte le altre. Per tale motivo sono stati inseriti gli operatori & e | che computano comunque tutta l’espressione in ogni caso. Possono essere utili quando all’interno di alcune sotto espressioni vado a eseguire delle operazioni che altrimenti potrebbero essere saltate dagli operatori && e ||.

Come abbiamo visto, i caratteri si specificano tra singoli apici (‘a’) mentre le stringhe vanno obbligatoriamente specificate tra doppi apici proprio per distinguerle dalle variabili di tipo char. N.B. una stringa può essere composta da un solo carattere ma essere comunque una stringa e, inoltre, esiste anche la stringa vuota a differenza del tipo char che non ammette il carattere vuoto ‘’ perché tale carattere non ha corrispondente nella tabella UNICODE. Ogni carattere all’interno della stringa ha una posizione precisa a partire da 0 ad aumentare fino all’ultimo carattere della stringa. Esempio di stringa di lunghezza 12 con carattere ‘C’ in posizione 0. Inoltre, le stringhe possono essere concatenate semplicemente tramite l’utilizzo dell’operatore +, unico utilizzabile tra stringhe: Il tipo String, nelle operazioni, prevale su qualsiasi altro tipo, infatti, se vado a concatenare una stringa con un qualunque tipo, primitivo e non, il tutto verrà convertito a stringa. Utile , concatenando la stringa vuota a un qualunque tipo stampabile, posso convertirlo in stringa. Metodi della classe String Essendo String una classe, essa offre una serie di metodi per la manipolazione delle stringhe, come:

  • compareTo(), metodo che confronta due stringhe in senso lessicografico e ritona un valore intero (tipo int) che sarà 0, se le due stringhe sono uguali, maggiore di 0, se la prima stringa è successiva alla seconda, minore di 0, se la prima stringa è precedente alla seconda. Questa comparazione si basa sul valore UNICODE di ogni carattere delle stringe, infatti, se tutte le lettere sono maiuscole o minuscole, verrà eseguita una comparazione alfabetica mentre, ad esempio, se la prima stringa presenta anche una sola maiuscola in più dell’altra, tale stringa sarà sicuramente antecedente all’altra perché le lettere maiuscole, nella tabella UNICODE, sono precedenti alle minuscole;

  • replace(), metodo che permette di sostituire tutte le occorrenze di un certo carattere con un altro carattere da noi specificato. Metodo che richiede due parametri, il carattere che si vuole modificare e quello che si vuole inserire, e ritorna una nuova stringa con tutte le occorrenze del carattere specificato modificate, se il carattere era presente, oppure la stringa uguale, se il carattere non era presente;

Nel primo caso, se verificata la condizione verrà eseguita istruzione1 mentre istruzione2 viene eseguita sempre. Nel secondo caso, istruzione1 e istruzione2 sono eseguite solo se l’espressione è verificata. Altre tipologie di istruzione If-Else sono gli If annidati, selezioni con all’interno altre selezioni, e gli If multi-ramo, sequenza di selezioni consecutive. Nel primo caso siamo in presenza di un If annidato, quindi, solo se espressione1 e espressione2 sono verificate posso eseguite i struzione. Nel secondo caso siamo in presenza di un If multi-ramo. In questo caso se espressione1 è verificata eseguo istruzione1 , in caso contrario, controllo espressione2 e se verificata eseguo istruzione. N.B. a un blocco If o Else può anche essere associata una istruzione vuota specificando subito il ; dopo il blocco. In questo caso, se la condizione si verifica, non viene eseguito nulla. In riferimento all’esempio, se si verifica espressione non succede nulla, mentre, se non si verifica, viene eseguita istruzione.

Switch

Enunciamo prima di tutto il Teorema di Böhm-Jacopini: tale teorema afferma che ogni programma può essere implementato con le solo strutture di selezione, sequenza e ciclo. Lo switch è un costrutto che non previsto dal teorema ma comunque molto utile perché ci permette di scrivere in modo più semplice e pulito operazioni di controllo dell’uguaglianza del contenuto di una variabile, con più valore costanti dello stesso tipo. Senza lo switch tale operazione potrebbe comunque essere eseguita da un If-Else multi-ramo. Lo switch è utilizzabile solo per verificare l’uguaglianza di variabili di tipo Int, Short, Char e String (e basta!) con valori costanti dello stesso tipo della variabile (1, ‘a’, “ciao” etc.). N.B. non è vietato a livello sintattico l’utilizzo dello switch con variabili Float e Double ma è sconsigliato perché tali variabili vengono approssimate e quindi un confronto esatto, con ==, potrebbe dare problemi.

In questo esempio il valore della variabile x viene confrontato con i valori costanti 10 e 11. Nel caso nessuno dei due casi si verifichi allora si entra nella sezione default , opzionale. N.B. l’istruzione break esce dallo switch, senza andare a valutare le istruzioni successive, per far continuare l’esecuzione dalle istruzioni dopo tale costrutto. Il break può anche essere omesso ma, in quel caso, verrà eseguita anche l’istruzione presente nel blocco case subito successivo a quello che ho appena verificato, senza andare a controllare l’uguaglianza con il valore costante specificato in quest’ultimo. Se io non metto nessun break nel mio switch, allora verranno eseguite tutte le istruzioni a partire dal primo case verificato fino alla istruzione del default, se presente. In questo caso, se il valore contiene 10 o 11, viene stampato a video “X contiene 11”, perché il primo caso non ha break. N.B. questa situazione può tornare utile se si vogliono eseguite le stesse operazioni per più casi diversi.

Break e Continue

Il break e il continue sono due istruzioni che permettono di modificare l’esecuzione di un ciclo:

  • Break, utilizzato per uscire dai cicli e passare alle istruzioni successive;
  • Continue, permette di saltare tutte le operazioni a lui successive e ricominciare l’esecuzione del ciclo dal controllo della condizione; Queste due istruzioni non sono previste dal Teorema di Böhm-Jacopini e infatti qualunque programma può essere scritto senza utilizzarle.

Cicli

Strutture fondamentali per l’implementazione della maggior parte dei programmi: permettono di eseguire una serie di istruzioni finché una espressione booleana è verificata. Esistono due tipi di cicli fondamentali, il While e il Do-While, più una terza tipologia opzionale, il For:

  • While, ciclo con condizione in testa, la condizione viene verificata subito e quindi tale ciclo potrebbe non essere eseguito neanche una volta;
  • random() , utilizzabile per generare un numero casuale appartenente all’intervallo [0,1). Tale metodo non richiede parametri e ritorna un numero di tipo double. Può essere anche utilizzato per generare numeri appartenenti a intervalli generici del tipo [x,y], con x ≤ y, agendo nel seguente modo: Infatti, moltiplicando il valore generato dalla random per la quantità di numeri compresi nell’intervallo, riesco a genere numeri presenti nell’intervallo [0,y). Sommando poi x modifico l’intervallo in [x,y]. Per vedere come utilizzare i metodi della classe Math → MathDemo.java

Metodi

Con metodi si intendono blocchi di istruzioni che svolgono determinate funzioni, richiamabili all’interno del codice tutte le volte che si vuole senza riscrivere le istruzioni che la implementano ogni volta. I metodi sono molto utili perché permettono di dividere un programma in moduli e semplificarne così lo sviluppo. In JAVA, i metodi sono definiti all’interno della classe a cui appartengono; una classe può contenere un numero finito, ma molto elevato, di metodi che possono essere scritti in qualsiasi parte della classe perché, in JAVA, l’ordine in cui sono definiti i metodi non influisce sulla loro chiamata, a differenza del C dove sono necessari i prototipi. I metodi sono definiti da una intestazione, necessaria per la loro chiamata, e da un corpo, contenente, tra parentesi graffe, le istruzioni che verranno eseguite.

Intestazione di un metodo in JAVA

  • Modificatori: parole riservate del linguaggio utilizzate per definire la visibilità del metodo e definire come questo può essere invocato. Modificatori che useremo saranno: o Public, se vogliamo che il metodo sia utilizzabile anche da altre classi presenti nella stessa directory; o Private, se vogliamo che il metodo sia utilizzabile dalla sola classe che lo ha definito; o Static, per rendere il metodo un metodo di classe e quindi permette la sua chiamata tramite nome della classe e non nome dell’istanza; Tali modificatori vanno inseriti nel seguente ordine, pena errore a compilazione:

public/private static nome_metodo

  • tipoRitorno , specificare se viene ritornato un dato al metodo chiamante e, in caso affermativo, specificarne il tipo. In particolare, un metodo può essere: o senza valore di ritorno, da specificare tramite parola riservata VOID. Un metodo VOID, detto anche procedura, viene usato per eseguire esclusivamente istruzioni e nel caso stampare a video; o con valore di ritorno, metodi che eseguono istruzioni e ritornano un valore al metodo chiamante, che può essere di qualunque tipo. In questo caso bisogna specificare il tipo del dato ritornato;
  • nomeMetodo , da utilizzare per farvi riferimento e richiamarlo. Il nome non deve contenere spazio e deve rispettare le regole viste nella sezione Sintassi di JAVA ;
  • Parametri formali: particolari variabili inizializzate al momento della chiamata del metodo con i valori passanti dal metodo chiamante, e utilizzabili solo all’interno del metodo che li definisce. I parametri vanno specificati tra parentesi e sono facoltativi ma, se il metodo li richiede, questi devo essere per forza specificati, pena errore a compilazione. Per quanto riguarda i tipi primitivi, il passaggio dei parametri viene fatto per valore, quindi, il valore della variabile passata al metodo viene copiato nel parametro formale associato e tutte le modifiche saranno separate. Per quanto riguarda i tipi non primitivi o composti, come gli array, si parla di passaggio per riferimento, infatti viene passato non il valore ma il suo riferimento necessario per reperire il valore presente nell’heap. In questo caso eventuali modifiche saranno visibili anche nel metodo chiamante. Inoltre, variabili presenti in metodi diversi hanno scope diverso e quindi possono avere anche lo stesso nome perché legate ad aree di memoria diverse; N.B. anche nel passaggio di parametri valgono le regole di cast implicito ed esplicito. Per vedere la differenza tra passaggio per valore e passaggio per riferimento → Se un metodo è dichiarato non void, questo deve per forza contenere al suo interno almeno una istruzione return , istruzione necessaria per restituire un valore al metodo chiamante, pena errore a compilazione. Se invece un metodo è void, è facoltativo l’utilizzo del return , che può comunque essere usato, senza specificare il valore da tornare, per interrompere l’esecuzione del metodo e tornare direttamente al metodo chiamante. N.B. è sempre meglio mettere un solo return in ogni metodo non void; Un metodo, se dichiarato public e static, risulta visibile e utilizzabile da tutte le classi presenti nella stessa directory della classe che lo contiene. La sintassi per richiamarlo è NomeClasse.nomeMetodo , bisogna infatti specificare il nome della classe, e non dell’istanza,