La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Introduzione al linguaggio Java 1 CORSO DI SISTEMI OPERATIVI Università di Milano, a.a. 1996-97 INTRODUZIONE AL LINGUAGGIO JAVA Roberto Polillo (Queste.

Presentazioni simili


Presentazione sul tema: "Introduzione al linguaggio Java 1 CORSO DI SISTEMI OPERATIVI Università di Milano, a.a. 1996-97 INTRODUZIONE AL LINGUAGGIO JAVA Roberto Polillo (Queste."— Transcript della presentazione:

1 Introduzione al linguaggio Java 1 CORSO DI SISTEMI OPERATIVI Università di Milano, a.a INTRODUZIONE AL LINGUAGGIO JAVA Roberto Polillo (Queste slides sono una espansione delle slides di G.Prini per lo stesso corso)

2 Introduzione al linguaggio Java 2 RIFERIMENTI The Java Series (Addison-Wesley): K.Arnold, J.Gosling, The Java Programming Language J.Gosling, B:Joy, G:Steel, The Java Language Specification T.Lindholm, F.Yellin, The Java Virtual Machine Specification …..

3 Introduzione al linguaggio Java 3 INDICE Parte 1Introduzione al sistema di program- mazione Java Parte 2Programmazione a oggetti Parte 3Il linguaggio Java

4 Introduzione al linguaggio Java 4 PARTE 1 INTRODUZIONE AL SISTEMA DI PROGRAMMAZIONE JAVA

5 Introduzione al linguaggio Java 5 CARATTERISTICHE

6 Introduzione al linguaggio Java 6 CHE COS’È JAVA È un linguaggio (e relativo ambiente di programmazione) definito dalla Sun Microsystems … … per permettere lo sviluppo di applicazioni sicure, performanti e robuste su piattaforme multiple, in reti eterogenee e distribuite (Internet)

7 Introduzione al linguaggio Java 7 IL LINGUAGGIO JAVA: CARATTERISTICHE Semplice e orientato agli oggetti Interpretato Architetturalmente neutro e portabile Robusto Distribuito Sicuro Dinamico Ad elevate prestazioni Concorrente (multithread)

8 Introduzione al linguaggio Java 8 SEMPLICE E OO Sintassi simile a C e C++ (facile da imparare) Elimina i costrutti più "pericolosi" di C e C++ –aritmetica dei puntatori –(de)allocazione esplicita della memoria –strutture (struct) –definizione di tipi (typedef) –preprocessore (#define) Aggiunge garbage collection automatica Conserva la tecnologia OO di base di C++ Rivisita C++ in alcuni aspetti (C++--==)

9 Introduzione al linguaggio Java 9 Il compilatore produce un codice di tipo intermedio per una “Java Virtual Machine” (“byte- code”)... … che viene interpretato INTERPRETATO codice sorgente codice sorgente byte code compilatore interprete

10 Introduzione al linguaggio Java 10 BYTECODE: ESEMPIO void spin ( ) { int i; for (i = 0; i < 100; i++) { ; } } 0iconst_0// push int constant 0 1istore_1// store into local 1 (i=0) 2goto 8// first time, don’t increment 5iinc 1 1// increment local i by 1 (i++) 8iload_1// push local 1 (i) 9bipush 100// push int constant (100) 11if_icmplt 5// compare, loop if < (I<100) 14return// return void when done

11 Introduzione al linguaggio Java 11 ARCHITETTURALMENTE NEUTRO Il byte-code è indipendente dall’architettura hardware (ANDF: Architecture Neutral Distribution Format) Pertanto, un programma bytecode può essere eseguito su qualsiasi sistema su cui giri un ambiente run-time Java

12 Introduzione al linguaggio Java 12 ESEMPIO Sistema tradizionale codice sorgente codice sorgente eseguibile macchina A eseguibile macchina A compilatore macchina A compilatore macchina A Sistema ANDF eseguibile macchina B eseguibile macchina B compilatore macchina B compilatore macchina B ……. codice sorgente codice sorgente byte code compilatore macchina A compilatore macchina A compilatore macchina B compilatore macchina B ……. interprete macchina A interprete macchina A interprete macchina B interprete macchina B …….

13 Introduzione al linguaggio Java 13 ESEMPIO Il formato dei dati è specificato esattamente, e non “di minima”, come nel C: –byte8 bit complemento a 2 –short16 bit “ –int32 bit “ –long64 bit “ –float32 bit IEEE 754 floating –double64 bit “ –char16 bit Unicode

14 Introduzione al linguaggio Java 14 Il sistema Java (compilatore + interprete + librerie run-time) è facilmente portabile su piattaforme diverse PORTABILE –il compilatore Java è scritto in Java –l’ambiente run-time è scritto in ANSI C con interfacce standard (POSIX) verso il sistema operativo –nessuna “implementation dependency” codice sorgente codice sorgente byte code compilatore interprete libreria S.O.

15 Introduzione al linguaggio Java 15 ROBUSTO Controlli estensivi a compile-time e a run-time, per rilevare gli errori quanto prima possibile (es.: type checking) Per questo, le caratteristiche insicure di C e C++ sono rimosse: –Nessuna gestione esplicita dei puntatori (no aritmetica dei puntatori, no malloc e free esplicite, …) –Gestione della memoria con garbage collection –Array e stringhe “veri” Verifica del byte-code a load-time

16 Introduzione al linguaggio Java 16 DISTRIBUITO Pensato per essere eseguito in rete L’ambiente run-time incorpora funzioni di rete (sia di basso livello: TCP/IP, che di alto livello: HTTP, …) La rete è facilmente accessibile (come i file locali)

17 Introduzione al linguaggio Java 17 SICURO L’ambiente di esecuzione si protegge da bytecode potenzialmente “ostile” Esempi: –il bytecode viene verificato prima dell’interpretazione (“theorem prover”), in modo da essere certi di alcune sue caratteristiche –gli indirizzamenti alla memoria nel bytecode sono risolti sotto il controllo dell’interprete

18 Introduzione al linguaggio Java 18 COMPILE-LOAD-RUN Compilatore Byte-code Java Byte-code Java Rete hardware Loader delle classi Loader delle classi Interprete Ambiente run-time Ambiente run-time Verifica del byte-code Verifica del byte-code Sorgente Java Sorgente Java

19 Introduzione al linguaggio Java 19 ELEVATE PRESTAZIONI La verifica del bytecode permette di saltare molti controlli a run-time: l’interprete è pertanto efficiente Per maggiore efficienza, possibilità compilazione on-the-fly del bytecode in codice macchina

20 Introduzione al linguaggio Java 20 COMPILAZIONE ON-THE-FLY Compilatore Byte-code Java Byte-code Java Rete hardware Loader delle classi Loader delle classi Interprete Ambiente run-time Ambiente run-time Verifica del byte-code Verifica del byte-code Sorgente Java Sorgente Java Generatore di codice Generatore di codice

21 Introduzione al linguaggio Java 21 DINAMICO Il codice è eseguibile anche in assenza di alcuni moduli: … le classi necessarie per la esecuzione di un programma Java possono essere caricate e collegate dinamicamente quando servono Esempio: nuove release di moduli caricabili automaticamente dalla rete quando servono

22 Introduzione al linguaggio Java 22 CONCORRENTE Multithreading parte integrante del linguaggio: –Applicazioni interattive più facili a scriversi –Migliore "reattività" (anche se non real-time) Esempio: caricamento asincrono di immagini nei browser di rete riduce i tempi di attesa

23 Introduzione al linguaggio Java 23 RICCO La Standard Library Java contiene una ricca collezione di classi e di metodi preconfezionati: –Language support –Utilities –Input/output –Networking –Abstract Window Toolkit (AWT)

24 Introduzione al linguaggio Java 24 JAVA E INTERNET

25 Introduzione al linguaggio Java 25 WEB BROWSER E SERVER HTTP used over this TCP connection Internet Disk Hyperlink to xyz.com HTTP Server HTTP Server Client Server abc.comServer xyz.com Browser program

26 Introduzione al linguaggio Java 26 URL: Uniform Resource Locator :// Esempio: deve essere risolto in un indirizzo internet (IP) con l’aiuto di un Domain Name Server (DNS)

27 Introduzione al linguaggio Java 27 HTML: ESEMPIO Esempio Esempio Testo DSI Testo DSI

28 Introduzione al linguaggio Java 28 APPLET JAVA Sono programmi Java riferiti da link in pagine HTML Vengono caricati e interpretati dal browser (se questo supporta Java) Permettono di “animare” le pagine web

29 Introduzione al linguaggio Java 29 HTML con APPLET: ESEMPIO Esempio Esempio Testo Hallo! Testo Qui c’è un applet che ti saluta testo che esce se il browser non supporta gli applet

30 Introduzione al linguaggio Java 30 JAVA BROWSER http client ftp client ftp client java loader UI library TCP / IP interprete JAVA I/O library local disk rete interprete HTML

31 Introduzione al linguaggio Java 31 UN NUOVO PARADIGMA: NETWORK COMPUTING Approccio tradizionale Network computing PROGRAMMI DATI RETE PROGRAMMI E DATI RETE PC NC load and run

32 Introduzione al linguaggio Java 32 PARTE 2 PROGRAMMAZIONE A OGGETTI

33 Introduzione al linguaggio Java 33 PARADIGMI DI PROGRAMMAZIONE

34 Introduzione al linguaggio Java 34 RIFLESSIONI SULLA PROGRAMMAZIONE Programmare è un mestiere strano: costruire cose immateriali sempre piene di difetti, che costano un sacco di soldi e sono fatte di migliaia di frasi scritte da gente particolare per macchine molto stupide che richiedono precisione assoluta e che cambiano di continuo...

35 Introduzione al linguaggio Java 35 I DUE PARADIGMI DELLA PROGRAMMAZIONE Ci sono essenzialmente due modi diversi di descrivere il mondo: come un sistema di processi (“modello procedurale”) come un sistema di cose (“modello a oggetti”)

36 Introduzione al linguaggio Java 36 ESEMPIO: UNA MACCHINA PER SPREMERE LE ARANCE Rube Goldberg, Inventions of Professor Lucifer Butts, 1932

37 Introduzione al linguaggio Java 37 IL MODELLO PROCEDURALE: ALCUNI TEMI TIPICI Processi, sequenze di esecuzione Concetto di “controllo” Trasformazioni, funzioni Flow-charts Tracciatori, program profilers Copertura topologica Complessità strutturale Il problema dei goto Linguaggi strutturati Programmazione top-down Astrazione procedurale ….

38 Introduzione al linguaggio Java 38 LA MACCHINA DI VON NEUMANN “… nel progettare una sequenza codificata, quello che bisogna avere innanzitutto in mente non è l’apparenza originale della sequenza, ma piuttosto il suo funzionamento e il suo continuo cambiamento mentre il processo che essa controlla procede nel suo corso. … È dunque consigliabile incominciare la progettazione dalla fine, e cioè progettare per prima cosa il corso del processo e la relazione delle sue fasi successive con il codice che cambia, e quindi estrarre la sequenza codificata come operazione succes- siva.” Goldstine & Von Neumann, 1947

39 Introduzione al linguaggio Java 39 SPAGHETTI E STRUTTURA

40 Introduzione al linguaggio Java 40 RIUSABILITÀ NEI LINGUAGGI PROCEDURALI Esempio: C int fun (int i, float r) { int j; …. } Dalle librerie di “subroutines” alle librerie di procedure/funzioni “ASTRAZIONE FUNZIONALE”

41 Introduzione al linguaggio Java 41 IL MODELLO PROCEDURALE: LINGUAGGI Fortran Cobol1960 Basic Pascal1972 C1972

42 Introduzione al linguaggio Java 42 UN BLOCCO INTELLETTUALE? “… Questi “linguaggi di Von-Neumann” creano dei blocchi stradali mentali enormi e non necessari nel pensare i programmi e nel creare le combinazioni di alto livello richieste da una metodologia di programmazione veramente potente. …” John Backus, 1978

43 Introduzione al linguaggio Java 43 IL MODELLO A OGGETTI: ALCUNI TEMI TIPICI Dall’astrazione funzionale alla “data abstraction” Costruire “cose”, non processi Società di entità attive, cooperanti, riusabili Dalla computazione alla comunicazione e alla delega Classificare il mondo: classi, sottoclassi, istanze (“esemplari”) Bottom-up, non top-down

44 Introduzione al linguaggio Java 44 IL MODELLO A OGGETTI: LINGUAGGI Simula Smalltalk Eiffel C++ Java

45 Introduzione al linguaggio Java 45 IL PARADIGMA A OGGETTI

46 Introduzione al linguaggio Java 46 OGGETTI: CHE SONO MAI? Versione informatica degli oggetti "reali" Dotati di una loro propria "individualità" Capaci di interagire per scambio di messaggi Caratterizzati da proprietà –dati: ne descrivono lo “stato” –funzioni: ne descrivono il “comportamento” Un msg modifica stato e attiva comportamenti Un oggetto è una coppia [stato,funzioni]

47 Introduzione al linguaggio Java 47 ESEMPIO: UN’AUTOMOBILE FunzioniDati: - Avviati- Targa - Fermati- Colore - Accelera- Velocità - …- Livello benzina -...

48 Introduzione al linguaggio Java 48 CLASSI campi metodo una classe ha un nome, e contiene due tipi di membri: campi e metodi “Tipo di dati astratti” (ADT)

49 Introduzione al linguaggio Java 49 OGGETTI Un oggetto è una istanza (“esemplare”) di una classe, che viene creato (“instanziato”) dinamica- mente Due esemplari della stessa classe sono distinguibili soltanto per il loro stato (il valore dei loro campi), mentre il comportamento è sempre identico MIV5678 MIK1178 BO8956 Automobile a b c valori variabili

50 Introduzione al linguaggio Java 50 CLASSI: ESEMPIO (JAVA) class Automobile { string targa; int velocità; color colore; … public void Avviati () { ….. } public void Fermati () { } campi metodi nome classe

51 Introduzione al linguaggio Java 51 OGGETTI: ESEMPIO (JAVA) class Automobile { …. } …. Automobile a, b, c; a = new Automobile(); b = new Automobile(); c = new Automobile(); …. a.Avviati(); …. dichiara, non crea crea

52 Introduzione al linguaggio Java 52 INCAPSULAMENTO Alcuni attributi (dati e metodi) sono pubblici (cioè visibili "all'esterno") Altri attributi sono privati dell'oggetto, e quindi “nascosti” all’esterno (“information hiding”) Le parti private sono modificabili senza effetti per gli interlocutori dell'oggetto Propagazione delle modifiche assai contenuta Stimolo al riutilizzo di oggetti ("black-box")

53 Introduzione al linguaggio Java 53 ESEMPIO: AUTOMOBILE Parti "visibili" (interfaccia pubblica): accesso a "ciò che l'auto può fare" –volante, combinazione volante-freno (ev. a mano) –blocchetto di accensione, oppure manovella –pedale dell'acceleratore, acceleratore automatico Parti "nascoste" (implementazione): "come l'auto fa ciò che si può fare" –meccanica dello sterzo e dell'alimentazione –elettromeccanica dell'avviamento –sistema di alimentazione e accensione

54 Introduzione al linguaggio Java 54 INCAPSULAMENTO: APPROCCI Approccio "puro" lo stato è privato, e lo si può modificare solo attraverso quei metodi che sono stati dichiarati pubblici. Esempio: Fermati() Approccio di Java anche le componenti dello stato possono essere dichiarate pubbliche e modificate dall'esterno Esempio: velocita=0

55 Introduzione al linguaggio Java 55 INTERAZIONI TRA OGGETTI Gli oggetti possono comunicare e interagire mediante scambio di messaggi attraverso le loro interfacce pubbliche (stato o funzioni) Per mezzo di un messaggio un oggetto può chiedere un'informazione a un altro oggetto, causarne un cambiamento di stato, oppure delegargli un'attività Un messaggio in arrivo viene trattato dal metodo omonimo del ricettore, il quale "si attiva" per rispondere, per cambiare di stato, oppure per intraprendere un'attività

56 Introduzione al linguaggio Java 56 ESEMPIO: UN'AUTOVETTURA Il sistema antiskid durante una frenata invia periodicamente un messaggio alle ruote per "leggere" la loro velocità di rotazione Il galleggiante nel serbatoio del carburante invia messaggi all'indicatore di livello sul cruscotto per "scrivervi" un nuovo stato Il volante tornando alla posizione di riposo invia un messaggio al comando meccanico dell'indicatore di direzione per delegargli il compito di interrompere l'eventuale segnale lampeggiante (i.e. di "togliere la freccia")

57 Introduzione al linguaggio Java 57 OGGETTI COMPOSTI automobile ruota carrozzeria Un oggetto può essere costituito da altri oggetti motore

58 Introduzione al linguaggio Java 58 UN SISTEMA A OGGETTI a b c d g f e main chiamata di un metodo di b

59 Introduzione al linguaggio Java 59 SISTEMI A OGGETTI Società di entità attive, cooperanti, riusabili Bottom-up, non top-down Visione locale, non globale “Comportamento emergente”

60 Introduzione al linguaggio Java 60 ESEMPIO: ARTIFICIAL LIFE

61 Introduzione al linguaggio Java 61 UNA DOMANDA IMPORTANTE I computer possono fare di più di quanto venga loro indicato?

62 Introduzione al linguaggio Java 62 EREDITARIETÀ È il meccanismo che consente di derivare una sottoclasse da una classe data Una sottoclasse si ottiene per aggiunta, per occultamento o per ridefinizione di uno o più membri rispetto alla classe di partenza (che diventa una superclasse della nuova classe) Esempio: automobiletaxi StartTassametro EndTassametro Licenza

63 Introduzione al linguaggio Java 63 ESEMPIO class Taxi extends Automobile { int licenza; public void StartTassametro() { … } public void EndTassametro () { … } nuovo campo nuovi metodi

64 Introduzione al linguaggio Java 64 ESEMPI Implementazione di un'interfaccia grafica –classe "finestra": attributo privato "sfondo" e metodo "cambia-sfondo" –sottoclasse "finestra-nera": attributo privato "sfondo" ridefinito con il valore costante "nero", metodo "cambia-sfondo" occultato Libreria di algebra lineare: –classe "matrice": metodo "determinante" generico –sottoclasse "matrice-diagonale": metodo "determinante" che moltiplica tra di loro gli elementi sulla diagonale Dichiarazione dei redditi –classe "contribuente": quadri del modello 740 base –classe "autonomi": aggiunta del membro "quadro-E"

65 Introduzione al linguaggio Java 65 GERARCHIA DI CLASSI Generalizzazione Specializzazione instanziazione

66 Introduzione al linguaggio Java 66 Veicolo ESEMPIO VeicoloSenza Motore Veicolo A Motore Motocicletta Automobile Taxi obiect

67 Introduzione al linguaggio Java 67 Veicolo AGGIUNGERE SOTTOCLASSI VeicoloSenza Motore Veicolo A Motore Motocicletta Automobile Taxi obiect Altro

68 Introduzione al linguaggio Java 68 Veicolo A Motore RIDEFINIZIONE DEI METODI Motocicletta Automobile Aereo Noleggia ereditano il metodo utilizza la versione locale

69 Introduzione al linguaggio Java 69 POLIMORFISMO “Ciò che vale per una classe, vale anche per le sue sottoclassi. Se una proprietà viene ridefinita, quando la uso viene selezionata la versione corretta” Esempio: Quando uso un metodo di un oggetto, non so: a quali livelli è definito quale tra i metodi omonimi nella gerarchia verrà usato

70 Introduzione al linguaggio Java 70 VISIBILITÀ DEI NOMI oggetto b oggetto a b.nome nome Il msg inviato all’oggetto risale nella gerarchia fino a trovare una definizione gerarchia di classi

71 Introduzione al linguaggio Java 71 PROGRAMMAZIONE A OGGETTI E TASSONOMIA Nel paradigma a oggetti, l’attenzione del programmatore è spostata dalla creazione di processi di computazione alla creazione di tassonomie del sistema in esame Osservazioni: Per descrivere un sistema sono possibili tassonomie diverse, a seconda degli obbiettivi La tassonomia è un’arte difficile

72 Introduzione al linguaggio Java 72 ESEMPI ALTERNATIVI Automobile Spider Berlina Segmento A Segmento C Segmento B Automobile BenzinaDiesel

73 Introduzione al linguaggio Java 73 EREDITARIETÀ MULTIPLA Meccanismo che consente di derivare sottoclassi da due o più classi Il problema degli omonimi Java non implementa ereditarietà multipla Taxi Automobile Mezzo Pubblico

74 Introduzione al linguaggio Java 74 RIUSO Linguaggio Classi generali Classi specializzate Classi specifiche col linguaggio dal fornitore di classi sviluppo interno

75 Introduzione al linguaggio Java 75 PARTE 3 IL LINGUAGGIO JAVA

76 Introduzione al linguaggio Java 76 INDICE Caratteristiche lessicali Tipi Strutture di controllo Classi Ereditarietà Interfacce Packages Struttura di un’applicazione Multithreading

77 Introduzione al linguaggio Java 77 CARATTERISTICHE LESSICALI

78 Introduzione al linguaggio Java 78 ALFABETO I sorgenti Java utilizzano il codice standard internazionale a 16 bit Unicode, che comprende gli alfabeti più diffusi: arabo, greco, ebraico, cirillico, thai, katakana, hiragana, cinese, coreano, e molti altri (http://www.unicode.org) I programmi Java possono essere scritti con altre codifiche (es. ASCII), ma devono essere convertiti in Unicode prima di essere compilati Sequenze di escape: /udddd (d: 0-9, a-f, A-F)

79 Introduzione al linguaggio Java 79 FORMATO Il formato di un sorgente Java è libero: gli spazi (blank, tab, newline, form feed) non sono significativi, tranne che per separare i token fra loro, o nei letterali

80 Introduzione al linguaggio Java 80 COMMENTI Tre diversi stili: /* Commento tradizionale, eventualmente su più linee, non nidificato */ // Commento su di una sola linea /** Commento di documentazione". */ Solo immediatamente prima di una dichiarazione di classe, interfaccia, metodo o campo, e viene incluso nella documentazione generabile automa- ticamente a partire dal codice sorgente (es.: javadoc)

81 Introduzione al linguaggio Java 81 ESEMPIO /** Questo è un esempio di commento di documentazione per una classe “Automobile” Ruota Carrozzeria Roberto 1.0 */

82 Introduzione al linguaggio Java 82 TAGS TagDescrizioneSi applica di classeClasse, metodo, campo autoreClasse e descrizioneMetodo del valoreMetodo di e descrizioneMetodo eccezione

83 Introduzione al linguaggio Java 83 IDENTIFICATORI Sono composti da “lettere Java” e “cifre Java”, e devono iniziare con una “lettera Java” Possono essere di qualsiasi lunghezza Attenzione: –sono lettere e cifre Unicode! –_ e $ sono considerate lettere –caratteri con codifica diversa (es. maiuscole e minuscole) sono considerati diversi (anche se hanno la stessa rappresentazio- ne)

84 Introduzione al linguaggio Java 84 PAROLE CHIAVE Le seguenti keywords non possono essere usate come identificatori: abstractdoubleintsuper booleanelseinterfaceswitch breakextendslongsynchronized bytefinalnativethis casefinallynewthrow catchfloatpackagethrows charforprivatetransient class(goto)protectedtry (const)ifpublicvoid continueimplementsreturnvolatile defaultimportshortwhile doinstanceofstatic Note: - const e goto sono riservate, ma non usate - anche i letterali null, true, false sono riservati

85 Introduzione al linguaggio Java 85 KEYWORDS JAVA E C struct union enum signed unsigned extern auto register sizeof typedef char int short long float double void if else for while do switch case default break continue return goto°° volatile static const°° byte boolean final try catch finally throw throws private public protected transient synchronized native abstract import class extends instanceof implements interface package this super new true° false° null° C Java ° letterali, non keywords °° riservate ma non usate in Java

86 Introduzione al linguaggio Java 86 TIPI

87 Introduzione al linguaggio Java 87 TIPI: SINTESI TIPIKEYWORDNOTE boolean: Primitivi Reference Null booleantrue, false numericiinteri floating-point classi interfacce array class interface float double byte short int long char 8 bit interi in compl. a 2 16 bit 32 bit 64 bit 16 bit Unicode 32 bit IEEE bit

88 Introduzione al linguaggio Java 88 TIPI (segue) Linguaggio fortemente tipato: il tipo di una espressione è sempre noto a compile-time Linguaggio a oggetti non puro: non tutti i tipi sono classi Rispetto al C, non esistono: signed, unsigned, long double, enum, puntatori, struct, union, typedef

89 Introduzione al linguaggio Java 89 Dichiarazioni: int i, float f; Inizializzazioni:double d = 3.14; Espressioni:i + 5 j = i++ Nota: byte e short vengono sempre promossi a int prima di essere valutati Assegnamenti:i = j + 5; TIPI PRIMITIVI: ESEMPI Essenzialmente, gli stessi operatori del C

90 Introduzione al linguaggio Java 90 CLASSI dichiarazione di classe: class Automobile { } dichiarazione di oggetto: Automobile a; creazione di oggetto: a = new Automobile(); uso dell’oggetto: … a.campo … … a.metodo(…)... a nul a heap I campi vengono inizializzati

91 Introduzione al linguaggio Java 91 CLASSI: ESEMPIO class Safe { public int doorNumber = 123; private boolean locked = true; private int combination = 456; public boolean isLocked() { return (locked) } public void unLock (int thisCombination) { if (thisCombination == combination) unLock(); } private void unLock() { locked = false; } private void setCombination(int setting) { combination = setting; } Safe() { } /* costruttore */ Safe (int door) { /* altro costruttore (overloading) */ doorNumber = door; setCombination(doorNumber); } 123 Safe aSafe; aSafe = new Safe(); Safe anotherSafe; anotherSafe = new Safe(1927)... aSafe.doorNumber=456; aSafe.unLock(1997);

92 Introduzione al linguaggio Java 92 CLASSI “WRAPPER” Tutti i tipi primitivi tranne byte e short hanno una classe corrispondente nel package java.lang: Boolean, Integer, Long, Character, Float, Double, (“wrapper class”) Tale classe definisce metodi e costanti utili per quel tipo, ad esempio: Classe: Character Costanti (static): MIN_VALUE, MAX_VALUE, … Metodi (static): isDefined, isLowerCase, IsUpperCase, isTitleCase, isDigit, isLetter, isLetterOrDigit, isSpace, isJavaLetter,isJavaLetterOrDigit, toLowerCase, toUpperCase, toTitleCase, digit, forDigit

93 Introduzione al linguaggio Java 93 INTERFACCE In sostanza, sono liste di metodi di cui non è definita l’implementazione, ma solo l’interfaccia La loro implementazione deve essere realizzata da una classe

94 Introduzione al linguaggio Java 94 ESEMPIO public interface AudioClip { void play ();/* avvia i'esecuzione */ void loop ();/* esegui ciclicamente una audio clip */ void stop (); /* interrompi l'esecuzione */ } class MyAudio implements AudioClip { void play () { } void loop () { } void stop () { } } class YourAudio implements AudioClip { } I metodi possono essere public o abstract, gli attributi public, static o final

95 Introduzione al linguaggio Java 95 ARRAY In Java gli array sono oggetti I componenti di un array: –sono tutti dello stesso tipo –possono essere di tipo primitivo o reference (inclusi altri array) –sono indicizzati con int (indice primo elemento: 0), con controllo di validità degli indici a run-time Esempio: int[ ] a; /* dichiarazione */ /* anche int a[ ]; */ a = new int[3]; /* creazione */ a[0] = 0; /* uso */ a heap a null

96 Introduzione al linguaggio Java 96 ARRAY (segue) La lunghezza di un array è fissata al momento della sua creazione, e non può essere cambiata…... ma si può assegnare un nuovo array di diversa lunghezza all’array reference: int[ ] a = new int[3]; a = new int[5]; a heap a

97 Introduzione al linguaggio Java 97 ARRAY DI ARRAY short [ ] [ ] a;/* array di array di short */ short a[ ] [ ];/* equivalente */ a = new short [3][2]; a = new short [3][ ]; a heap null a heap a[2][0]

98 Introduzione al linguaggio Java 98 ARRAY DI OGGETTI class Automobile { public int targa; public int velocità; …. } …. Automobile[ ] a=new Automobile[3]; a heap a[2].targa

99 Introduzione al linguaggio Java 99 STRUTTURE DI CONTROLLO

100 Introduzione al linguaggio Java 100 STRUTTURE DI CONTROLLO: SINTESI Sequenza Selezione if switch Iterazione for while do-while Salto break uscita da un blocco continue continua un loop return da un metodo Gestione ecce- try-catch- zioni finally-throw Non c’è goto!

101 Introduzione al linguaggio Java 101 SINTASSI if ( condition )switch ( intexpr ) { statement; case intexpr : statement; [else [case intexpr : statement; statement; ]... default : statement; ] } while ( condition ) statement; for ( init; condition; increment ) do statement; statement; while ( condition ); boolean, non integer!

102 Introduzione al linguaggio Java 102 USCITE break [label]; continue [label]; return expr; label: statement

103 Introduzione al linguaggio Java 103 ESEMPIO label: for (i =0, j=0 ; i<10 && j<20; i++, j++) { for (z=0 ; z<100 ; z++) { switch (expr) { case tag: statements; break; /* esce da switch */..... default: statements; break label; /* esce da label */ } if (z==15) continue; /* prosegue il for z */ if (z==i+j) continue label; /* prosegue da label */ }

104 Introduzione al linguaggio Java 104 GESTIONE ECCEZIONI È una struttura di controllo che permette la gestione di condizioni di errore senza complicare la struttura del codice (codici di ritorno, flag, …) Quando si rileva una condizione anomale (eccezione), essa viene segnalata (throw), e il controllo viene automaticamente trasferito al gestore della eccezione, che la tratta

105 Introduzione al linguaggio Java 105 STRUTTURA try-catch-finally try blocco-0 catch (exception_type1 id) blocco-1 catch (exception_type2 id) block-2 … finally blocco-n blocco-1 blocco-n blocco-0 blocco-2 exception_type1 exception_type2 qui dentro viene segnalata la eccezione, con throw e

106 Introduzione al linguaggio Java 106 LA SEGNALAZIONE DELLE ECCEZIONI Le eccezioni possono venire segnalate: dal sistema run-time, es.: ArithmeticException IndexOutOfBoundsException SecurityException NullPointerException... dal programma: throw e;

107 Introduzione al linguaggio Java 107 CHE COSA SONO LE ECCEZIONI Le eccezioni sono oggetti, di una sottoclasse della classe Throwable: Object Throwable Exception Error Runtime Exception checked exceptions, definite dall’utente unchecked exceptions

108 Introduzione al linguaggio Java 108 LA DICHIARAZIONE throws type method(args) throws MyException { …. throw new MyException(…) …. } Permette al compilatore di controllare quali eccezioni vengono segnalate fornisce documentazione all’utente del metodo

109 Introduzione al linguaggio Java 109 CLASSI

110 Introduzione al linguaggio Java 110 DICHIARAZIONE DI CLASSI [Doc comment] [Modifiers] class ClassName [ extends SuperClassName] [ implements InterfaceName [, InterfaceName]...] {ClassBody} Doc commentcommento di documentazione Modifiersabstract, final, public,... extendsla classe è sottoclasse di un'altra implementsla classe realizza una o più interfacce ClassBodyi campi e i metodi della classe

111 Introduzione al linguaggio Java 111 ESEMPIO Dichiarazione di una classe MyClass public class MyClass { int i; /* campo */ public void Add_to_i (int j) {/* metodo */ i = i+j; } public MyClass () { /* metodo costruttore: ha lo i = 10; stesso nome della classe */ } Creazione e uso di una istanza di MyClass MyClass mc; /* dichiarazione, non creazione */ mc = new MyClass();/* creazione: l'attributo i vale 10 */ mc.i++; /* ora i vale 11 */ mc.Add_to_i(10); /* e ora i vale 21 */

112 Introduzione al linguaggio Java 112 DICHIARAZIONE DI CAMPI [DocComment] [Modifiers] Type VariableDeclarator [,VariableDeclarator]… ; Esempio: static int i = 5, j = 7, a[]; Doc commentcommento di documentazione Modifiersstatic, public, protected,private, final,... Typetipo (primitivo o reference) VariableDeclaratoridentificatore (anche di array), con eventuale inizializzazione

113 Introduzione al linguaggio Java 113 DICHIARAZIONE DI METODI [Doc comment] [Modifiers] ReturnType MethodName (ParameterList) [throws ClassType [,ClassType] … ] { MethodBody } Doc commentcommento di documentazione Modifiersstatic, public,protected,private, abstract, final,native,... ReturnType può essere un tipo primitivo o reference, o void (nessun valore di ritorno). Deve esse- re sempre specificato (ma non per i co- struttori) ParameterListun metodo ha sempre un numero fisso di argomenti (ma è possibile l’ overloading)

114 Introduzione al linguaggio Java 114 ESEMPIO int base; public int power (int n) { int i, p; p=1; for (i=1; i<=n; ++i) p=p*base; return p; } campo della classe variabili locali valore della funzione

115 Introduzione al linguaggio Java 115 IL MODIFICATORE static Campi e metodi dichiarati static, sono associati alla classe e non a una particolare istanza class MyClass { static int a; … static void MyMethod() { a = a+1; } Pertanto: esiste una sola copia di un campo statico, condiviso da tutte le istanze della classe; non occorre istanziare un oggetto per usare un membro statico; metodi statici possono accedere solo a membri statici della classe Sono qualificati con il nome della classe, e non della istanza MyClass.a =MyClass.a + 1;

116 Introduzione al linguaggio Java 116 ESEMPIO class Safe { static int LastSerialNumber; public int SerialNumber; int SetCombination; …. Safe(int Combination) { SerialNumber = LastSerialNumber++; SetCombination = Combination; } public static StartNewSeriesFrom (int Start) { LastSerialNumber = Start; } …. Safe.LastSerialNumber(100000);/* inizializza il numero di serie */ Safe MySafe = new Safe(23456);/* crea una Safe di SerialNumber = e combinazione */ … MySafe.SerialNumber …. Il costruttore Safe fa sì che ogni istanza di Safe abbia un SerialNumber unico

117 Introduzione al linguaggio Java 117 VARIABILI LOCALI Le variabili locali a un metodo: –sono visibili solo dal corpo del metodo –vengono allocate (nello stack di run-time) alla chiamata e deallocate all’uscita del metodo –non vengono inizializzate automaticamente (diversamente dai campi di una classe) Non si può accedere a una variabile a cui non si sia prima assegnato un valore (e viene segnalato in compilazione !) Esempio: int i; if ( cond ) { i = 55; … } i++; /* compile-time error */

118 Introduzione al linguaggio Java 118 LA KEYWORD this Se una variabile locale ha lo stesso nome di un membro della sua classe, questo risulta invisibile (“shadowing”) … … a meno di usare la keyword this, che denota l’oggetto corrente Esempio: class MyClass { int x, y, z; /* membri */ void MyMethod (int x) { /* parametro */ int y; /* variabile locale */ y=x+1; /* y è la variabile locale, x è il parametro */ z=this.x; /* this.x è il membro x */ … } NB: Poichè this denota un oggetto, non si può usare con membri dichiarati static

119 Introduzione al linguaggio Java 119 PASSAGGIO DI PARAMETRI A UN METODO Tutti i tipi primitivi sono passati per valore Anche i riferimenti a oggetti di tipo reference sono passati per valore Es: int i; SomeObject obj = new SomeObject(); MyMethod( i, obj ); …. Void MyMethod (int j, SomeObject o) { j = j+1; /* non altera i, passato per valore */ o = null; /* non altera obj, che si riferisce ancora all’oggetto */ } heap obj o i j

120 Introduzione al linguaggio Java 120 COSTRUTTORI Sono metodi che vengono chiamati quando si crea una istanza di una classe; non ritornano alcun valore Se non definisco alcun costruttore, per default viene fornito il costruttore vuoto: class MyClass { … MyClass() { } } Possono essere overloaded; non ha senso che siano static

121 Introduzione al linguaggio Java 121 ESEMPIO: OVERLOADING Dichiarazione di una classe MyNewClass public class MyNewClass { int i; public MyNewClass () { i = 10; } public MyNewClass (int j) { i = j; }..... } Creazione di una istanza di MyNewClass MyNewClass mc0, mc1; /* dichiarazione, non creazione */ mc0 = new MyNewClass(); /* creazione: l'attributo i vale 10 */ mc0.i++; /* ora i vale 11 */ mc1= new MyNewClass(20); /* creazione: l'attributo i vale 20 */ mc1.i++; /* ora i vale 21 */ Overloading: metodi omonimi devono essere distinguibili per la quantità e/o per il tipo degli argomenti

122 Introduzione al linguaggio Java 122 DISTRUZIONE DI OGGETTI Java non supporta distruttori di oggetti: gli oggetti non possono essere distrutti esplicitamente Un oggetto privo di riferimenti incidenti non è più accessibile, e la memoria che esso occupa può essere "riciclata" dal garbage collector, che opera in un thread indipendente a bassa priorità String s; /* dichiarazione, non creazione */ s = new String ("abc"); /* creazione: s punta a "abc" */ s = "def"; /* "abc" non è più puntata da s */

123 Introduzione al linguaggio Java 123 FINALIZZATORI DI OGGETTI Un oggetto "riciclabile" (cioè privo di puntatori incidenti) potrebbe trovarsi in uno stato poco "pulito" (ad es. potrebbe aver aperto dei file che non sono stati ancora chiusi) Prima di riciclarlo, il garbage collector invoca il metodo finalize dell’oggetto, es.: protected void finalize () throws Throwable {... super.finalize(); /* meglio metterlo sempre */ } Il metodo finalize esiste sempre: se non è stato definito, viene ereditato da Object;

124 Introduzione al linguaggio Java 124 IL MODIFICATORE native Un metodo è dichiarato native quando il suo codice è dipendente dalla piattaforma (ad esempio, è scritto in un altro linguaggio) Esempio: public native void seek(long pos) throws IOException ; non deve essere specificato il body

125 Introduzione al linguaggio Java 125 EREDITARIETA’

126 Introduzione al linguaggio Java 126 SOTTOCLASSI In Java, una classe può estendere una sola altra classe (ereditarietà singola) Una sottoclasse eredita i campi e i metodi della sua superclasse che non siano dichiarati private e che non siano costruttori, e li può usare come se fossero dichiarati al suo interno Un oggetto di una sottoclasse può essere usato ovunque può essere usato un oggetto della sua superclasse

127 Introduzione al linguaggio Java 127 ESEMPIO class Animale { Gatto Fufi = new Gatto(); float Peso; Animale creatura = Fufi; … void Mangia () { … } … } class Mammifero extends Animale { int BattitoCardiaco; // eredita Peso … void Respira() { … } // eredita mangia … } class Gatto extends Mammifero { // eredita BattitoCardiaco, Peso, Mangia, Respira void FaLeFusa() { … } } lecito, perchè “gatto” è una sottoclasse di “animale”

128 Introduzione al linguaggio Java 128 “COME” ESTENDERE UNA CLASSE Attenzione alla differenza fra la relazione “è un” e la relazione “ha un” : solo la prima può definire una sottoclasse Esempio: Un cerchio può essere definito mediante il suo centro e il suo raggio, ma sarebbe scorretto definire una classe cerchio come sottoclasse di punto: class punto {class cerchio extends punto { double x; int y; double raggio; …... }}

129 Introduzione al linguaggio Java 129 SHADOWING E OVERRIDING shadowing un campo di una sottoclasse può “nascon- dere” un campo omonimo di una sua superclasse overriding un metodo di una sottoclasse può “sovra- scrivere” un metodo di ugual “segnatura” e ugual ReturnType di una sua super- classe Esempio: class SuperClass { int i; void m(int k) {…} …} class Subclass extends Superclass { long i: void m(int n) {…} …} nasconde sovrascrive

130 Introduzione al linguaggio Java 130 POLIMORFISMO class Animale {Gatto Fufi = new Gatto(); …Animale creatura =Fufi; void Mangia () { … }creatura.Mangia(); … } class Mammifero extends Animale { … } class Gatto extends Mammifero { … void Mangia() { … }... } viene eseguito il metodo Mangia della classe Gatto! (binding dinamico: il metodo da chiamare viene selezionato a run-time)

131 Introduzione al linguaggio Java 131 LA KEYWORD super per denotare un membro nascosto (campo shadowed o metodo overridden non static), si può usare la keyword super Esempio: class SuperClass { int i; … } class Subclass extends SuperClass { long i: … i = super.i +1; … }

132 Introduzione al linguaggio Java 132 CASTING Gatto Fufi = new Gatto(); Animale creatura;... creatura = Fufi;/* ok */ Fufi = creatura;/* errore di compilazione: tipi incompatibili */ Fufi = (Gatto)creatura; /* ok, ma solo perchè creatura è un gatto: se non lo fosse, il controllo a run-time segnalrebbe una eccezione */

133 Introduzione al linguaggio Java 133 COSTRUTTORI NELLE SOTTOCLASSI Nel costruttore di una sottoclasse, è corretto, come prima cosa, chiamare il costruttore della superclasse Esempio: class SubClass extends SuperClass { SubClass() { super(); }

134 Introduzione al linguaggio Java 134 IL MODIFICATORE abstract Una classe è dichiarata abstract quando contiene almeno un metodo abstract (cioè senza body) Una classe abstract non può essere instanziata: occorre sovrascrivere tutti i metodi abstract in una sottoclasse, e istanziare la sottoclasse Esempio: abstract class a { … abstract int m(int k); } class b extends a {... int m(int n) { … } } sovrascrive, fornendo la implementazione del metodo

135 Introduzione al linguaggio Java 135 IL MODIFICATORE final final ha tre significati diversi: campo finalnon può essere modificato: è un campo costante (deve essere inizializzato) Esempio: final int i = 5; metodo finalnon può essere sovrascritto classe finalnon può avere sottoclassi (quindi i suoi metodi sono implicitamente final)

136 Introduzione al linguaggio Java 136 METODI final: ESEMPIO class Password { private int passwd; final boolean validatePassword(String s) { ….. }... } se non fosse final, potrebbe essere sovrascritto !

137 Introduzione al linguaggio Java 137 INTERFACCE

138 Introduzione al linguaggio Java 138 INTERFACCE Una interface è una struttura sintattica dotata di nome, che racchiude la specifica della segnatura e del ReturnType dei metodi di una classe non ancora implementata Esempio: interface Driveable { boolean startEngine(); void stopEngine(); float accelerate(float acc); boolean turn(Direction dir); }

139 Introduzione al linguaggio Java 139 IMPLEMENTAZIONE DI UNA INTERFACCIA Una interfaccia può essere implementata da una (o più) classi: interface Driveable { boolean startEngine();... } interface Automobile implements Driveable { boolean startEngine() {... } // una particolare implementazione …. } interface Motorcycle implements Driveable { boolean startEngine() {... } // un’altra implementazione …. }

140 Introduzione al linguaggio Java 140 POLIMORFISMO Esempio: Driveable vehicle; /* variabile di tipo interfaccia; le possiamo assegnare qualunque oggetto di una classe che implementa l’interfaccia */ Automobile auto = new Automobile(); Motorcycle moto = new Motorcycle();... vehicle = auto; vehicle.startEngine();/* polimorfismo: è il metodo di Automobile */ … vehicle = moto; vehicle.startEngine();/* polimorfismo: è il metodo di Motorcycle */

141 Introduzione al linguaggio Java 141 Una classe può implementare più di una interfaccia interface Driveable {interface Rentable { void startEngine(); void startRental(); void stopEngine(); void endRental(); float accelerate(float acc); int book(Date start, Date end); boolean turn(Direction dir);} } class AvisCar implements Driveable, Rentable { void startEngine() { … } void startRental() { … } … } EREDITARIETA’ MULTIPLA

142 Introduzione al linguaggio Java 142 SUPERINTERFACCE Una interfaccia può estendere una o più altre interfacce, es.: interface a extends b, c, d { …. } Ogni classe che implementa un’interfaccia deve estendere anche tutte le sue superinterfacce

143 Introduzione al linguaggio Java 143 INTERFACCE vs CLASSI abstract Le interfacce sono simili a classi che abbiano soltanto: –metodi abstract –campi static e final (cioè costanti) A differenza delle classi, le interfacce permettono di realizzare una forma di ereditarietà multipla

144 Introduzione al linguaggio Java 144 PACKAGES

145 Introduzione al linguaggio Java 145 PACKAGES Più classi o interfacce interrelate possono essere riunite in un package, dotato di nome Esempio: c e b d a MyPackage classe o interfaccia

146 Introduzione al linguaggio Java 146 NOMI DI CLASSI Il nome di una classe (o di una interfaccia) va sempre qualificato con il nome del package a cui appartiene, tranne quando viene usato all’interno dello stesso package Esempio: aaa.bbb.ccc.MyClass all’interno di aaa.bbb.ccc basta questo

147 Introduzione al linguaggio Java 147 NOMI DI PACKAGE Il nome di un package può essere composto da più identificatori separati da “.”: roberto.utilities.internet Per evitare che package di produttori diversi abbiano lo stesso nome, si suggerisce di far iniziare il nome del package con il dominio Internet del produttore (invertito, e con il nome di più alto livello tutto maiuscolo): IT.unimi.dsi.roberto.utilities.internet nome di dominio

148 Introduzione al linguaggio Java 148 PACKAGES STANDARD

149 Introduzione al linguaggio Java 149 LO STATEMENT package Specifica che le classi che seguono apparten- gono a un certo package Deve apparire (una sola volta) all’inizio di una unità di compilazione Esempio: class a {.. class b {... class c {.. a.java package p; le classi a,b,c appartengono al package p Se lo statement è omesso, la classe appartiene al package anonimo

150 Introduzione al linguaggio Java 150 LO STATEMENT import Per evitare di usare sempre nomi completi di classi, si può usare lo statement import Esempio: import java.util.Date; class MyClass { java.util.Date today; Date today; …...} Note: import java.util.* importa tutte le classi del package java.util java.lang.* è sempre importato implicitamente

151 Introduzione al linguaggio Java 151 PACKAGE E DIRECTORY Molti ambienti Java mappano i nomi dei package sui pathname del file system (compilatore e class loader) Esempio: aaa.bbb.ccc.MyClass aaa/bbb/ccc/MyClass packageclassedirectories file pathname

152 Introduzione al linguaggio Java 152 CLASS PATH Per indicare al class loader da quale directory partire per la mappatura può essere usata la variabile di ambiente CLASSPATH Esempio (Unix): setenv CLASSPATH /classi : /usr/roberto/classi :. java.lang.Math /java.lang.Math.class nome completo della classe pathname assoluto

153 Introduzione al linguaggio Java 153 VISIBILITA’ Classi e interfacce sono visibili all’interno del package in cui sono dichiarate; sono visibili all’esterno del package solo se dichiarate public public class a { … public interface b { … Membri (campi e metodi) sono visibili quando: –la loro classe è visibile e –il loro modificatore li rende visibili

154 Introduzione al linguaggio Java 154 VISIBILITA’ DI CAMPI E METODI ModificatoreVisibilità privatesolo nella classe in cui è definito nessuno (default)solo nelle classi del package protectedclassi nel package e sottoclassi (stesso package o altri package) publictutte le classi NB: I membri di una interfaccia sono sempre pubblici più visibile

155 Introduzione al linguaggio Java 155 class a {... package pac ESEMPIO class b { private int i; private void m( ) {…} int j; void n( ) {…} public int k; public p( ){…} protected int i; protected void m( ){…} class d extends b {... class c {... class e extends d {... class d extends b {... visibile

156 Introduzione al linguaggio Java 156 PROGETTARE LA VISIBILITA’ Quando progettiamo una classe dobbiamo pensare a due tipi di utenti: quelli che utilizzeranno la classe per realizzare delle applicazioni quelli che estenderanno la classe per realizzare sottoclassi I primi useranno i membri public; i secondi anche i membri protected Le interfacce public e protected vanno progettate con cura

157 Introduzione al linguaggio Java 157 package pac USA ESTENDE interfaccia DUE TIPI DI UTENTI class a { private int i; private void m( ) {…} int j; void n( ) {…} public int k; public p( ){…} protected int i; protected void m( ){…}

158 Introduzione al linguaggio Java 158 PACKAGES: RIASSUNTO I packages: permettono di creare gruppi di classi e interfacce fra loro in relazione definiscono uno spazio di nomi locale per classi e interfacce evitando conflitti con classi e inter- facce di altri packages permettono di avere classi, interfacce e membri (campi e metodi) non visibili all’esterno del package possono essere organizzati gerarchicamente

159 Introduzione al linguaggio Java 159 UNITA’ DI COMPILAZIONE: RIASSUNTO MyClass.java package Roberto.util; /* opzionale */ import java.util.* ; /* opzionale */ public class MyClass { … } class MyOtherClass { /* opzionale */ … } interface MyInterface { /* opzionale */ … }

160 Introduzione al linguaggio Java 160 STRUTTURA DI UN’APPLICAZIONE

161 Introduzione al linguaggio Java 161 STRUTTURA DI UN’APPLICAZIONE Affinchè un sistema a oggetti “parta”, devo avere una classe con un metodo statico e pubblico di nome main a b c d g f e main

162 Introduzione al linguaggio Java 162 Hello.java HALLO WORLD class Hello { public static void main (String args []) { System.out.println("Hello World!"); } obbligatorio in questa forma

163 Introduzione al linguaggio Java 163 SPIEGAZIONI public static void main (String args []) –void indica che main non ritorna nulla, il che è necessario per superare il type-checking del compilatore –args[] sono gli argomenti passati a main dalla shell quando si digita: java Hello arg1 arg2... argn –String dice che gli argomenti sono di classe String –public rende il metodo main visibile alle altre classi - e al comando java (interprete) –static associa main alla classe Hello, e non alle sue istanze System.out.println("HelloWorld!") –invoca il metodo println dell’oggetto out della classe System, che stampa la stringa sul file stdout

164 Introduzione al linguaggio Java 164 UNITA’ DI COMPILAZIONE Il sorgente di un’applicazione consiste di uno o più file (“unità di compilazione”) Ogni file contiene una o più dichiarazioni di classi (o di interfacce), di cui al più una dichiarata public Il nome del file deve essere uguale a quello della sua classe public, con estensione.java: public class a {... class b {... class c {.. file a.java stesso nome

165 Introduzione al linguaggio Java 165 javac a.java public class a {… public main (..) {…. a.java a.class java a args class b {… …uso di c... b.class il compilatore crea file di nome classname.class classe c, usata da b, compilata in precedenza COMPILAZIONE ED ESECUZIONE La classe a deve contenere un metodo pubblico e statico di nome main c.class

166 Introduzione al linguaggio Java 166 COMPILAZIONE ED ESECUZIONE Verificare le caratteristiche del sistema di programmazione utilizzato

167 Introduzione al linguaggio Java 167 MULTITHREADING

168 Introduzione al linguaggio Java 168 CHE COS’E’ IL MULTITHREADING possibilità di realizzare più flussi di controllo concorrenti (“threads”) nell’ambito di una stessa applicazione possibilità di condividere dati fra i threads possibilità di controllare i threads e di sincroniz- zare i threads fra loro, attraverso opportune primitive Nota: la filosofia è ispirata ai monitor di C.A.R. Hoare

169 Introduzione al linguaggio Java 169 MULTITASKING E MULTITHREADING OS Task 1 Task 2 Task 3 Memoria locale Memoria condivisa Multitasking Multithreading OS Task 1 Task 2 Memoria locale Memoria condivisa Monitor (interprete Java) Thread 1 Memoria locale Thread 2 Thread 3 Memoria condivisa

170 Introduzione al linguaggio Java 170 RUN-TIME DATA AREA Stack Method Area Heap Program Counter …. Thread 1Thread 2Thread n oggetti condivisi fra i thread, creati dinamicamente e garbage collected qui vengono caricati dal class loader i files.class, contenenti la descrizione della classe (campi, metodi, ecc.) variabili locali, ecc. dei metodi

171 Introduzione al linguaggio Java 171 LA CLASSE Thread In Java, ogni thread è un oggetto: ogni singolo thread viene creato come una istanza della classe java.lang.Thread ogni istanza di java.lang.Thread deve essere associata a un metodo run() di qualche classe, che contiene il codice che deve essere eseguito dal thread la classe java.lang.Thread contiene tutti i metodi per la gestione dei thread … e in particolare il metodo start(), per “lanciare” il thread con il metodo run() “opportuno”

172 Introduzione al linguaggio Java 172 LA CLASSE Thread: SCHEMA public class Thread implements Runnable Runnable target; …. public syncronized native void start() { … run(); } public void run() { if (target != null) { target.run(); } } Thread (Runnable t) { target = t; …. } } public interface Runnable { public abstract void run(); } “lancia” il thread, rendendolo schedula- bile. Esegue il metodo run() del Thread, che a sua volta lancia il metodo run() dell’oggetto passato come parametro al costruttore Thread(), oppure (se Thread non ha parametri) non fa nulla.

173 Introduzione al linguaggio Java 173 COME REALIZZARE UN THREAD Ci sono due metodi per realizzare un thread: Metodo 1: implementando la interfaccia Runnable Metodo 2: estendendo la classe java.lang.Thread e sovrascrivendo run()

174 Introduzione al linguaggio Java 174 METODO 1 public interface Runnable { public abstract void run(); } class Application implements Runnable { public void run() { } }... Application a = new Application(); /* creo l’Application a il cui metodo run() dovrà essere eseguita in un thread */ Thread th = new Thread(a); /* creo un thread e gli passo il riferimento all’Application a */ th.start(); /* lancio il thread, eseguendo il metodo a.run() */

175 Introduzione al linguaggio Java 175 ESEMPIO 1.1 public class drinks { public static void main(String[] a) { Coffee c = new Coffee(); Tea t = new Tea(); Thread th1 = new Thread(c) ; th1.start(); Thread th2 = new Thread(t) ; th2.start() ; } class Coffee implements Runnable { public void run() { while(true) { System.out.println(“I like coffee”);} } class Tea implements Runnable { public void run() { while(true) { System.out.println(“I like tea”);} } In questo esempio, un main crea e lancia i thread

176 Introduzione al linguaggio Java 176 ESEMPIO 1.2 public class drinks { public static void main(String[] a) { Coffee c = new Coffee(); Tea t = new Tea() ; } class Coffee implements Runnable { Thread th; public void run() { while(true) { System.out.println(“I like coffee”);} } Coffee() { th = new Thread(this) ; th.start(); } } class Tea implements Runnable { Thread th; public void run() { while(true) { System.out.println(“I like tea”);} } Tea() { th = new Thread(this) ; th.start() ; } } In questo esempio, ogni oggetto crea e lancia il proprio thread

177 Introduzione al linguaggio Java 177 METODO 2 class Thread implements Runnable { public void start() { … run(); } public void run() { } } class MyThread extends Thread { // eredita start() public void run() { } } MyThread p = new MyThread(); p.start(); sovrascrive

178 Introduzione al linguaggio Java 178 ESEMPIO 2.1 public class drinks { public static void main(String[] a) { Coffee th1=new Coffee(); th1.start(); Tea th2=new Tea() ; th2.start(); } class Coffee extends Thread { public void run() { while(true) { System.out.println(“I like coffee”);} } class Tea extends Thread { public void run() { while(true) { System.out.println(“I like tea”);} } In questo esempio, un main crea e lancia i thread

179 Introduzione al linguaggio Java 179 ESEMPIO 2.2 public class drinks { public static void main(String[] a) { Coffee th1=new Coffee(); Tea=th2 new Tea() ; } class Coffee extends Thread { public void run() { while(true) { System.out.println(“I like coffee”);} } Coffee() { start(); } } class Tea extends Thread { public void run() { while(true) { System.out.println(“I like tea”);} } Tea() { start(); } } In questo esempio, ogni thread si lancia da solo

180 Introduzione al linguaggio Java 180 QUANDO UN thread TERMINA? Un thread continua nella sua esecuzione, fino a quando: 1.run() ritorna 2.viene eseguito il metodo stop() del thread 3.una eccezione causa l’uscita da run()

181 Introduzione al linguaggio Java 181 SCHEDULING lo scheduling è effettuato sulla base della priorità dei thread la priorità può essere modificata mediante il metodo setPriority a parità di priorità, lo scheduling è di tipo round- robin

182 Introduzione al linguaggio Java 182 ALCUNI METODI DI Thread public void start()lancia il thread public void run()esegue il codice public final void stop()distrugge il thread public final void suspend()sospende il thread public final void resume()riattiva il thread public static void sleep(long n)sospende il thread per n msec public final void setPriority(int newPriority) modifica la priorità public final int getPriority()ottieni la priorità public static void yield()rischedula public final native boolean isAlive()true se il thread è vivo...

183 Introduzione al linguaggio Java 183 GLI STATI DI UN THREAD New thread Runnable Dead Not Runnable Not Runnable new Thread() start() stop() run() exit yield() suspend() sleep() wait() resume() notify() Alive

184 Introduzione al linguaggio Java 184 i=0 thread 1thread 2 class Count { int i = 0; void incr() { i+1 1 i = i + 1;i }i = 1 void decr() {i = -1 i = i - 1; } Il valore finale di i dipende dalla sequenza di esecuzione IL PROBLEMA DELLA MUTUA ESCLUSIONE

185 Introduzione al linguaggio Java 185 METODI synchronized Il modificatore synchronized prescrive che il metodo a cui si applica sia eseguito da un solo thread alla volta: - quando un thread esegue un metodo synchronized, viene fatto un lock dell’oggetto cui appartiene il metodo (o, per metodi static, della classe) -quando il thread termina l’esecuzione del metodo, viene fatta una unlock -prima di tale unlock, eventuali altri metodi synchronized si pongono in attesa

186 Introduzione al linguaggio Java 186 ESEMPIO thread 1thread 2 istanza di a lock call metodo synchronized

187 Introduzione al linguaggio Java 187 istanza di a ESEMPIO thread 1thread 2 istanza di a lock call metodo synchronized

188 Introduzione al linguaggio Java 188 istanza di a ESEMPIO thread 1thread 2 istanza di a lock call metodo synchronized classe a call metodo static synchronized

189 Introduzione al linguaggio Java 189 i=0 thread 1thread 2 class Count { int i = 0; synchronized void incr() {i+1 1 i = i + 1;i = 1 } synchronized void decr() {i -1 0 i = i - 1;i = 0 } Il valore finale di i NON dipende dalla sequenza di esecuzione ESEMPIO

190 Introduzione al linguaggio Java 190 BLOCCHI synchronized La keyword synchronized può essere usata anche per proteggere blocchi arbitrari, e non solo metodi in tal caso, occorre specificare l’oggetto di cui acquisire il lock Esempio: synchronized ( myObject ) { }

191 Introduzione al linguaggio Java 191 ESEMPIO synchronized void MyMethod() { … } è equivalente a: void MyMethod() { synchronized (this) { … }

192 Introduzione al linguaggio Java 192 ESEMPIO import java.util.Vector; public class MsgQueue { Vector queue = new Vector(); public synchronized void send(Object obj) { queue.addElement(obj); } public synchronized Object receive() { if (queue.size() == 0) return null; Object obj = queue.firstElement(); queue.removeElementAt(0); return obj; }

193 Introduzione al linguaggio Java 193 wait, notify Sono metodi della classe Object: public final void wait(); /* rilascia il lock e si pone in wait */ public final void wait(long millis); /* wait con timeout */ public final void notify(); /* rilascia il lock */

194 Introduzione al linguaggio Java 194 ESEMPIO Schema Produttore-Consumatore // Thread produttore: produce un dato while (buffer_full) wait() produce_data() notify() //Thread consumatore: consuma un dato while (no_data) wait() consume_the_data() notify()


Scaricare ppt "Introduzione al linguaggio Java 1 CORSO DI SISTEMI OPERATIVI Università di Milano, a.a. 1996-97 INTRODUZIONE AL LINGUAGGIO JAVA Roberto Polillo (Queste."

Presentazioni simili


Annunci Google