Linguaggio Java. Concetti base. La prima applicazione Java



Documenti analoghi
Corso sul linguaggio Java

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Oggetti Lezione 3. aspetti generali e definizione di classi I

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Linguaggio Java. Robusto. Orientato agli oggetti. Protegge e gestisce dagli errori. Non permette costrutti pericolosi

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Operazioni di input/output. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Programmazione a Oggetti Lezione 10. Ereditarieta

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Introduzione alla programmazione in C

Allocazione dinamica della memoria - riepilogo

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Corso di Informatica

Modulo 4: Ereditarietà, interfacce e clonazione

Gestione delle Eccezioni

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Funzioni in C. Violetta Lonati

Java: Compilatore e Interprete

Parola chiave extends

OBIETTIVI SPECIFICI DI APPRENDIMENTO

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Variabili e tipi di dato

Università degli studi di Roma Tor Vergata Ingegneria Medica Informatica I Programma del Corso

Programmazione II. Lezione 4. Daniele Sgandurra 30/09/2011.

dall argomento argomento della malloc()

Richiesta pagina PHP (es: index.php)

LINGUAGGI DI PROGRAMMAZIONE

costruttori e distruttori

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Realizzazione di una classe con un associazione

Inizializzazione, Assegnamento e Distruzione di Classi

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

I file di dati. Unità didattica D1 1

Le variabili. Olga Scotti

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Struttura di un programma Java

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Organizzazione degli archivi

Linguaggio C. Fondamenti. Struttura di un programma.

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Introduzione al Linguaggio C

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

Lezione 8. La macchina universale

20 - Input/Output su File

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

LABORATORIO DI PROGRAMMAZIONE EDIZIONE 1, TURNO B

Esercitazione n 4. Obiettivi

La struttura dati ad albero binario

Oggetto: MASTER DI ALTA FORMAZIONE PROFESSIONALE IN PROGRAMMATORE JAVA PARTECIPAZIONE GRATUITA

Il File System. Il file system

MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

Programmazione in Java Parte I: Fondamenti

SOMMARIO INTRODUZIONE...XV CAPITOLO 1: PRESENTAZIONE...1 CAPITOLO 2: FONDAMENTI DI JAVA...39

Libreria standard Java possiede un enorme libreria di classi standard organizzata in vari package che raccolgono le classi secondo un organizzazione

Link e permessi. Corso di Laurea Triennale in Ingegneria delle TLC e dell Automazione. Corso di Sistemi Operativi A. A

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Capitolo Silberschatz

Database. Si ringrazia Marco Bertini per le slides

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

4 3 4 = 4 x x x 10 0 aaa

Introduzione a Classi e Oggetti

GESTIONE DEI PROCESSI

INTRODUZIONE INTRODUZIONE JAVA JAVA

Programmazione ad oggetti

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

10 - Programmare con gli Array

Il Sistema Operativo: il File System

Proff. Fabio Ciao e Raffaele Bortone

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Prova di Laboratorio di Programmazione

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Concetto di Funzione e Procedura METODI in Java

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Il file system. meccanismi di accesso e memorizzazione delle informazioni (programmi e dati) allocate. in memoria di massa

GESTIONE INFORMATICA DEI DATI AZIENDALI

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

!"#$%&&'()#*%+%+!"#$"',,'()#*%+ -")%*&'&'+'$.)+-$$%&&) !"#$%&&'(%)'*+%",#-%"#.'%&'#/0)-+#12"+3,)4+56#7+#.')8'9

4. Un ambiente di sviluppo per Java

Gestione di errori e situazioni eccezionali. Gestione delle eccezioni. Gestione tradizionale di errori e situazioni eccezionali (2)

Obiettivi d esame PHP Developer Fundamentals on MySQL Environment

Protezione. Protezione. Protezione. Obiettivi della protezione

Corso di Programmazione ad Oggetti

5.3 TABELLE RECORD Inserire, eliminare record in una tabella Aggiungere record Eliminare record

Access. P a r t e p r i m a

Sistemi Operativi. Interfaccia del File System FILE SYSTEM : INTERFACCIA. Concetto di File. Metodi di Accesso. Struttura delle Directory

La selezione binaria

Soluzione dell esercizio del 2 Febbraio 2004

Tipi di dato-prima parte

Gestione delle eccezioni in Java

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

Tricks & Tips. [Access] Tutorial - ActiveX - Controllo Tree View. - Michele de Nittis - Versione: 1 Data Versione: venerdì 30 agosto 2002

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Algoritmi e strutture dati. Codici di Huffman

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Transcript:

Linguaggio Java Concetti base La prima applicazione Java File HelloWorld.java public class HelloWorld { public static void main (String args[]) { System.out.println ( Hello world! ); > javac HelloWorld.java > java HelloWorld HelloWorld! > Compilazione (produce HelloWord.class) Esecuzione 1

Classi Non contengono istruzioni Contengono metodi Metodi Contengono le istruzioni Attivati solo dall interno di un altro metodo Eventuale uso di parametri & valore di ritorno Tra i vari metodi esiste il metodo main da cui si parte Lettere minuscole VS Maiuscole Metodi 2

Metodi Analoghi alle funzioni C Meccanismo di attivazione call & return Parametri in ingresso Variabili locali & istruzioni Valore di ritorno Definizione tiporestituito nomemetodo ( [tipo 1 par 1 [, tipo 2 par 2 [tipo n par n ]]] ) {... <corpo>... Invocazione Parametri attuali (chiamante) Parametri formali (chiamato definizione) Passaggio di parametri Possono essere: Dati primitivi Reference Avviene come in C: sempre per valore Nel caso di parametri reference, quello che viene copiato è il reference, NON l oggetto Equivale al passaggio per riferimento 3

Valore di ritorno Analogo al linguaggio C Il tipo del metodo e il tipo ritornato devo coincidere Possibilità di definire metodi ricorsivi Tipi primitivi, Costanti e Operatori 4

Tipo primitivo In un linguaggio ad oggetti puro i dati dovrebbero essere definiti sotto forma di oggetti Per efficienza Java definisce dati primitivi La dichiarazione di una istanza (variabile) alloca spazio Un valore è associato direttamente alla variabile (e.g, i == 0 ) Ne vengono definiti dimensioni e codifica Rappresentazione indipendente dalla piattaforma Tipo Dimensione Codifica boolean 1 bit - char 16 bit Unicode byte 8 bit Intero con segno C2 short 16 bit Intero con segno C2 int 32 bit Intero con segno C2 long 64 bit Intero con segno C2 float 32 bit IEEE 754 sp double 64 bit IEEE 754 dp void - - 5

Costanti I tipi numerici, i char e le stringhe seguono la sintassi C Esempi 123 (int) 256789L (L o l = long) 0567 (ottale) 0xff34 (hex) 123.75 0.12375e+3 (float o double) a % \n \123 (\ introduce codice ASCII) 1 prova\n Tipo boolean (assente in C) Esempi true false Non esiste il tipo reference Modificatore final final float pigreco = 3.14; pigreco = 16.0; // NO Dichiara costanti simboliche Dovrebbero essere dichiarate sempre static (per non sprecare spazio per ogni istanza) 6

Operatori per Interi e Reali Operatori aritmetici, relazionali, e di assegnazione seguono la sintassi del C Aritmetici: + - * / % Relazionali: ==!= > < >= <= Bitwise (interi): & ^ << >> ~ Di assegnazione: = += -= *= /= %= &= = ^= Di assegnazione/incremento: ++ -- I caratteri sono considerati interi (come in C) Operatori per Booleani Seguono la sintassi del C && (AND) (OR)! (NOT) Attenzione: Fenomeno short-circuit f1(x) && f2(y) && f3(z) f2 e f3 possono NON essere valutate Gli operatori logici agiscono solo su booleani Un intero NON viene considerato un booleano come in C Gli operatori relazionali forniscono valori booleani 7

Operatori su reference Per i puntatori/reference, sono definiti: Gli operatori relazionali == e!= N.B. test sul puntatore NON sull oggetto Le assegnazioni L operatore punto NON è prevista l aritmetica dei puntatori Operatori matematici Operazioni matematiche complesse sono permesse dalla classe (!) Math (package java.lang): Math.sin (x) calcola sin(x) Math.sqrt (x) calcola x^(1/2) Math.PI ritorna pi Math.abs (x) calcola x Math.exp (x) calcola e^x Math.pow (x, y) calcola x^y Esempio z = Math.sin (x) Math.PI / Math.sqrt(y) 8

Strutture elementari Commenti Commenti tipo C (multilinea) /* questo e` un commento che si estende su due linee */ Commenti su linea singola // questo e` un commento monolinea Commenti di documentazione /** commento per javadoc. */ 9

Blocchi e regole di scope I blocchi Sono simili ai blocchi del C Definiti da { e Visibilità (scope) Analoga a quella del linguaggio C I parametri sono locali al metodo Le variabili possono essere Locali al metodo Locali al blocco Vasto uso di definizioni locali Ogni blocco Introduce un nuovo scope per le variabili Le variabili si possono dichiarare All inizio del blocco All interno del blocco { int x; for (int i=0; i<n; i++){ x = 12;... int y;... 10

Costrutti Condizionali Stessa tipologia e sintassi del C if-else switch Attenzione: gli interi NON sono booleani NON è possibile fare test del tipo if(x) con x intero Occorre usare operatori relazionali if (x!= 0) Costrutti iterativi Semantica e sintassi analoga al C while do-while for break continue 11

Input Output (Elementare) L input/output di caratteri e di interi è relativamente spartano Richiede l utilizzo di concetti complessi Eccezioni I/O usualmente introdotti in sezioni avanzate dei corsi Java 12

Output Comandi: System.out.println ( ) System.out.print ( ) Esempi: Visualizzare il valore di una variabile System.out.print (x); Visualizzare una stringa System.out.print ( Valore = ); Visualizzazione con sequenze di escape System.out.print ( \tvalore =\n ); Utilizzo dell operatore di concatenazione di stringhe (vedere String) System.out.println ( Concatenazione + di + stringhe ); In costrutto di concatenazione vale anche per tipi diversi dal tipo String System.out.println ( Valore = + x); 13

Input Lettura di un vettore di byte byte vettore[] = new byte[10]; try{ System.in.read (vettore); catch (Exception e) { Trasformazione della stringa di byte in valori booleani valori interi (con segno) valori reali (con segno) etc. byte s[] = new byte[10]; int val = 0; try{ System.in.read (s) catch (Exception e) { for (int i=0; i<s.length; i++) { if (s[i]>= 0 && s[i]<= 9 ) val = val * 10 + s[i] 0 ; 14

Input/Output in modalità grafiche Java è stato progettato per lavorare in modalità grafiche Una possibilità è utilizzare la classe JOptionPane definita nel package javax.swing Richiede l utilizzo di concetti avanzati (package swing) // Importa Classe JOPtionPane import javax.swing.joptionpane; String inputs; String outputs; int nvalue; // Input inputs = JOptionPane.showInputDialog ( Messaggio"); nvalue = Integer.parseInt (inputs); // Output // (previa creazione della stringa output) JOptionPane.showMessageDialog ( null, output, Messaggio, JOptionPane.INFORMATION_MESSAGE ); 15

Linguaggio Java Array Array Simili al C Sequenze ordinate di Tipi primitivi (int, float, etc.) Riferimenti ad oggetti (vedere classi!) Elementi dello stesso tipo Indirizzati da indici Raggiungibili con l operatore di indicizzazione (parentesi quadre []) Raggruppati sotto lo stesso nome Non possono contenere oggetti (solo dati primitivi o reference a oggetti) 1

In Java gli array sono Oggetti Sono allocati nell area di memoria riservata agli oggetti creati dinamicamente (heap) Dimensione Può essere stabilita a run-time (quando l oggetto viene creato) È fissa (non può essere modificata) E nota e ricavabile per ogni array Array Mono-dimensionali (vettori) 2

Dichiarazione di Array Dichiarazione di un riferimento a un array Stile Java (array di int) int [ ] vet; Stile C/C++ int vet[ ]; La dichiarazione di un array non assegna alcun spazio vet == null Creazione di un Array L operatore new crea un array: Con costante numerica int[] vet; vet = new int[10]; Con costante simbolica final int ARRAY_SIZE = 10; int[] vet; vet = new int[array_size]; Con valore definito a run-time int[] vet; definizione di x (run-time) vet = new int[x]; 3

L operatore new inizializza le variabili 0 - per variabili di tipo numerico (inclusi i char) false - per le variabili di tipo boolean Utilizzando un inizializzatore (che permette anche di riempire l array) int[] primi = {2,3,5,7,11,13; int [] pari = {0, 2, 4, 6, 8, 10,; // La virgola finale e facoltativa // (elenchi lunghi) Dichiarazione e creazione possono avvenire contestualmente Esempi int[] vet; vet null heap myv = new int[6]; myv heap 0 0 0 0 0 0 int [] primi = {2,3,5,7,11,13; primi heap 2 3 11 7 5 13 4

Operazioni su Array L attributo length indica la lunghezza dell array (numero di elementi) Gli elementi vanno da 0 a length-1 for (int i=0; i<vet.length; i++) vet[i] = i; In Java viene fatto il bounds checking Maggior sicurezza Maggior lentezza di accesso Il riferimento ad array Non è un puntatore al primo elemento È un puntatore all oggetto array Incrementandolo non si ottiene il secondo elemento 5

Array di oggetti Per gli array di oggetti (e.g., Integer) Integer [] vet = new Integer [5]; ogni elemento e un riferimento L inizializzazione va completata con quella dei singoli elementi vet[0] = new Integer (1); vet[1] = new Integer (2); vet[4] = new Integer (5); Confrontare con int [] vet = new {1, 2, 3, 4, 5; Array Multi-dimensionali (Matrici) 6

Array contenenti riferimenti ad altri array Sintatticamente sono estensioni degli array a una dimensione Esempio int [][] tabella = new int[2][3]; tabella[0][2] = 10; tabella heap tabella[0][2] tabella[0] 0 0 0 10 00 heap Sono possibili righe di lunghezza diverse (matrice = array di array) Esempio int[][] triangle = new int[3][] triangle null null null heap for (int i=0; i< triangle.length; i++) triangle[i] = new int[i+1]; triangle 0 0 0 0 0 0 heap 7

Le righe non sono memorizzate in posizioni adiacenti Possono essere spostate facilmente Esempio // Scambio di due righe double[][] balance = new double[5][6];... double[] temp = balance[i]; balance[i] = balance[j]; balance[j] = temp; 8

Linguaggio Java Stringhe e Caratteri Caratteristiche principali Classi disponibili String Modella stringhe (sequenze array di caratteri) Non modificabile (dichiarata final) StringBuffer Modificabile Character CharacterSet 1

Classe String Definizione String mystring; mystring = new String ( stringa esempio ); Oppure String mystring = new String ( stringa esempio ); Solo per il tipo String vale String mystring = stringa esempio ; Il carattere può essere incluso come \ Il nome della stringa è il riferimento alla stringa stessa Confrontare due stringhe NON significa confrontare i riferimenti 2

Esempi String[] s = new String[6]; s heap null null null null null null s[1] = new String( abcd ); s heap null null null null null abcd String[] p = {new String( Pippo ), new String( Pluto ) ; p heap Pippo Pluto Operatori principali I metodi che gestiscono il tipo String NON modificano la stringa ma ne creano una nuova Concatenazione di stringhe Operatore concat mystring1.concat(mystring2) String s2 = Ciao.concat( a tutti ).concat(! ); String s2 = Ciao.concat( a tutti.concat(! )); Utile per definire stringhe che occupano più di una riga 3

Operatore + questa stringa + e` formata da tre + stringhe La concatenazione funziona anche con altri tipi, che vengono automaticamente convertiti in stringhe System.out.println ( pi Greco = + 3.14); System.out.println ( x = + x); Lunghezza stringa int length() mystring.length() Ciao.length() restituisce 4.length() restituisce 0 Se la lunghezza è N, i caratteri sono indicizzati da 0 a N-1 Carattere i-esimo char charat (int) mystring.charat(i) Confronta stringa con s boolean equals (String s) mystring.equals ( stringa ) ritorna true o false boolean equalsignorecase (String s) mystring.equalsignorecase ( StRiNgA ) 4

Confronta con s facendone la differenza int compareto (String str) mystring.compareto ( stringa ) ritorna un valore >=< 0 Trasforma int in String String valueof (int) Disponibile per tutti tipi primitivi Restituisce indice prima occorrenza di c int indexof (char c) int indexof (char c, int fromctrn) Altri metodi String touppercase (String str) String tolowercase (String str) String substring ( int startindex, int endindex) String substring (int startindex) 5

Esempio... String s1, s2; s1 = new String( Prima stringa ); s2 = new String( Prima stringa ); System.out.println(s1); /// Prima stringa System.out.println( Lunghezza di s1 = + s1.length()); // 26 if (s1.equals(s2))... // true if (s1 == s2)... // false String s3 = s3.substring (2, 6); // s3 == ima s... StringTokenizer La classe StringTokenizer permette l estrazione di sottostringhe StringTokenizer (String str, String delim) Costruisce un estrattore di token per la stringa str delim e il delimitatore ricercato tra i token estratti La classe StringTokenizer mette quindi a disposizione metodi per la gestione dei token public boolean hasmoretokens() public String nexttoken() 6

Esempio // il numero di token e noto: nome, eta, reddito String str; StringTokenizer st = new StringTokenizer(str," "); // Anche: StringTokenizer st = // new StringTokenizer (str); while (st.hasmoretokens()){ String token = st.nexttoken(); Integer.parseInt(token) // int eta = Integer.parseInt (st.nexttoken ()); // double reddito = Double.parseDouble // (st.nexttoken ()); Classe StringBuffer Un oggetto String NON è modificabile Una volta creato non possiamo aggiungere, eliminare, modificare caratteri (i metodi visti creano nuove stringhe) Tale restrizione è dovuta a ragioni di efficienza 7

Le considerazione precedenti non sono vere per la classe StringBuffer Esempio StringBuffer mystringbuffer = new stringbuffer ( stringa modificabile ); mystringbuffer.setcharat (8, M ); // Trasforma in stringa Modificabile Si usa raramente Un oggetto StringBuffer non può essere utilizzato per operazioni di I/O System.out.println (mystringbuffer.tostring()); Metodi: Aggiunta di caratteri mystringbuffer.append ( aggiunta ); insert delete reverse 8

Classe Character La classe involucro Character si trova in java.lang Include metodi statici per verificare le proprietà di un carattere Esempio String s = Stringa Generica. char c = s.charat (0); Character.isUpperCase(c) // true Character.isDigit(c) // false Predicati vari boolean isletter (char c) boolean isdigit (char c) boolean isletterordigit (char c) boolean isspacechar (char c) boolean islowercase (char c) boolean isuppercase (char c) Trasformazioni varie char touppercase (char c) char tolowercase (char c) 9

Linguaggio Java Metodi & Classi: Concetti base Classi: Concetti Base Estendono il concetto di struttura del linguaggio C Definiscono: I dati (detti campi o attributi) Le azioni (dette metodi o funzioni membro) che sui dati agiscono Possono essere definite Dal programmatore (ex. Automobile) Dall ambiente Java (ex. String, System, etc.) 1

La gestione di una classe avviene mediante Definizione della classe Instanziazione di Oggetti della classe Definizione di un Classe 2

Definizione class <nomeclasse) { <campi> <metodi> Esempi Classe contenente dati ma non azioni class DataOnly { boolena b; char c; int i; float f; Classe contenente dati e azioni class Automobile { String colore; String marca; boolean accesa; Nome Attributi void mettiinmoto() { accesa = true; void vernicia (String nuovocol) { Messaggi/ colore = nuovocol; Metodi Automobile colore marca accesa mettiinmoto vernicia stampastato void stampastato () { System.out.println( Questa auto e` una + marca + + colore); if (accesa) System.out.println( Il motore e` acceso ); else System.out.println( Il motore e` spento ); 3

Dati & Metodi Public: visibili all esterno della classe Private: visibili solo dall interno della classe Protected: Nessuna specifica (amichevole): La definizione di classe non rappresenta alcun oggetto. Polimorfismo (overloading) 4

Una classe può avere più metodi con lo stesso nome I metodi devono essere distinguibili in base al Numero dei parametri Tipo dei parametri Il metodo da eseguire viene scelto in base al Numero e tipo di parametri Non esiste alcuna discriminazione sul valore di ritorno Esempio class Automobile { String colore; void vernicia () { colore = bianco ; void vernicia (int i) { switch (i) { case 1: colore = nero ; break; void vernicia (String nuovocol) { colore = nuovocol; 5

Instanziare una Classe Crea degli oggetti appartenenti a una classe Gli oggetti sono caratterizzati da Classe di appartenenza - tipo (ne descrive attributi e metodi) Stato (valore attuale degli attributi) Identificatore univoco (reference - handle -puntatore) 6

Per creare un oggetto occorre Dichiarare una istanza Tecnica analoga a quella utilizzata per i tipi primitivi La dichiarazione non alloca spazio ma solo una riferimento (puntatore) che per default vale null Allocazione e inizializzazione Riservano lo spazio necessario creando effettivamente l oggetto appartenente a quella classe a Oggetto Automobile Creare un Oggetto Il costrutto new Crea una nuova istanza della classe specificata, allocandone la memoria Restituisce il riferimento all oggetto creato Automobile a = new Automobile (); Motorcycle m = new Motorcycle (); String s = new String ( ABC ); Chiama il costruttore del nuovo oggetto (vedere in seguito) 7

Utilizzo della Classe Per gestire una classe occorre Accedere ai metodi della classe Messaggi Accedere agli attributi della classe 8

Messaggi L invio di un messaggio provoca l esecuzione del metodo Inviare un messaggio ad un oggetto Usare la notazione puntata rif-oggetto.messaggio(parametri) Sintassi analoga alla chiamata di funzioni in linguaggio C I metodi definiscono l implementazione delle operazioni I messaggi che un oggetto può accettare coincidono con i nomi dei metodi mettiinmoto, vernicia, etc. I messaggi includono i parametri vernicia( Rosso ) Esempi Automobile a = new Automobile(); a.mettiinmoto(); a.vernicia( Blu ); 9

Caso particolare Metodi che devono inviare messaggi allo stesso oggetto cui appartengono In questo caso la notazione puntata è superflua in quanto è sottinteso il riferimento public class Libro { int npagine; public void leggipagina (int npagina) { public void leggitutto () { for (int i=0; i<npagine; i++) leggipagina (i); Attributi Stessa notazione puntata dei messaggi rif-oggetto.attributo Il riferimento viene usato come una qualunque variabile Automobile a=new Automobile(); a.colore = Blu ; boolean x = a.accesa; 10

I metodi che fanno riferimento ad attributi dello stesso oggetto possono tralasciare il rif-oggetto public class Automobile { String colore; void vernicia(){ colore = Verde ; // colore si riferisce // all oggetto corrente Esempio (messaggi e attributi) public class Automobile { String colore; public void vernicia () { colore = bianco ; public void vernicia (String nuovocol) { colore = nuovocol; Automobile a1, a2; a1 = new Automobile (); a1.vernicia ( verde ); a2 = new Automobile (); 11

Construttore Costruttore Specifica le operazioni di inizializzazione (attributi, etc.) che vogliamo vengano eseguite su ogni oggetto della classe appena viene creato Tale metodo ha Lo stesso nome della classe Tipo non specificato Non possono esistere attributi non inizializzati Gli attributi vengono inizializzati comunque con valori di default 12

Se non viene dichiarato un costruttore, ne viene creato uno di default vuoto e senza parametri Spesso si usa l overloading definendo diversi costruttori Si osservi che la distruzione di oggetti (garbage-collection) non è a carico del programmatore Esempio (costruttori con overloading) Class Window { String title; String color; // Finestra senza titolo ne` colore Window () {... // Finestra con titolo senza colore Window (String t) {... title = t; // Finestra con titolo e colore Window (String t, String c) {... title = t; color = c; 13

Puntatore Auto-referenziante Operatore this La parola riservata this e utilizzata quale puntatore autoreferenziante this riferisce l oggetto (e.g., classe) corrente Utilizzato per Referenziare la classe appena istanziata 14

Evitare il conflitto tra nomi class Automobile{ String colore;...... void vernicia (String colore) { this.colore = colore;... Automobile a2, a1 = new Automobile; a1.vernicia( bianco ); // a1 == this a2.vernicia( rosso ); // this == a2 Evitare il conflitto tra nomi class Automobile{ String colore;...... void vernicia (String colore) { this.colore = colore;... Automobile a2, a1 = new Automobile; a1.vernicia( bianco ); // a1 == this a2.vernicia( rosso ); // this == a2 15

Notazioni Puntate Le notazioni puntate possono essere combinate System.out.println( Hello world! ); System è una classe del package java.lang out è una variabile di classe contenente il riferimento ad un oggetto della classe PrintStream che punta allo standard output println è un metodo della classe PrintStream che stampa una linea di testo Operazioni su reference Definiti gli operatori relazionali == e!= Attenzione: il test di uguaglianza viene fatto sul puntatore (reference) e NON sull oggetto Stabiliscono se i reference si riferiscono allo stesso oggetto È definita l assegnazione È definito l operatore punto (notazione puntata) NON è prevista l aritmetica dei puntatori 16

Visibilità ed encapsulation Motivazione Modularità = diminuire le interazioni Info Hiding = delegare responsabilità Supporto sintattico private attributo/metodo visibile solo da istanze della stessa classe public attributo/metodo visibile ovunque 17

Accesso Private Metodo della stessa classe Si Metodo di altra classe No Public Si Si Getters e setters Aggiungere metodi per leggere scrivere un attributo privato Può infrangere (indirettamente) l encapsulation String getcolor() { return color; void setcolor(string newcolor) { color = newcolor; 18

class Automobile { public String colore; Automobile a = new Automobile(); a.colore = bianco ; // ok class Automobile { private String colore; public void vernicia(string colore) {this.colore = colore; // ok Automobile a = new Automobile(); a.colore = bianco ; // error a.vernicia( verde ); // ok Variabili e metodi di classe 19

Variabili di classe Rappresentano proprietà comuni a tutte le istanze Esistono anche in assenza di istanze (oggetti) Dichiarazione: static Accesso: nome-classe.attributo class Automobile { static int numeroruote = 4; Automobile.numeroRuote; Metodi di classe Funzioni non associate ad alcuna istanza Dichiarazione: static Accesso: nome-classe.metodo() class HelloWorld { public static void main (String args[]) { System.out.println( Hello World! ); double y = Math.cos(x); // cos metodo static 20

Linguaggio Java Ereditarietà Ereditarietà Meccanismo Java che realizza la Specializzazione Generalizzazione permettendo l estensione di vecchie classi in nuove classi La classe che eredita da un altra Eredita attributi e operazioni Può modificare attributi/operazioni ereditati (override) Può aggiungere attributi/operazioni 1

Sintassi public class <nuovaclasse> extends <vecchiaclasse> {... Esempio 1 Automobile colore marca accesa mettiinmoto vernicia stampastato Automobile elettrica eredita attributi (colore, marca, accesa) operazioni (vernicia, stampastato) modifica (override) mettiinmoto aggiunge attributi (batteriecariche) operazioni (ricarica ) AutomobileElettrica batteriecariche ricarica mettiinmoto 2

class Automobile { String colore; String marca; boolean accesa; void mettiinmoto() {accesa = true; void vernicia (String nuovocol) {... void stampastato () {... class AutomobileElettrica extends Automobile { boolean batteriecariche; void ricarica() {batteriecariche=true; void mettiinmoto() { if(batteriecariche) accesa=true; else accesa=false; Esempio 2 Impiegato nome stipendio aumentastipendio stampa Dirigente grado aumentastipendio stampa aumentagrado stampa Segretario 3

class Impiegato { private String nome; private double stipendio; public Impiegato(String n, double s) { nome = n; stipendio = s; public void aumentastipendio (double percentuale) { stipendio *= 1 + percentuale / 100; public void stampa() { System.out.println( Impiegato + nome + + stipendio); class Dirigente extends Impiegato { int grado; public Dirigente(String n, double s) { nome = n; stipendio = s; public void aumentastipendi (double percentuale) { int bonus = grado * 3; // 3% di bonus per ogni grado stipendio *= 1+(percentuale+bonus)/100; public void stampa() { System.out.println( Dirigente + nome + + stipendio); public void aumentagrado() { grado++; 4

Visibilità: costrutto protected class Impiegato { private String nome; private double stipendio; class Dirigente extends Impiegato { void stampa() { System.out.println( Dirigente + nome + + stipendio); INACCESSIBILI Visibilità di attributi e metodi public: sono accessibili senza restrizioni private: sono accessibili solo all interno della classe in cui sono definiti protected: sono accessibili dalla classe e in più sono accessibili dalle classi derivate da quella in cui sono definiti 5

Private Classe stessa Si Classe derivata No Altra classe No Protected Si Si No Public Si Si Si Puntatori this e super Puntatori this riferisce l oggetto corrente super riferisce l oggetto sopra this ( superoggetto ) ovvero la superclasse class AutomobileElettrica extends Automobile { boolean batteriecariche; void ricarica() { batteriecariche=true; void mettiinmoto() { if(batteriecariche) super.mettiinmoto(); 6

Ereditarietà e costruttori Ogni oggetto contiene un istanza della propria superclasse La superclasse deve essere inizializzata Il compilatore Java inserisce automaticamente una chiamata al costruttore di default del superoggetto La chiamata al costruttore del superoggetto viene inserita come PRIMA istruzione del nuovo costruttore L esecuzione dei costruttori procede dalla radice verso il basso nella gerarchia di ereditarietà È garantito che quando un metodo di una classe viene eseguito (costruttore compreso), la superclasse sia già inizializzata completamente 7

Esempio class Arte { Arte() { System.out.println( Costruttore Arte ); class Disegno extends Arte { Disegno() { System.out.println( Costruttore Disegno ); class DisegnoAnimato extends Disegno { DisegnoAnimato() { System.out.println( Costruttore DisegnoAnimato ); DisegnoAnimato d = new DisegnoAnimato(); Costruttore classe Arte Costruttore classe Disegno Costruttore classe Disegno Animato Costruttori con parametri Se i costruttori hanno parametri Il compilatore non è in grado di inserire automaticamente la chiamata Le istanze delle superclassi devono essere inizializzate correttamente tramite chiamate esplicite ai costruttori (utilizzando la variabile super) La chiamata del costruttore della superclasse deve essere la PRIMA istruzione del costruttore Il compilatore lo controlla L ordine di inizializzazione degli oggetti è sempre quello giusto 8

Esempio class Dirigente extends Impiegato { int grado; Dirigente(String n, double s) { super (n,s); grado = 1; void aumentastipendio(double percentuale) { int bonus = grado * 3; super.aumentastipendio(percentuale+bonus);... La classe Object 9

Albero di derivazione Tutte le classi in Java derivano dalla classe Object Non si può definire una classe che non eredita da nessun altra classe Ogni classe esclusa Object ha una superclasse Se non specificato altrimenti, una classe deriva direttamente da Object class Mammifero {... Object Mammifero La classe Object Contiene alcuni metodi generali Esempi String tostring() Restituisce una stringa che rappresenta univocamente l oggetto boolean equals(object obj) Restituisce vero se obj e this sono lo stesso oggetto Normalmente questi metodi sono ridefiniti (overridden) nelle classi derivate 10

Dynamic binding Per binding si intende l associazione messaggio metodo Automobile a; for(int i=0; i<garage.length; i++){ a = garage[i] a.mettiinmoto(); Automobile colore marca accesa mettiinmoto vernicia stampastato messaggio metodo? AutomobileElettrica batteriecariche ricarica mettiinmoto 11

Due scelte possibili Statico Associazione fatta in base al tipo compile time Dinamico (default in Java) Associazione fatta in base al tipo run time Java sceglie il corretto metodo dell appropriata sottoclasse associata all oggetto N.B. se le classi non sono legate da ereditarietà è possibile una scelta sola Moto m; m.mettiinmoto(); Aereo a; a.mettiinmoto(); Moto Aereo mettiinmoto mettiinmoto L attributo final Definisce un dato elemento come non più modificabile Applicato a variabile la trasforma in costante Applicato a un metodo Ne impedisce l overriding in classi derivate Ne rende possibile l inlining (binding statico - più efficiente) Applicato a una classe Impedisce di derivare da essa altre classi (la classe deve essere una foglia dell albero di ereditarietà) 12

Casting di oggetti Type Casting di Oggetti È possibile modificare il tipo di un riferimento ad oggetto soltanto tra tipi in relazione di ereditarietà L oggetto rimane invariato EssereVivente Downcasting Animale Vegetale Upcasting EssereUmano Fungo Lichene 13

Upcasting Caratteristiche È sempre affidabile (è sempre vero che un auto elettrica è un auto) È automatico Poichèogniclasseè(direttamenteo indirettamente) sottoclasse di Object è sempre possibile fare upcast di qualsiasi oggetto su Object QualcheClasse a = new QualcheClasse(); Object o; o = a; (vedi Collection) Downcasting Caratteristiche Non è automatico (richiede cast esplicito) Può non essere affidabile Non tutte le auto sono autoelettriche Un downcasting può provocare un errore run-time Per evitare un errore a run time instanceof (Run Time Type Identification) Automobile a = new Automobile(); AutoElettrica ae; if (a instanceof AutoElettrica){ ae = (AutoElettrica) a; ae.ricarica(); 14

Linguaggio Java Package, Tipi primitivi/classi Wrapper, Classe astratta, Interfaccia, Memorizzazione Package 1

Motivazione La classe è un elemento di modularizzazione più potente della procedura Progresso rispetto al modello procedurale È ancorapiccolo Occorre un livello di modularità più ampio Insieme di classi Regole Un package è un insieme logico di classi Fisicamente le classi stanno su uno o più file, tutti contenuti in una stessa directory Ogni package definisce un suo scope (ambiente di visibilità dei nomi) Stessi nomi in package diversi senza conflitti 2

Nomi Un package è identificato univocamente da un nome costruito gerarchicamente (notazione puntata) java.util grafica.altarisoluzione.miopackage Convenzione per generare nomi unici Usare come prefisso del nome del package il proprio nome internet invertito it.polito.softeng.miopackage Creazione di un package Tutti i file del package devono contenere la riga package <nomepackage>; quale prima riga del file (tranne i commenti) Specifica che la classe pubblica contenuta in quel file fa parte di quel package 3

Utilizzo di un package Un package può essere utilizzato Mediante importazione del package Mediante riferimento esplicito Importare un package significa Importare la singola classe del package import nomepackage.nomeclass; Importare tutte le classi del package import nomepackage; Esempi import java.util.arraylist; import java.util.*; import java.util; Riferimento esplicito (senza import) Specificare il nome per intero... java.util.arraylist... Invece di import java.util.*;... ArrayList Collisioni Se due package definiscono classi omonime possono essere importati entrambi La collisione si verifica solo quando si utilizzano gli elementi in conflitto 4

Storage (directory) La directory in cui il package risiede deve avere un path che corrisponde a quello del nome java.util <-> java/util Il path è relativo a uno dei percorsi di ricerca automatica definiti nella variabile di ambiente CLASSPATH Un sottoalbero di package può essere sostituito da un File zippato (.zip) File archiviato (.jar) Esempio CLASSPATH=c:\java\jdk\lib;c:\java\mylibs Per installare il package didattica.esercizi si hanno 2 possibilità / java jdk lib didattica mylibs didattica esercizi esercizi 5

Visibilità Le regole di encapsulation / visibilità si applicano anche ai package Euristica: minimizzare il numero di classi/attributi/metodi visibili al di fuori di un package Modificatori di visibilità Su attributi o metodi di classi entro package private: visibile solo da istanze della stessa classe public: visibile da istanze di qualsiasi classe all interno del package anche da istanze all esterno del package SE la classe è public package VALORE DI DEFAULT: visibile da istanze di qualsiasi classe, all interno del package 6

Accesso Metodo della stessa classe entro package Metodo di altra classe entro package Metodo di altra classe fuori package Private attributo/metodo Si No No Package attributo/metodo Si Si No Public attributo/metodo su package class Si Si No Public attributo/metodo su public class Si Si Si Modificatori di visibilità Classi all interno di un package public: elementi (attributi metodi) public della classe sono visibili anche fuori dal package package (VALORE DI DEFAULT): elementi (attributi metodi) public della classe sono visibili solo all interno del package 7

Librerie (package) Standard Il package java.lang contiene alcune classi basilari Viene importato automaticamente (non occorre import) java applet awt beans io lang math net rmi util data transfer event image peer Librerie grafiche Tipi Primitivi Classi Wrapper 8

Tipi primitivi In un mondo OO ideale, vi sono solo classi e istanze di classi Java Per efficenza usa tipi primitivi per int, float etc. Per completezza Definisce anche classi per interi, float etc. (classi wrapper) Definisce operazioni per passare dai dati primitivi alle classi wrapper Classi Wrapper per tipi Primitivi Se si vogliono trattare anche i dati primitivi come oggetti si possono utilizzare le classi wrapper Un oggetto di una classe wrapper incorpora un dato primitivo e fornisce metodi per operare su di esso Le classi wrapper dei tipi primitivi sono definite nel package java.lang 9

Corrispondenza Tipo Primitivo boolean char byte short int long float double void ClasseWrapper Boolean Character Byte Short Integer Long Float Double Void Classi Astratte 10

Classi Astratte Un metodo astratto è un metodo di cui non viene specificata l implementazione Una classe astratta è una classe avente almeno un metodo astratto Esempio abstract class Forma {... abstract void stampa();... Uso delle Classi Astratte Una classe astratta È una classe non completamente definita Non può essere istanziata Per ottenere una classe concreta (istanziabile) da una astratta occorre definire tutte le implementazioni mancanti ovvero Ereditare la classe facendo l overriding di tutti i metodi astratti Permette di trattare omogeneamente oggetti con caratteristiche diverse (tramite upcasting) 11

Interfacce Interfacce Un interfaccia è una classe completamente astratta, cioè del tutto priva della parte di implementazione Tutti i metodi sono astratti Non vi sono attributi È possibile definire solo attributi final (in pratica costanti) Definendo un attributo in un interfaccia questo viene automaticamente considerato final 12

Un interfaccia Ha tutti i vantaggi e le indicazioni d uso delle classi astratte Presenta maggior flessibilità rispetto all ereditarietà di una classe astratta Memorizzazione 13

Tipi di memoria Si differenziano per la durata di esistenza degli elementi che vi sono memorizzati Memoria statica Contiene gli elementi che esistono per tutta la durata del programma Heap o memoria dinamica Contiene gli elementi creati durante il programma Stack Contiene gli elementi creati durante una chiamata di procedura Memorizzazione oggetti Gli oggetti vengono allocati nella memoria heap heap codice reference oggetto stato 14

Memorizzazione delle Variabili Variabili di istanza Memorizzate all interno degli oggetti (nell heap) Variabili automatiche (locali) Memorizzate nello stack Variabili statiche Memorizzate in aree statiche Variabili di istanza Dichiarate all interno di una classe (attributi) Class Window { boolean visible; Window1 visible Window2 visible heap Memorizzate in ogni istanza della classe Create/inizializzate alla creazione di ogni istanza della classe 15

Variabili automatiche (locali) Dichiarate all interno dei metodi Class Window { void resize () { int i; for (i=0; i<5; i++) Memorizzate nello stack Create/inizializzate automaticamente all ingresso del blocco in cui sono dichiarate Distrutte automaticamente all uscita Variabili statiche Dichiarate nelle classi o nei metodi con qualificatore static Class ColorWindow { static String color; Memorizzate in copia unica associate alla classe => anche dette variabili di classe Memorizzate in aree statiche Create/inizializzate al caricamento della classe 16

Static area ColorWindow color ColorWindow1 ColorWindow2 heap Distruzione di Oggetti Non viene fatta in modo esplicito Il programmatore non deve preoccuparsi di distruggere gli oggetti Viene eseguita automaticamente Garbage collector Componente del Run Time che ha il compito di recuperare lo spazio nella memoria heap Quando necessario (per esempio quando si esaurisce lo spazio disponibile in memoria principale) esegue un analisi dei riferimenti e distrugge gli oggetti per i quali non esistono più riferimenti 17

Linguaggio Java Exceptions Motivazione Terminologia Errore: sbaglio del programmatore (non gestibile) Eccezione: evento anomalo recuperabile La portabilità richiede la gestione delle eccezioni Separare la gestione delle eccezioni dalla gestione del caso nominale Permettere al client di una funzione di gestire l eccezione in modo appropriato (il server spesso non conosce il modo migliore per gestire l errore) 1

Esempio readfile { open the file; determine its size; allocate that much memory; read the file into memory; close the file; readfile() (client) open file() (server) errorcodetype readfile { initialize errorcode = 0; open the file; if (thefileisopen) { determine the length of the file; if (gotthefilelength) { allocate that much memory; if (gotenoughmemory) { read the file into memory; if (readfailed) {errorcode = -1; else {errorcode = -2; else {errorcode = -3; close the file; if (thefiledidntclose && errorcode == 0) { errorcode = -4; else {errorcode = errorcode and -4; else {errorcode = -5; return errorcode; 2

Concetti fondamentali Una istruzione non terminata Causa la creazione di un oggetto che rappresenta quanto è successo Tale oggetto appartiene a una classe derivata da Throwable (derivata da Object) Tali oggetti sono le eccezioni Si dice che l eccezione Viene gettata (thrown) e In seguito deve essere gestita ovvero catturata (catch) Costrutti per la gestione delle eccezioni try { catch { Getta l eccezione a livello di un blocco di istruzioni La cattura effettuandone la gestione throws Getta l eccezione a livello di metodi throw Getta l eccezione a livello di codice / istruzioni 3

try catch Cattura le eccezioni generate in una regione di codice try { // codice in cui possono verificarsi le eccezioni... catch (IOException e) { // codice per gestire IOException e... Per catturare eccezioni di classi diverse si possono usare blocchi catch multipli try {... catch(malformedurlexception mue) { // qui recupero l errore malformedurl... catch(ioexception e) { // qui recupero tutti altri errori di IO... Costrutti try-catch possono essere annidati (catch che include try-catch) 4

Il blocco finally esegue istruzioni al termine del blocco try-catch Senza di eccezioni Con eccezioni In presenza di return, break e continue try {... catch (...) {... catch (...) {...... finally {... Esempio La System.in.read può provocare una eccezione controllata di tipo IOException Occorre quindi inserirla in un blocco try catch... byte b[] = new byte[10]; try { System.in.read (b); catch (Exception e) {...... 5

throws Permette a un metodo di gettare eccezioni <tipometodo> <nomemetodo> (<argomenti>) throws <classeeccezione 1 > [, <classeeccezione 2 >... [, <classeeccezione n > ]...] {... Le eccezioni gettate sono catturate (responsabilità) dal chiamante Esempio Chi chiama il metodo leggi deve sapere se la lettura è andata a buon fine oppure no Con try-catch gestiamo l eccezione a livello del chiamato (metodo leggi)... byte b[] = new byte[10]; try { System.in.read (b); catch (Exception e) {...... 6

Sapere se la lettura è andata a buon fine, non interessa tanto al chiamato (metodo leggi) quanto al chiamante static String leggi (String val) throws IOException { byte b[] = new byte[10]; System.in.read (b); // Senza try... Catch val = ""; for (int i=0; i<b.length; i++) { val = val + (char) b[i]; return (val); throw Permette di gettare in modo esplicito una eccezione a livello di codice throw <oggettoeccezione> Provoca L interruzione dell esecuzione del metodo L avvio della fase di cattura dell eccezione generata Dato che le eccezioni sono oggetti, chi getta l eccezione deve creare l oggetto eccezione (operatore new) che la descrive 7

Esempio... if ( y==0 ){ throw new ArithmeticException ( Frazione con denominatore nullo. ); z = x/y;... Classi di Eccezioni È una classe, subclass di Throwable o discendenti, definita in java.lang Error: hard failure Exception: non sistemiche RuntimeException: il compilatore non forza il catch 8

Error Glierrorisonotrattabilima in genere costituiscono situazioni non recuperabili OutOfMemoryError Exception ArithmeticException Condizioni eccezionali in operazioni aritmetiche (e.g., divisione per zero) ArrayIndexOutOfBoundsException Accesso a posizione inesistente di un array ClassCastException Cast di un riferimento a un sottotipo di cui l oggeto non è instanza NegativeArraySizeException Creazione di un array di dimensione negativa NullPointerException Tentativo di accesso a un elemento tramite un riferimento uguale a null NumberFormatException Conversione di una stringa in un valore numerico senzachela stringaabbiaformatoopportuno ClassNotFoundException InstantiationException NoSuchMethodException IllegalAccessException EmptyStackException RuntimeException NullPointerException 9

Definizione di una eccezione È possibile dichiarare eccezioni proprie, se quelle fornite dal sistema (java.lang) non sono sufficienti Si realizza creando sottoclassi di Throwable Tali sottoclassi sono del tutto assimilabili a classi standard, e.g., possono ereditare attributi e metodi ridefinire il metodo costruttore definire dei metodi get/set etc. Esempio public class NewExc extends ArithmeticException { public NewExc (String msg) { super (msg); try catch (NewExc e) static String leggi (String val) throws NewExc throw new NewExc ( messaggio ) 10

Eccezioni controllate e non Le eccezioni si dividono in Controllate Istanze di RuntimeException o delle sue sottoclassi Il compilatore si assicura esplicitamente che quando un metodo solleva una eccezione la tratti esplicitamente Questo può essere fatto mediante i costrutti try-catch o throws In caso contrario segnala un errore di compilazione Non controllate Sono tutte le altre eccezioni, ovvero istanze di Exception ma non di RuntimeException L eccezione può non essere gestita esplicitamente dal codice Viene passata automaticamente da metodo chiamato a metodo chiamante Il compilatore non si lamenta Le eccezioni controllate vincolano il programmatore ad occuparsi della loro gestione Le eccezioni controllate possono rendere troppo pesante la scrittura del codice (e.g., NullPointerException non è controllata) 11

Linguaggio Java Streams Generalità sull I/O L Input/Output è descritto nel package java.io Modalità principali di manipolazione Stream di caratteri Classi di lettura: contengono Reader nel nome Classi di scrittura: contengono Writer nel nome Stream di byte Classi di lettura: contengono InputStream nel nome Classi di scrittura: contengono OutputStream nel nome 1

Usualmente l I/O da file Richiede la gestione di eccezioni controllate La radice della gerarchia di queste eccezioni è IOExcetion public... (... ) throws IOException {... // Stream - I/O... I/O orientato a caratteri singoli 2

import java.io.*;... public... throws IOException { File <inf> = new File ( <namein> ); FileReader <inr> = new FileReader (<inf>); File <outf> = new File ( <nameout> ); FileWriter <outw> = new FileWriter (<outf>); int c; while ((c = <inr>.read())!= -1) <outw>.write (c); <inr>.close (); <outw>.close (); I costrutti File <inf> = new File ( <namein>"); FileReader <inr> = new FileReader (inf); File <outf> = new File ( <nameout>"); FileWriter <outw> = new FileWriter (outf); possono essere scritti come segue FileReader <inr> = new FileReader ( <namein> ); FileWriter <outw> = new FileWriter ( <nameout> ); 3

Metodi generali Chiusura del file public void close () throws IOException Scrittura dei caratteri nel buffer public void flush () throw IOEXception Modalità di lettura Il metodo read restituisce (-1) al raggiungimento di EOF Lettura di caratteri singoli public int read () throws IOException Lettura di un numero di caratteri pari alla lunghezza di un vettori di caratteri public int read (char [] chararray) throws IOException Modalità di scrittura Scrittura di caratteri singoli public void write (int c) throws IOException Scrittura di un vettore di caratteri public void write (char [] chararray) throws IOException Scrittura parziale di un vettore di caratteri public void write (char [] chararray, int da, int a) throws IOException Scrittura di una stringa public void write (String s) throws IOException Scrittura parziale di una stringa public void write (String s, int da, int a) throws IOException 4

I/O orientato alle righe La letturadi righeintereèpermessa dalla classe BufferedReader I metodi di tale classe Sono analoghi a quelli della classe Writer (metodo write) L I/O bufferizzato è più efficiente Lettura di una riga (conclusa dai caratteri \n = linefeed, \r = carriage return) intera public String readline () throws IOException Ritorna null al raggiungimento di EOF 5

import java.io.*;... public...throws IOException { FileReader <inr> = new FileReader ( <namein> ); BufferedReader <inb> = new BufferedReader (<inr>); FileWriter <outf> = new FileWriter ( <nameout> ); BufferedWriter <outb> = new BufferedReader (<outf>); String str;... while ((str = <inb>.readline ())!= null) <outb>.write (str);... <inb>.close (); <outb>.close (); I costrutti FileReader <inr> = new FileReader ( <namein> ); BufferedReader <inb> = new BufferedReader (<inr>); FileWriter <outf> = new FileWriter ( <nameout> ); BufferedWriter <outw> = new BufferedWriter (outf); possono essere scritti come BufferedReader <inb> = new BufferedReader (new FileReader ( <namein> )); BufferedWriter <outw> = new BufferedWriter (new FileWriter ( <nameout> )); 6

La classe file La classe file permette controlli su File Directory Definisce/rappresenta nomi/path Crea un oggetto di tipo file public File (String pathname) e.g., File <x> = new File ( <namein> ); File <y> = new File ( c:\dir1\dir2, <nameout> ); Check file/direttory Verifica che l oggetto esista public boolean exists() e.g., if (<x>.exists ())... Verifica se l oggetto è un file public boolean isfile() e.g., if (<x>.isfile ())... Verifica se l oggetto è una directory public boolean isdirectory() Restituisce il nome del file o directory public String getname( Restituisce la stringa che descrive il path completo del file public String getabsolutepath ( 7

Restituisce dimensione in byte public long length () Controlla se il file può essere scritto public boolean canwrite() Controlla se il file può essere letto public boolean canread () Contenuto di una directory Restituisce l array di stringhe contenenti I nomi dei file/direcotory nel direttorio corrente String [] list () e.g., String filename[] = <x>.list (); for (int i=0; i<filename.length; i++) System.out.println (filename[i]); 8

Linguaggio Java Containers Array Struttura dati efficiente ogni volta che il numero di elementi è noto Permettono di contenere Dati primitivi Oggetti Sugli array si effettua Type-checking Bound-checking Ri-dimensionamento poco efficiente Utilizzo di altre strutture qualora il numero di dati sia ignoto 1

Il pacchetto java.util contiene metodi statici di utilità Copia di un valore in tutti gli (o alcuni) elementi di un array Arrays.fill (<array>, <value>); Arrays.fill (<array>, <from>, <to>, <value>); Copia di array System.arraycopy (<arraysrc>, <offsetsrc>, <arraydst>, <offsetdst>, <#elements>); Confronta due array Arrays.equals (<array1>, <array2>); Ordina un array (di oggetti che implementino l interfaccia Comparable) Arrays.sort (<array>); Ricerca binaria (o dicotomica) Arrays.binarySearch (<array>); Introduzione, Tassonomia & Classificazione 2

Collections & Map Collezione di elementi Mantenuti mediante reference Di tipo generico (Object) Definiti nel package java.util Non specifica se Ordinati / non ordinati Con duplicati / senza duplicati Tassonomia Simbologia Caselle punteggiate: interfaccie Caselle tratteggiate: classi astratte Caselle continue: classi normali Caselle in grassetto: classi più comuni Frecce Classe implementa interfaccia o classe astratta Classe astratta implementa parzialmente una interfaccia 3

Involucri principali Tipi di Implementazione Hash Table Resizable Array Balanced Tree Linked List Interfacce List Set HashSet ArrayList (Vector) TreeSet LinkedList LinkedHas hset Map HashMap TreeMap LinkedHas hmap 4

Collections Gruppo di oggetti singoli List Contiene elementi con ordine specifico (e.g., stesso ordine di inserzione) Elementi duplicati ArrayList Implementazione di una lista mediante array Ricerca veloce Inserzione/cancellazione lenta LinkedList Implementa di una lista mediante lista linkata Ottimo accesso sequenziale Ottima inserzione e cancellazione Accesso diretto lento Vector Mantenuto per compatibilità Più lento di ArrayList Set No elementi duplicati (elementi non inseriti se presenti) No ordine (esiste un ordinamento ma è interno) 5

HashSet Set implementati come una Hash (accesso veloce) TreeSet Set implementati come un albero LinkedHashSet Sottoclasse di HashSet Mantiene l ordine di inserimento dei dati grazie a una lista (in aggiunta alla hash) Gli iterator forniscono l ordine di inserzione Map Gruppo di coppie di oggetti Associazione chiave-valore (key-value) ex: codice fiscale - persona matricola - studente Permette ricerche data la chiave No chiavi duplicate HashMap Implementazione basata su tabella di hash Possibile impostare capacità e fattore di carico per ottimizzare le prestazioni 6

TreeMap Implementazione basata su struttura ad albero Si ottengono i dati ordinati Disponibilità del metodo submap() che fornisce un sotto-albero LinkedHashMap Sottoclasse dell HashMap Mantiene l ordine di inserimento dei dati grazie a una lista (in aggiunta alla hash) Gli iterator forniscono l ordine di inserzione Strutture obsolete Vengono mantenute per compatibilità Vector Enumeration Hashtable Stack BitSet Evitarne l utilizzo 7

Funzionalità Utilizzo Funzionalità di una Collection Aggiunta di un elemento alla fine; restituisce false se non inserisce boolean add (Object o) e.g., <x>.add (<y>) Aggiunge o in posizione i boolean add (int index, Object o) Aggiunge tutti gli elementi di c boolean addall (Collection c) Rimuove gli elementi dal contenitore void clear() Restituisce true se contiene o boolean contains (Object o) Restituisce true se contiene tutti gli elementi specificati in c boolean containsall (Collection c) 8