Introduzione alla programmazione con linguaggio Java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Note di Copyright Queste trasparenze (slide) sono coperte dalle leggi sul copyright. Testi grafica e immagini in essa contenuti sono di proprietà dei rispettivi autori: Dr. Maurizio Carta, Ing. Ing. Mauro Ennas, Ing. Ing. Stefano Piras e Ing. Ing. Fabrizio Saba. Saba. Tali slide possono essere duplicate e riprodotte dalle scuole di ogni ordine e grado italiane o estere per applicazioni legate alla didattica e senza finalità di lucro. Ogni altra finalità o uso (ivi compresa la duplicazione su supporto magnetico, la trasmissione, la memorizzazione e la stampa totale o parziale) è vietata senza autorizzazione scritta da parte degli autori. Gli autori non si assumono nessuna responsabilità sulle informazioni contenute in queste slide che sono state realizzate per finalità meramente didattiche e sono aggiornate alla data riportata in calce. L’intestazione a piè pagina deve comunque non essere alterata e deve sempre essere riportata anche in un utilizzo parziale del suddetto materiale. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Indice del corso • • • • • • • Modulo Modulo Modulo Modulo Modulo Modulo Modulo 1: 2: 3: 4: 5: 6: 7: Introduzione Sintassi Java Oggetti e Classi Features Eccezioni GUI Extra ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Modulo 1 Definizioni introduttive e concetti ricorrenti ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } In questo modulo • • • • • Il processo di produzione del software Java Virtual Machine Garbage Collection Code Security Scrivere, compilare ed eseguire un’applicazione Java Docs ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintesi degli argomenti trattati • Processi – Waterfall – Unified Model • Concetti chiave dell’OOP (programmazione orientata agli oggetti) – – – – – Java Virtual Machine Code Security Garbage Collection Classi Oggetti: attributi e metodi ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Processi Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Processi Metodologia orientata agli oggetti • È una tecnica do modellazione dei sistemi • Descrive e modella i sistemi come una interazione tra oggetti correlati tra loro • L’interazione degli oggetti all’interno del sistema è organizzata in classi • La metodologia consiste di tre componenti – Un processo – Una notazione – Un insieme di regole ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Processi Metodologia orientata agli oggetti • Un processo – Attività passo passo, utilizzate come modello di progetto e sviluppo di software (esempio: Rational Unified Process) • Una notazione – Rappresentazione, spesso grafica, che descrive sottosistemi che complessivamente costituiscono sistema in esame e le loro interazioni • Un insieme di regole – Insieme di regole che descrivono come il sistema lavora ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } i il Processi Analisi e Progetto • La fase di analisi focalizza la sua attenzione sui seguenti punti: 1. Stabilire una chiara visione sul problema economico (business view) 2. Identificare le fasi che il sistema deve attraversare nel funzionamento 3. Stabilire un vocabolario comune per descrivere il problema 4. Individuare la soluzione migliore al problema ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Processi Analisi e Progetto • La fase di progetto focalizza la sua attenzione sui seguenti punti: 1. Risolvere il problema 2. Identificare il “come fare” invece del “cosa fare” 3. Introdurre sistemi di supporto che permettano sistema di lavorare 4. Definire ed implementare strategie per il sistema ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } al Caratteristiche della OOP Oggetti e Classi • Le caratteristiche principali della programmazione orientata agli oggetti sono rappresentate da “oggetti” e “Classi” – Gli oggetti sono i mattoni mediante i quali si costruiscono sofisticati software nell’OOP – Le classi rappresentano il modo in cui devono essere realizzati gli oggetti ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Caratteristiche della OOP Oggetti • Sono singole entità, univocamente determinabili • Vengono utilizzati come mattoni nel progetto di software Object Oriented • Hanno identità, dati e comportamento • Possono essere semplici o complessi • Possono essere reali (appartenenti al mondo reale) o immaginari • Hanno attributi e operazioni (detti metodi) • Sono istanze dinamiche di una classe ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Caratteristiche della OOP Classi • La classe definisce un oggetto • Tutti gli oggetti vengono creati a partire da una classe ossia sono istanze di una classe ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Caratteristiche della OOP Caratteristiche principali dell’OOP • • • • • • • • Astrazione Icapsulazione Associazione Aggregazione Composizione Ereditarietà Coesione ed accoppiamento Polimorfismo ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Caratteristiche principali della OOP Astrazione (Abstraction) • Astrazione – Processo che ignorando i dettagli concentra la sua attenzione sulle caratteristiche essenziali di un oggetto o di un’entità – Semplifica le funzionalità e le informazioni – Aiuta l’utente ad interagire con gli oggetti ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Caratteristiche principali della OOP Incapsulazione (Encapsulation) • Incapsulazione – Si riferisce al meccanismo di dell’informazione all’interno di un oggetto – Produce due visioni dell’oggetto mascheramento • Una visione esterna: mostra cosa l’oggetto è in grado di fare • Una visione interna: spiega come è in grado di fare un determinato task ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Caratteristiche principali della OOP Aggregazione (Aggregation) • Aggregazione – Si riferisce alla possibilità di definire un oggetto in termini di parti componenti – È un tipo particolare di associazione – Qualifica relazioni del tipo “Come un …” ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Caratteristiche principali della OOP Composizione (Composition) • Composizione – Si palesa quando un oggetto è contenuto in un altro – È un tipo di associazione – Qualifica la relazione di tipo “Contenuto in …” ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Caratteristiche principali della OOP Ereditarietà (Inheritance) • Ereditarietà – È il meccanismo attraverso il quale si definisce una nuova classe in termini di una classe esistente – Viene qualificata dalla frase “è un …” oppure “un tipo di …” – Permette di relazionare gruppi di classi in modo da permettere una loro gestione collettiva ed il loro utilizzo ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Caratteristiche principali della OOP Ereditarietà (Inheritance) Animali Cani Gatti ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Uccelli Caratteristiche principali della OOP Coesione ed Accoppiamento • Coesione – Misura quanto una classe o un gruppo di classi contribuisca ad un singolo obiettivo all’interno di un sistema • Accoppiamento – Misura quanto due o più classi sono legate ad altre classi – È anche una misura delle dipendenze fra oggetti ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Caratteristiche principali della OOP Polimorfismo (Polymorphism) • Il polimorfismo si riferisce a funzioni che possono essere applicate ad oggetti istanziati da classi diverse, per ottenere lo stesso risultato semantico • Operazioni simili definite per più di una classe sono polimorfiche • Si basa sull’ereditarietà • L’implementazione di un metodo polimorfico dipende dall’oggetto al quale è applicato ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Caratteristiche principali della OOP Gerarchia di oggetti Veicoli Aerei Auto Sportive Cabriolet Utilitarie Formula 1 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi di sviluppo Sviluppo di processi • Metodi tradizionali – Processo a cascata • Metodi unificati di sviluppo – Unified Process ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi tradizionali di sviluppo Processo a cascata Metodi tradizionali Requirements Analysis Design Tempo • Lo sviluppo viene completato in una esecuzione delle fasi sequenziale • Ogni fase deve essere completamente eseguita e documentata prima di passare alla successiva; i problemi di implementazione si scoprono tardi ed è difficile intervenire Implementation Test ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo OOA&D Process • Metodi unificati di sviluppo – Tipicamente si tratta un progetto come se si tratasse di tanti progetti parziali – UML (Unified Modeling Language) è una notazione non un processo – La ”Unified Software Development Process” è iterativo ed incrementale ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo Ciclo di vita del progetto • La “Unified Software Development Process” è iterativo ed incrementale – L’iterazione si riferisce ad un passo nel ciclo di vita del progetto – Il risultato dell’interazione è una crescita del progetto – Progetti di grosse dimensioni vengono scomposti in più progetti di dimensioni ridotte ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo Ciclo di vita del progetto • La “Unified Software Development Process” è iterativo ed incrementale – Per ogni fase di sviluppo si deve: • • • • Selezionare ed utilizzare i casi di uso rilevanti Creare il progetto utilizzando l’architettura scelta Implementare il progetto utilizzando componenti Verificare se i componenti soddisfano i precedentemente individuati casi d’uso – Quando l’iterazione ha raggiunto il suo obbiettivo, lo sviluppo procede alla stadio sucessivo ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo Fasi principali • Fasi del ciclo iterativo e incrementale – – – – Inception Elanoration Costruction Transition • Ogni ciclo presenta uno o più iterazioni • Il completamento di ciascuna fase rappresenta una “milestone” ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo Fasi del ciclo iterativo e incrementale • Inizializzazione (inception) – – – – – – Lancio del progetto Stabilire un obbiettivo economico per il progetto Definire il problema in termini di “bussines” Individuare rischi critici Definire le finalità per chiarire il problema Documentare il “Bussiness Problem” ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo Fasi del ciclo iterativo e incrementale • Elaborazione (elaboration) – – – – Analisi e progetto di alto livello Stabilire l’architettura di base del progetto Monitorare i rischi critici del progetto Creare un piano che supporti gli obbiettivi del progetto ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo Fasi del ciclo iterativo e incrementale • Costruzione (costruction) – In questa fase tutto è teso a produrre miglioramenti progressivi nella costruzione del software ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo Fasi del ciclo iterativo e incrementale • Transizione (transiction) – Introdurre il software ai clienti – Completare il test della versione preliminare – Implementare il tuning della prestazioni, dell’utilizzazione e della soddisfazione da parte del cliente ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo Flusso • Flusso del ciclo iterativo ed incrementale – – – – – – Analisi iniziale dei requisiti Analisi Progetto Implementazione Testing Differenti iterazioni del flusso per realizzare differenti stati di approfondimento dei contenuti ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo Flusso Requirements Tempo Feed Back Analysis Design Implementation Test ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo Sviluppo iterativo del flusso Requirements Analysis Design Test Requirements Analysis Design Implementation Test 3° iterazione Implementation 2° iterazione 1° iterazione Tempo Requirements Analysis Design Implementation Test ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi unificati di sviluppo Benefici del flusso iterarivo • • • • Riduzione dei costi Migliore manutenzione e scheluding Migliore distribuzione dei tempi di lavoro di gruppo Migliore capacità di far fronte alle esigenze dei clienti utilizzatori ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Java Virtual Machine (JVM) • Bytecode – Il codice prodotto dalla compilazione e che dovrà essere “digerito” dalla JVM è compatto ed efficiente (ottimizzato): la maggior parte dei controlli di tipo vengono effettuati nel “compilation time” – Esso risulta “platform indipendent” ossia il codice (programma.java) compilato produce un bytecode (programma.class) che può essere eseguito su una JVM di una piattaforma qualsiasi “Uni*, linux, Windows, Mac-OS …) che soddisfi le “Java Virtual Machine Specifications” della Sun-Microsystems ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Java Virtual Machine (JVM) Compilazione Sistema Run Time CLASS LOADER Esecuzione Javac Hello.java Hello.java LA RETE Hello.class HARDWARE ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Sicurezza del codice (code security) • Ambiente di esecuzione (runtime environment) – Tre processi principali – Caricare Il “class loader” carica tutte le classi necessarie per l’esecuzione, separando lo spazio dei nomi locale da quello importato dalla rete! – Verificare Tutto il codice viene rigorosamente verificato, prima di essere eseguito sulla macchina locale! – Eseguire ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Sicurezza del codice (code security) • Class Loader – I metodi locali vengono sempre caricati per primi (limita i cavalli di Troia) • Bytecode verifier – – – – Rispetto delle specifiche della JVM Non ci devono essere violazioni di accesso I tipi dei parametri devono essere sempre corretti Non ci devono essere conversioni dei dati proibite (interi in “reference” ad esempio) • Runtime – Il codice viene eseguito se e solo se soddisfa i requisiti sopra indicati ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Sicurezza del codice (code security) Compilazione Sistema Run Time Javac Hello.java Hello.java CLASS LOADER Byte Code Verifier Interpreter LA RETE JIT code generator Runtime Hello.class HARDWARE ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Garbage collection • Il meccanismo di “deallocazione” della memoria automatico, non dipende dal programmatore! è – La “deallocazione” è a cura della JVM che esegue dei “processi” di verifica della memoria occupata e permette di “marcare” quella che può essere successivamente liberata – Ciò limita la possibilità che una applicazione possa terminare involontariamente (crash) a causa di una impossibilità di allocazione di nuova memoria “memory leaks” – La “deallocazione” dinamica (“garbage collection”) varia con l’implementazione della JVM su piattaforme distinte ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Concetti ricorrenti • Variabile • Classe • Oggetto – Attributi – Metodi • Erediterietà e polimorfismo • Interfaccia e Package ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Classe: modello di un oggetto • Classe – Modello di oggetto, contenente variabili e metodi che ne rappresentano il comportamento e gli attributi. Una classe può ereditare variabili e metodi da altre classi • Metodo di classe – Metodo definito in una classe; può essere richiamato tramite la classe oppure una delle sue istanze • Istanza di una classe – Equivale ad un oggetto; ogni oggetto è un’istanza di una classe • Metodo istanza – Metodo definito in una classe, che agisce su un’istanza della classe stessa. In generale, i metodi istanza sono chiamati semplicemente metodi ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Oggetto: Istanza di una classe • Variabile istanza – Variabile che appartiene ad un’istanza individuale, il cui valore è depositato in un’istanza • Interfaccia – Collezione di specifiche astratte di comportamenti, che ogni classe può implementare individualmente • Oggetto – Istanza concreta di una classe. Oggetti diversi, istanze della stessa classe, accedono agli stessi metodi, ma portano spesso valori differenti nelle proprie variabili istanza • Package – Collezione di classi ed interfacce. Le classi dei package diversi da java.lang devono essere importate esplicitamente o richiamate con il nome completo del package ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Variabili e tipi di dato • Variabile istanza – Definiscono gli attributi e lo stato di un oggetto • Variabili di classe – Le variabili di classe sono simili alle variabili di istanza ma si applicano a tutte le istanze di una stessa classe e alla classe stessa • Variabili locali – Sono dichiarate ed utilizzate nelle dichiarazioni di metodi, ad esempio per i contatori dei cicli, come valori temporanei, rilevanti solo all’interno di uno stesso metodo (o di un blocco) la memoria occupata da una variabile locale viene liberata Diversamente da altri linguaggi, Java non possiede variabili globali, cioè variabili visibili (accessibili) da tutte le componenti del programma. Per comunicare dati globali si utilizzano variabili istanza e di classe. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Incapsulazione (incapsulation) • L’icapsulazione è il processo attraverso il quale si nascondono le parti interne dell’implementazione di un oggetto, consentendo l’accesso a quest’ultimo soltanto attraverso un’interfaccia definita ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Incapsulazione (incapsulation) • Package è il livello di protezione di “default”, significa che metodi e variabili sono accessibili a tutte le altre classi dello stesso package • Protezione private significa che metodi e variabili sono accessibili soltanto ad altri metodi della stessa classe • Protezione public significa che metodi e variabili sono accessibili a tutte le classi java • Protezione protected significa che metodi e variabili sono accessibili a tutte le classi dello stesso package e alle sottoclassi esterne ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Incapsulazione (incapsulation) Modificatore Stessa Classe Stesso package Sottoclasse Universo Public SI SI SI SI Protected SI SI SI Default SI SI Private SI Una variabile, un metodo o una classe hanno accessibilità di default se non hanno un modificatore di protezione esplicito come quelli indicati. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Ereditarietà (inheritance) L’ereditarietà è il concetto della programmazione orientata agli oggetti in cui tutte le classi sono organizzate in una stretta gerarchia Ogni classe della gerarchia ha delle superclassi (classi che la precedono) e sottoclassi (classi che la seguono in gerarchia) Le sottoclassi ereditano attributi e comportamenti dalle loro superclassi ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP Polimorfismo (polymorphism) • Il polimorfismo è l’abilità di avere molte forme differenti – Un oggetto ha una sola forma – Una variabile è polimorfica perché riferisce oggetti di forme differenti • Una “reference” ha più forme (può individuare oggetti di forma differente) public class Impiegato extends Object … public class Manager extends Impiegato … ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Concetti chiave dell’OOP “Riusabilità” del codice • La programmazione in java è basata su moduli e componenti software le cui funzionalità ottimizzate possono essere utilizzate per realizzare più codici distinti che richiedono stesse funzionalità • È buona norma realizzare codici che prevedano il riuso delle routine e degli algoritmi che vengono di volta in volta programmati, per permettere una più agile costruzione di codici con funzionalità simili migliorando così le performance di produzione software ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Scrivere, compilare ed eseguire • Compilare – javac Hello.java • Eseguire – java Hello // // CiaoMondo.java CiaoMondo.java public public class class CiaoMondo CiaoMondo {{ public public static static void void main main CiaoMondo CiaoMondo (Sting (Sting args){ args){ System.out.println(“Ciao Mondo!”); System.out.println(“Ciao Mondo!”); } } }} ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Applicazioni java La prima application: HelloWorld // CiaoMondo.java public class CiaoMondo { public static void main CiaoMondo (Sting args){ //contenuto: System.out.println(“Ciao Mondo!”); } } //fine della classe ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Compilazione e running (1) Compilazione e running Compilazione di application e applet – Sono necessari i file class della API java, disponibili gratuitamente nel sito: http://java.sun.com Installare JDK (Java Development Kit), edizione standard o enterprise: – Java™2 SDK, Standard Edition (J2SE) – Java™2 SDK, Enterprise Edition (J2SEE) In tal modo si avrà una directory del tipo C:/j2se1.4.1 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Compilazione e running (2) Compilazione e running Nella sottodirectory c:/j2se/bin vi sono i comandi Per la compilazione si usa c:/j2se/bin/javac HelloWorld.java In assenza di errori la compilazione produce il file HelloWorld.class ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Compilazione e running (3) Compilazione e running Compilazione di servlet Sono necessari i file class della API java per i servlet, disponibili gratuitamente nel sito: http://java.sun.com/products/servlets Installare JSDK (Java Servlet Development Kit) In tal modo si avrà una directory c:/jsdk2.1 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Compilazione e running (4) Compilazione e running Compilazione di servlet La directory c:/jsdk2.1 contiene il file servlet.jar, che serve per compilare i servlet Il comando è: c:/j2se/bin/javac –classpath c:/jsdk2.1/servlet.jar Aservlet.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Compilazione e running (5) Compilazione e running Esecuzione (running) • Di un’applicazione – C:/j2se/bin/java HelloWorld • Di un’applet – C:/j2se/bin/appletviewer AnApplet.html oppure – Collegamento all’URL di AnApplet.html • Di un servlet: – Collegamento all’URL di AServlet.html e interazione (con bottoni, campi di testo, ecc.) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Compilazione e running (6) Compilazione e running Per evitare di digitare il path completo di ogni comando, aggiungere c:/j2se/bin alla variabile d’ambiente PATH In tal modo, il comando di compilazione diventa, ad esempio: prompt>javac C:/>javac ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Java docs Application Programming Interface (API) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Grazie per l’attenzione – Domande? ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione alla programmazione con linguaggio Java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Note di Copyright Queste trasparenze (slide) sono coperte dalle leggi sul copyright. Testi grafica e immagini in essa contenuti sono di proprietà dei rispettivi autori: Dr. Maurizio Carta, Ing. Ing. Mauro Ennas, Ing. Ing. Stefano Piras e Ing. Ing. Fabrizio Saba. Saba. Tali slide possono essere duplicate e riprodotte dalle scuole di ogni ordine e grado italiane o estere per applicazioni legate alla didattica e senza finalità di lucro. Ogni altra finalità o uso (ivi compresa la duplicazione su supporto magnetico, la trasmissione, la memorizzazione e la stampa totale o parziale) è vietata senza autorizzazione scritta da parte degli autori. Gli autori non si assumono nessuna responsabilità sulle informazioni contenute in queste slide che sono state realizzate per finalità meramente didattiche e sono aggiornate alla data riportata in calce. L’intestazione a piè pagina deve comunque non essere alterata e deve sempre essere riportata anche in un utilizzo parziale del suddetto materiale. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Indice del corso • • • • • • • Modulo Modulo Modulo Modulo Modulo Modulo Modulo 1: 2: 3: 4: 5: 6: 7: Introduzione Sintassi Java Oggetti e Classi Features Eccezioni GUI Extra ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Modulo 2 Sintassi del linguaggio Java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } In questo modulo • • • • • Il processo di produzione del software Java Virtual Machine Garbage Collection Code Security Scrivere, compilare ed eseguire un’applicazione Java Docs ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintesi degli argomenti trattati • Sintassi di base – – – – Variabili di tipo primitivo Dichiarazione e definizione di variabili Convenzioni sui nomi di classi, variabili e metodi Casting • Controllo del flusso: costrutti e operatori – Costrutti – Operatori • Matrici e vettori – Arrays – Il package java.util: classi Vector, Hashtable, Enumeration, StringTokenizer ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Commenti • Esistono tre tipi di commenti: /* per testo su più righe */ // su una sola riga /** per il sistema di documentazione javaDoc */ ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Tipi primitivi • Esistono otto tipi di dati primitivi – – – – Interi In virgola mobile Caratteri Logici byte, short, int, long double, float char boolean ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Interi Tipo Dimensione Valore Byte 8 bit Da -128 a 127 Short 16 bit Da -32768 a 32767 Int 32 bit Da -2147483648 a 2147483647 Long 64 bit Da – 9223372036854775808 a 9223372036854775807 Per “default” un intero e di tipo Int ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Reali (in virgola mobile, floating point) Tipo Dimensione Valore Float 32 bit +/- 3.40282347E+38F Double 64 bit +/- 1.79769313486231570E+308 Per “default” un floating point è di tipo double ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java I letterali floating point presentano: • • • • Un punto decimale Una parte esponenziale (E o e) Sono seguiti da F o f (float) Sono seguiti da D o d (double) Esempio: 3.14 6.456F 115.2E+306D semplice floating point (double) valore in virgola mobile (float) grosso valore double in virgola mobile (D è ridondante) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Carattere (char) • Rappresenta un carattere Unicode a 16 bit senza segno • Un char definito deve essere racchiuso da apici (‘ ‘) • Usa le seguenti notazioni: ‘a’ la lettera a ‘/t’ il tab ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Variabili logiche (boolean) • Il tipo è rappresentato da boolean che ha due valori letterali: True (vero) False (falso) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Variabili stringhe (String) • Il tipo String non è primitivo ma è una classe. • Si usa per rappresentare una serie di caratteri • Un letterale String è costituito da una serie di caratteri racchiusi tra doppi apici (“ “) • Può contenere salti di riga, tabulazioni e Unicode. “Ciao Mondo” “Ciao Mondo /t Ciao Mondo” “Ciao Mondo /n Ciao Mondo” stringa semplice stringa con tabulatore stringa nuova riga ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Dichiarazione di variabili • Per utilizzare una variabile bisogna prima dichiararla • Una dichiarazione di variabile è costituita da un tipo e un nome Esempio: Int n, m; float a; char c; string mioNome; boolean stato; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Assegnazione di variabili • Si può assegnare un valore ad una variabile tramite l’operatore di assegnamento (=) Es. x = 2; stato = true; • L’assegnazione si può fare anche quando si dichiara una variabile Es. int x = 2; boolean stato = true; string s=“ciao”; • Si possono concatenare più assegnazioni Es. x = y = 0; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Assegnazione di variabili Dichiarazione di una variabile = indicazione del tipo Es. int m; Assegnazione = attribuzione di un valore (coerente con il tipo) Es. m = 2; ma non m = 2.3; Dichiarazione e assegnazione: int m = 2; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Casting Ogni variabile primitiva è ospitata in una casella di memoria; Quando si dichiara e “inizializza” una variabile, viene riservato per essa uno spazio in memoria, di ampiezza variabile a seconda del tipo Ad esempio per un double occorre uno spazio maggiore che per un int ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Casting (esempio) a0x54 Int n = 12 1100 a0x57 Int m = n 1100 Viene copiato il valore di n, cioè il contenuto della casella di memoria di n, nella casella di memoria di m ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Casting Non si possono uguagliare variabili di tipo diverso: int n = 2; double b = n; Non si possono eseguire operazioni con tipi diversi: Double b = 2.5 * n; Bisogna trasformare n (10) in double (10.0) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Casting Bisogna ospitare n in una casella di memoria più ampia, atta a contenere un double Questo si realizza con il casting Double nd = (double) n; (nd=10.0) In generale, la sintassi del casting è: Tipo v1; Tipo v2 = (tipo1) v1; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Casting Ci sono due tipi di casting: il primo ospita le variabili in spazi di memoria più ampi di quello di partenza: byte short, short int, int double byte int, byte double, … short double, … Questo tipo di casting non fa perdere precisione ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Casting Il secondo ospita le variabili in spazi di memoria più piccoli quello di partenza: double int, double short, … double byte, int short, … short byte Questo tipo di casting fa perdere precisione e, se fatto male conduce a risultati senza senso ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Casting (esempi) double d1 = 12.9999; int n1 = (int) d1; byte b1 = (byte) n1; n1 vale 12 OK, b1 vale 12 n2 vale 1248 int n2 = 1248; byte b2 = (byte) n2; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } NO! Il byte va da -128 a 127 Sintassi di base di Java Casting (esempi) • L’application ExPrimitive.java variabili di tipo primitivo insegna ad utilizzare • L’application ExStringhe1.java insegna le basi dell’utilizzazione delle stringhe • L’application ExCasting.java insegna a fare il casting di variabili di tipo primitivo ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Convenzioni sui nomi • Variabili – nomi con iniziale minuscola; se composti, la seconda iniziale è maiuscola boolean stato string nome, tuoNome • Classi – nomi con iniziale maiuscola Class String class CiaoMondo • Metodi – nomi composti, anche verbi, che spieghino la funzione del metodo. La prima lettera è minuscola, le atre iniziali maiuscole accendiFari() addValue() ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Conclusioni • Abbiamo visto come dichiarare delle varibili di tipo primitivo e assegnare loro dei valori che siano coerenti con il tipo • Abbiamo visto come “ospitare” il contenuto di una variabile in un’altra di tipo diverso ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Sintassi di base di Java Richiami e suggerimenti • Ricordare bene tutti i tipi primitivi – – – – Interi In virgola mobile Caratteri Logici byte, short, int, long double, float char boolean ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori I costrutti. I cicli Ripetono un’istruzione o un blocco per un certo numero di volte In java esistono tre tipi di cicli: – ciclo for – ciclo while – ciclo do ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del ciclo for For (inizializzazione; espressione booleana; incremento) { … istruzione o blocco di istruzioni … } Esempio: int i; for (i=0; i < 3; i++) { out.println (“ciaoooooooo!”); } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del ciclo while while (espressione booleana) { … istruzione o blocco di istruzioni … } Esempio: int i; while (i < 3) { out.println (“ciaoooooooo!”); } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del ciclo do do { … istruzione o blocco di istruzioni … } while (espressione booleana); Esempio: int i=0; do { out.println (“ciaoooooooo!”); i++; } while (i < 3); Esercizio: ExCicli.java Esercizio: ExCicli.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori I costrutti condizionali Eseguono diverse istruzioni a seconda del verificarsi o meno di certe condizioni In java esistono: – costrutto if – costrutto switch ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del costrutto if (1) Il costrutto if ha varie sintassi a seconda che venga utilizzato con la parola chiave else o else if Nel caso più semplice si presenta come segue: if (espressione booleana) { … istruzione o blocco di istruzioni … } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del costrutto if (2) Quando è presente un else si scrive come segue: if (espressione booleana) { … istruzione o blocco di istruzioni … } else { … altre istruzioni … } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del costrutto if (3) Altrimenti con l’else if, ha la seguente sintassi: if (espressione booleana) { … istruzione o blocco di istruzioni … else if (espressione booleana) { … altre istruzioni … } … altri else if in numero qualunque … else { … altre istruzioni … } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del costrutto if - Esempi int voto; … if (voto>6){ Out.println(“sei stato promosso”); } else { out.println(“Sei stato bocciato”); } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del costrutto if - Esempi int int voto; voto; ... ... if if (voto (voto >= >= 8) 8) {{ out.println(“Sei out.println(“Sei stato stato promosso promosso con con ottimo!”); ottimo!”); }} else else if if (voto (voto >= >= 7){ 7){ out.println(“Sei out.println(“Sei stato stato promosso promosso con con buono”); buono”); }} else else if if (voto (voto >= >= 6){ 6){ out.println(“Sei out.println(“Sei stato stato promosso promosso con con sufficiente”); sufficiente”); }} else else if if (voto (voto << 6){ 6){ out.println(“Sei out.println(“Sei stato stato respinto”); respinto”); }} ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del costrutto switch Il costrutto switch si usa quando il valore di una variabile deve essere confrontato con una seri di valori interi (solo interi) switch (espressione) { case valore1: istruzioni; break; case valore2: istruzioni; break; … … … … default: istruzioni; break; } … ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del costrutto switch - Esempi int int voto; voto; ... ... switch switch (voto) (voto) {{ case case (8): (8): System.out.println(“Promosso System.out.println(“Promosso con con 8”); 8”); break; break; case (7): case (7): System.out.println(“Promosso System.out.println(“Promosso con con 7”); 7”); break; break; …… …… …… …… …… default: default: System.out.println(“Voto System.out.println(“Voto sconosciuto”); sconosciuto”); break; break; }} ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del costrutto switch - Esempi int int day; day; …… switch switch (day) (day) {{ case case 1: 1: out.println(“Lunedì”); out.println(“Lunedì”); break; break; case 2: case 2: out.println(“Martedì”); out.println(“Martedì”); break; break; …… …… …… …… default: default: out.println(“nessun out.println(“nessun giorno”); giorno”); break; break; }} ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori La sintassi del costrutto switch - Esempi Esercizio: Esercizio: ExCondizionali.java ExCondizionali.java int int day; day; …… switch switch (day) (day) {{ case case 1: 1: case 2: case 2: …… …… …… …… case case 5: 5: out.println(“Giorni out.println(“Giorni feriali”); feriali”); break; break; case 6: case 6: case case 7: 7: out.println(“Giorni out.println(“Giorni festivi”); festivi”); break; break; }} ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Operatori Un’espressione è un’istruzione che restituisce un valore. Le espressioni contengono operatori, che compiono operazioni sugli operandi. Gli operatori possono essere: • unari • binari • ternari ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Operatori unari Esercizio: Esercizio: ExOpUnari.java ExOpUnari.java Gli operatori unari sono: + - ++ -Gli operatori unari + e - sono uguali a quelli binari (utilizzati nelle operazioni aritmetiche). In questo caso danno il segno all’operando. Es. x = -a Gli operatori ++ e – sono detti risp. di autoincremento e autodecremento ++ incrementa di un’unità: -- decrementa di un’unità: ++x --x x = x + 1 x = x - 1 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Operatori binari • Gli operatori binari operano tra due operandi. • Si dividono in: – – – – aritmetici relazionali logici sui bit Esercizi: Esercizi: ExOpBinari1.java ExOpBinari1.java ExOpBinari2.java ExOpBinari2.java ExOpBinari3.java ExOpBinari3.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Operatori binari aritmetici • Gli operatori binari aritmetici sono: Operatore Descrizione esempio + Somma 2 + 3 - Sottrazione 5 – 2 * Moltiplicazione 3 * 2 / Divisione 12 / 3 % Modulo 10 % 3 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Operatori binari relazionali • Gli operatori binari relazionali sono: Operatore Descrizione esempio == Uguale a a == 2 != Diverso da a != 2 < Minore di a < 2 > Maggiore di a > 2 <= Minore o uguale a a <= 2 >= Maggiore o uguale a a >= 2 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Operatori logici • Gli operatori binari logici sono: Operatore & e && (and) | e || (or) Descrizione Restituiscono true solo se entrambi gli operandi sono veri, altrimenti restituiscono false Restituiscono true se almeno uno degli operandi è true, altrimenti restituiscono false ^ (xor) Restituisce true se i valori degli operandi sono diversi (uno vero e l’altro falso) e false se sono unguali ! (not) È la negazione del valore dell’operando; se A è true !A è false N.B.: l’operatore ! (not) è unario ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Operatori logici - Esempio Intero Intero aa == 29; 29; Intero b = 43; Intero b = 43; Stampa Stampa (“a (“a == ““ ++ aa ++ “, “, bb == “+ “+ b); b); Stampa (“L’affermazione a > b è Stampa (“L’affermazione a > b è ““ ++ (a (a >> b) b) ); ); Stampa (“L’affermazione a <= b è “ + (a <= b) Stampa (“L’affermazione a <= b è “ + (a <= b) ); ); Stampa (“L’affermazione a = b è “ + (a == b) ); Stampa (“L’affermazione a = b è “ + (a == b) ); Stampa Stampa (“L’affermazione (“L’affermazione aa != != bb èè ““ ++ (a (a != != b) b) ); ); Stampa (“(a < 10) && (b < 10) è” + ((a < 10) && Stampa (“(a < 10) && (b < 10) è” + ((a < 10) && (b (b << 10)) 10)) ); ); Stampa (“(a < 10) || (b < 10) è” + ((a < 10) || (b < 10)) ); Stampa (“(a < 10) || (b < 10) è” + ((a < 10) || (b < 10)) ); OUTPUT: OUTPUT: aa == 63, 63, bb == 99 L'affermazione L'affermazione aa >> bb e' e' true true L'affermazione L'affermazione aa <= <= bb e' e' false false L'affermazione a == b e' false L'affermazione a == b e' false L'affermazione L'affermazione aa != != bb e' e' true true (a < 10) && (b < 10) e' false (a < 10) && (b < 10) e' false (a (a << 10) 10) || || (b (b << 10) 10) e' e' true true ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Operatori ternari • L’unico operatore ternario è l’If-else booleano ? oper1 : oper2 • Se booleano è true viene valutato l’oper1 e il suo risultato diviene il risultato dell’espressione • Se booleano è false viene valutato l’oper2 e il suo risultato diventa il risultato finale dell’espressione ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Conclusioni • Abbiamo visto i costrutti principali e gli operatori • I costrutti, insieme agli operatori, agendo su variabili eseguono calcoli e sono alla base della programmazione ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Array – dichiarazione • Sono raccolte di oggetti dello stesso tipo, ai quali si può accedere con indici. Dichiarazione: Int [] arrayOfInts; O int arrayOfInts []; String [] strArray; Animal [] animals; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Array – inizializzazione (array costanti) int Dog Dog Dog numbers = {3, 4, 121, 2}; lilly = new Dog (…); lea = new Dog (…); [] myDogs = {lilly, lea}; Contiene solo le reference Non gli oggetti interi ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Array – uso string [] parole = new string [3]; parole [0] = “Ti”; //<- 1° elem. Indice 0 parole [1] = “dico”; //<- 2° elem. Indice 1 parole [2] = “ciao”; //<- 3° elem. Indice 2 For (int i=0; i<parole.lenght; i++) { system.out.println (parole[i]); } L’ultimo indice è lenght-1 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Array – multidimensionali Color [][][] rgbCube = new Color [256][256][256]; rgbCube [0][0][0] = Color.black; rgbCube [255][255][0] = Color.yellow; Abbastanza scomodo da usare Esercizio: ExArray.java Esercizio: ExArray.java Esercizio: Esercizio: ExArray2.java ExArray2.java <- stampa gli elementi di un array <- stampa gli elementi di un array <<- legge legge dati dati da da un un file file di di testo, testo, li li trasforma trasforma in in double double ee li li stampa stampa nello nello standard standard di di output output ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Il package java.util: StringTokenizer È una classe che divide una stringa in tanti pezzi, con previa indicazione di un separatore. Esempio: ExStringTokenizer.java ExStringTokenizer2.java con input ExStringTokenizer.txt Legge da file di testo della righe con campi separati da “#” e le riscrive con campi separati da blank (spazi) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Il package java.util: Vector & Hashtable Sono due classi di raccolta: una Hashtable immagazina oggetti registrandoli con una “chiave”; un Vector contiene una raccolta ordinata di elementi Sono dinamici ossia le loro dimensioni sono variabili durante l’esecuzione, non fisse come gli array ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Il package java.util: Vector Un Vector è un array dinamico: può crescere o diminuire durante l’esecuzione; vi si possono cioè aggiungere o rimuovere elementi Un Vector può contenere tanti tipi di oggetti, ma ATTENZIONE per “riprendersi” un oggetto bisogna sapere di che tipo è… ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Il package java.util – esempi Cat Cat fuffy fuffy == …… ;; Dog Dog liz liz == …… ;; Fish Fish jan jan == …… ;; …… // // operazioni operazioni con con fuffy, fuffy, liz, liz, jan jan …… Vector Vector animals animals == new new Vector(); Vector(); animals.addElement(fuffy); animals.addElement(fuffy); animals.addEleemnt(liz); animals.addEleemnt(liz); Animals.insertElement(jan,2); Animals.insertElement(jan,2); Elemento 0 Elemento 1 Elemento 2 Cat Cat fatCat fatCat == (Cat) (Cat) animals.elementAt(0); animals.elementAt(0); Fish selFish = (Fish)animals.elementAt(1); Fish selFish = (Fish)animals.elementAt(1); Per “riprendersi” un oggetto Bisogna fare il casting al suo tipo Errore! L’elemento in 1 non è un fish ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Il package java.util – esempi con Vector • ExPersone.java – Crea un insieme di oggetti di una classe Persona, e li inserisce in un Vector; li recupera e ne fa una stampa • ExPersone2.java – Accetta in input un nome e stampa in standard output tutte le persone con quel nome trovate in un file di testo usando Vector ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Il package java.util – Enumeration • Elenco non ordinato di oggetti (anche di tipo diverso) ai quali si può accedere iterando solo 1 volta, sequenzialmente. Si utilizza con un test: hasMoreElements() Che, se restituisce true, può essere eseguito da nextElement() Per accedere all’elemento successivo ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Il package java.util – Enumeration Esempio: il metodo elemets() della classe restituisce una Enumeration … Supponiamo che v sia un Vector di String: Enumeration enum=v.elements(); While(enum.hasMoreElements()) { String s = (String)enum.nextElemet(); System.out.println(s); } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Vector Array e Vector Il package java.util – Hashtable • L’Hashtable è come un armadio in cui ogni scomparto ha delle etichette – Ad ogni scomparto corrisponde 1 etichetta e viceversa – Dentro ogni scomparto c’è un solo oggetto – Sia gli oggetti sia le etichette possono essere di tipo qualunque – Si richiama dell’etichetta il contenuto di uno scomparto ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } servendosi Array e Vector Il package java.util – Hashtable esempio Le etichette sono solitamente stringhe … Cappotto Cappotto capp capp == new new Cappotto Cappotto (…); (…); Piumone p = new Piumone (…); Piumone p = new Piumone (…); Libro Libro ll == new new Libro Libro (…); (…); …… …… …… …… …… Hashtable Hashtable armadio armadio == new new Hashtable(); Hashtable(); armadio.put(“ cappotto” , armadio.put(“ cappotto” , capp); capp); armadio.put(“ coperta” , p); armadio.put(“ coperta” , p); armadio.put(“ armadio.put(“ libro1” libro1” ,, l); l); armadio.remove(“ libro1”); armadio.remove(“ libro1”); ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Il package java.util – Hashtable Se si tenta di mettere un altro oggetto con la stessa etichetta, cosa succede? Si ha sostituzione In ogni scomparto può esistere solo 1 oggetto, quindi “mettiamo dentro il nuovo e ci ritroviamo in mano il vecchio”!! Il metodo put non è più void ma restituisce un Object, il vecchio oggetto, mentre nell’Hashtable si inserisce il nuovo ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Il package java.util – Hashtable esempio Giacca Giacca gg == new new Giacca(…); Giacca(…); Object ob = armadio.put(“cappotto”,g); Object ob = armadio.put(“cappotto”,g); Boolean Boolean bb == (ob (ob istanceOf istanceOf Capotto); Capotto); Restituisce true Il metodo keys() restituisce una Enumaration con tutte le keys È bene che le keys siano tutte dello stesso tipo (ad esempio String) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Array e Vector Il package java.util – Hashtable Esempio con la Hashtable: ExPersona3.java Crea una Hashtable di oggetti di tipo Persona, utilizzando un’opportuna stringa identificativa come chiave di ricerca ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Conclusioni Abbiamo visto: • Come si costruiscono gli arrays e come vi si accede; • Come si utilizzano le classi del pakage java.util ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Costruttori e operatori Richiami e suggerimenti • È bene che i Vector siano composti da oggetti dello stesso tipo • Nelle Hashtable è bene che le etichette siano tutte stringhe o oggetti dello stesso tipo • Per recuperare un oggetto da un Vector o una Hashtable bisogna farne il cast al tipo corretto ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Grazie per l’attenzione – Domande? ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione alla programmazione con linguaggio Java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Note di Copyright Queste trasparenze (slide) sono coperte dalle leggi sul copyright. Testi grafica e immagini in essa contenuti sono di proprietà dei rispettivi autori: Dr. Maurizio Carta, Ing. Ing. Mauro Ennas, Ing. Ing. Stefano Piras e Ing. Ing. Fabrizio Saba. Saba. Tali slide possono essere duplicate e riprodotte dalle scuole di ogni ordine e grado italiane o estere per applicazioni legate alla didattica e senza finalità di lucro. Ogni altra finalità o uso (ivi compresa la duplicazione su supporto magnetico, la trasmissione, la memorizzazione e la stampa totale o parziale) è vietata senza autorizzazione scritta da parte degli autori. Gli autori non si assumono nessuna responsabilità sulle informazioni contenute in queste slide che sono state realizzate per finalità meramente didattiche e sono aggiornate alla data riportata in calce. L’intestazione a piè pagina deve comunque non essere alterata e deve sempre essere riportata anche in un utilizzo parziale del suddetto materiale. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Indice del corso • • • • • • • Modulo Modulo Modulo Modulo Modulo Modulo Modulo 1: 2: 3: 4: 5: 6: 7: Introduzione Sintassi Java Oggetti e Classi Features Eccezioni GUI Extra ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Modulo 3 Classi e oggetti ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } In questo modulo • Classi e oggetti – – – – • Classi “master” e “slave” Uso di classi “slave” Classe: definizione e scopo Creazione di oggetti (in dettaglio) Incapsulazione, polimorfismo ed ereditarietà – Ereditarietà – this e super • Attributi e metodi – Overriding dei metodi – Casting – Ereditarietà e costruttori • Variabili e riferimenti e costruttori – – – – • • Passaggio per valore e per “reference” “Method overloading” Costruttori (e distruttori...) Packages Overload ed Override Package ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e oggetti Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Le Classi • Le classi sono i mattoncini della programmazione Java • In pratica, un insieme di righe di codice dentro un file • Tutte le applicazioni costruite finora sono classi ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Le Classi • Ogni classe può usarne altre: “usare” una classe, come vedremo, significa utilizzare variabili il cui tipo è quella classe • Abbiamo visto le variabili di tipo String: ebbene, String è una classe della API del JDK Ricordate esercizio: ExStringhe1.java Ricordate esercizio: ExStringhe1.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Classi “master” e “slave” • L’esercizio ExStringh1.java è un esempio di programma (application, che può essere eseguita) che utilizza una classe, String, la quale da sola non costituisce un programma eseguibile • Abbiamo dunque un programma principale (classe MASTER) che utilizza una classe “non autonoma” (classe SLAVE) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Classi “master” e “slave” Le classi SLAVE non possono essere eseguite Possono essere solo compilate e utilizzate da altre calssi. Nella lezione 1 abbiamo visto gli scheletri dei programmi eseguibili in Java (application, applet e servlet) e i metodi da cui sono contraddistinti Una classe SLAVE non ha alcuno di questi metodi Al contrario, ogni classe con un metodo main(String[] args), per esempio, può essere utilizzata come application ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Classi “master” e “slave” .application - master slave n°1 Public class … { … main (…) { USA } } class String { … } slave n°3 class Rectangle { USA } class Segmento { … } slave n°2 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Classi “master” e “slave” Nota Classi SLAVE molto utili sono le API Java del JDK Solitamente un programma utilizza molte di queste classi già pronte ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Uso di classi “Slave” • Cosa vuol dire utilizzare una classe? Vuol dire definire una variabile il cui tipo è quella classe. Esempio: La calasse Calendar del JDK serve per costruire calendari. Definiamio una variabile di tipo Calendar: Calendar myCal; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Uso di classi “Slave” • Oltre a definire una variabile, bisogna anche riservarle in memoria uno spazio adatto In seguito svilupperemo meglio questo argomento. Per ora, basti sapere che, per usare una classe, dopo aver definito la variabile bisogna scrivere: myCal = new Calendar(); Si può anche fare tutto assieme: Calendar myCal = new Calendar(); ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Uso di classi “Slave” • Perché si utilizzano le classi? Le classi si utilizzano per sfruttarne le funzionalità Esempio: Calendar ha una funzionalità (metodo) che restituisce il primo giorno della settimana (domenica in USA, lunedì da noi). Questa funzionalità si chiama getFirstDayOfWeek() ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Uso di classi “Slave” Abbiamo definito la variabile myCal, e invochiamo su di essa il metodo citato. La documentazione sulle API(*) ci dice che il metodo dà come risultato un intero (int), per cui dobbiamo scrivere: int day = myCal.getFirstDayOfWeek(); La variabile intera day contiene il primo giorno della settimana (0=domenica, 1=lunedì, ecc.) Possiamo poi stamparla per visualizzarla (*) (*) Segue Segue subito subito la la spiegazione spiegazione della della documentazione documentazione Java Java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Uso di classi “Slave” Abbiamo invocato il metodo usando un “.” tra il nome della variabile e il nome del metodo. Si agisce sempre così per invocare un metodo. Anche per accedere alle properties di una classe si usa il “.” Esempio: Calendar ha una property: int APRIL, corrispondente al numero del mese di Aprile (4). Per Accedervi: int nAprile = myCal.APRIL; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Uso di classi “Slave”: La JDK Doc La Java Documentation della API del JDK è organizzata su 3 “frame”: • Quello in alto a sinistra contiene l’elenco dei packages (raggruppamenti logici di classi) • Quello in basso a sinistra contiene l’elenco di tutte le classi; • Quello a destra contiene i dettagli di ogni classe selezionata dall’elenco ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Uso di classi “Slave”: La JDK Doc I dettagli di ogni classe sono così organizzati: • Elenco delle properties (“Field summaty”) • Elenco dei costruttori – metodi speciali, che vedremo in seguito (“Constructor summary”) • Elenco dei metodi (“Mathod summary”) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Uso di classi “Slave”: La JDK Doc L’elenco dei metodi è così organizzato: • Un riquadro a destra indica il nome del metodo e le variabili di input (che tipi di variabili occorre fornire al metodo), e fornisce una breve descrizione della funzionalità del metodo • Un riquadro a sinistra indica il tipo della variabile nella quale va ospitato il risultato del metodo Esempio: ExUsoJDK.java Esempio: ExUsoJDK.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Classe: definizione e scopo Quanto segue si applica in particolare alle classi SLAVE Una classe è uno standard per definire in modo non ambiguo un ente qualsiasi Esempio: un’automobile, un cane, ecc. Una classe è un insieme di requisiti che un oggetto deve soddisfare perché si possa dire che appartiene a quella classe ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Classe: definizione e scopo Supponimao di dover definire in modo univoco una bicicletta. Diremo che: – – – – – – Ha due o più ruote, Ha due o più pedali, un manubrio, un seggiolino, ecc. Può avere le marce, Se si pedali si muove, Se ha le marce si può cambiare il rapporto, … ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Classe: definizione e scopo Abbiamo descritto prima le caratteristiche della bicicletta e poi le funzionalità. Le caratteristiche di una classe Java si chiamano attributi o properties, e sono delle variabili Le funzionalità si chiamano metodi e costituiscono “ciò che una classe è in grado di fare”. Ossia le funzioni che può svolgere ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Classe: definizione e scopo La classe bicicletta si presenta così: class Bicicletta { int numRuote; int numPedali; Boolean haLeMarce; … pedala (…) { … } … cambiaMarcia (…) { … } } Attributi - Properties Funzionalità - metodi ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Classe: definizione e scopo • La classe Bicicletta è una classe SLAVE, quindi può essere utilizzata da altre classi • Un’application può utilizzare la classe bicicletta creando oggetti della classe bicicletta, cioè definendo variabili di tipo bicicletta. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Classe: definizione e scopo Un altro esempio: classe Rettangolo Come si può definire una tale classe? Quali sono le caratteristiche di un rettangolo? Es: double altezza, double base, … Quali sono le funzionalità attribuibili ad una eventuale classe Rettangolo? Es: calcolaArea(…), calcolaPerimetro(…) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Classe: definizione e scopo Esercizio Alla luce di quanto abbiamo visto della JDK Doc, elencare plausibili Properties e metodi per una classe Rettangolo, e per questi ultimi specificare tipo e significato delle variabili di input e della variabile di output, cioè del risultato del metodo. Si Si veda veda una una soluzione soluzione in: in: Rettangolo.java (slave) Rettangolo.java (slave) ExUsoRettangolo.java ExUsoRettangolo.java (application) (application) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Oggetto • Oggetto di una classe è una variabile il cui tipo è quella classe. • Un oggetto è una rappresentazione concreta di una classe, detta istanza della classe Esempio: Una bicicletta reale è un oggetto, o istanza, della classe Bicicletta, poiché soddisfa i requisiti necessari per appartenere alla classe Bicicletta ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Oggetto e classe Tra una classe e un oggetto c’è la stessa differenza che esiste fra l’idea astratta di una cosa e una rappresentazione concreta di quella cosa: ad esempio, tra l’idea astratta di un cane e un cane reale ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Creazione di oggetti Per creare un oggetto di tipo Bicicletta è necessaria la sintassi: Bicicletta bici = new Bicicletta (); Si tratta di una combinazione di più istruzioni: Bicicletta bici; bici = new Bicicletta(); ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Creazione di oggetti Per creare un oggetto di tipo Rettangolo è necessaria la sintassi: Rettangolo r = new Rettangolo(); Si tratta di una combinazione di più istruzioni: Rettangolo r; r = new Rettangolo(); ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Creazione di oggetti Differenza tra una dichiarazione di una variabile e di un oggetto: int m; Alloca in memoria spazio per un intero Bicicletta bici; Alloca spazio per un indirizzo di memoria (riferimento; per questo la variabile viene detta di tipo “reference”) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Creazione di oggetti bici = new Bicicletta(); Alloca in memoria spazio per un oggetto di tipo Bicicletta, con spazio destinato alle variabili (inizializzate a valori di default) e agli indirizzi dei metodi. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Creazione di oggetti Differenze fra primitive e reference: char c = “w”; char z = c; c w z w Mario String s = “mario”; String t = s; s 0x0asdfgh t 0x0asdfgh ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Creazione di oggetti Tipo Valore di inizializzazione delle variabili byte 0 short 0 int 0 long 0L float 0.0F double 0.0D char boolean tutti i reference ‘\u0000’ (null) False null ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi e Oggetti Conclusioni • Esistono classi master e classi slave • Una classe ha caratteristiche - properties e funzionalità metodi • Per utilizzare una classe bisogna dichiarare variabili col nome della classe e riservare loro lo spazio in memoria • Esistono classi “master”, eseguibili da sole, e classi “slave”, che possono solo essere utilizzate da altre • Quando si crea un oggetto di una classe, la variabile corrispondente contiene l’indirizzo di memoria dell’oggetto • Per invocare i metodi o accedere alle variabili di una classe si usa il “.” ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Ereditarietà In Java esiste la gerarchia di classi: una classe può essere dichiarata sottoclasse di un'altra, ereditando dalla superclasse variabili e metodi. Class Tandem = “figlia” di Bicicletta, ha le stesse proprietà e in più il metodo “pedalaInGruppo” class Bicicletta { class Bicicletta { int numRuote; int numRuote; int marcia; int marcia; void pedala () {…} void pedala () {…} } } class MyClass { class MyClass { Tandem t = new Tandem (); Tandem t = new Tandem (); t.pedala(); t.pedala(); } } class Tandem extend Bicicletta { class Tandem extend Bicicletta { void pedalaInGruppo (int n){…} void pedalaInGruppo (int n){…} } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Ereditarietà Class Quadrato = “figlia” di Rettangolo, ha le stesse proprietà e in più il metodo “diagonale” class Rettangolo { class Rettangolo { double base; double base; double altezza; double altezza; double area () {…} double area () {…} } } class MyClass { class MyClass { Quadrato q = new Quadrato(); Quadrato q = new Quadrato(); q.area(); q.area(); } } class Quadrato extend Rettangolo { class Quadrato extend Rettangolo { double diagonale (){…} double diagonale (){…} } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Ereditarietà Esempi I seguenti esempi illustrano la costruzione e l’uso delle sottoclassi: – ExEredit1.java – Rettangolo7.java – Quadrato.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Ereditarietà Esempi Ogni sottoclasse ESTENDE la classe madre, cioè ha più proprietà Classe figlia Classe madre ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Ereditarietà La classe madre è più generica, la classe figlia è più specifica e contiene la madre Parola chiave: extends Classe figlia Classe madre ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Ereditarietà Ogni sottoclasse è figlia inheritance di Java) di una sola madre Nonna Madre 1 Figlia 1 Figlia 2 Madre 2 Figlia 1 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Madre n (single Ereditarietà Ereditarietà: visibilità di variabili e metodi “Cosa” viene ereditato… Visibilità Viene ereditata? public Si, sempre private No (nessuna) Solo se la figlia è nello stesso package protected Si, sempre ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Incapsulazione Modificatore Stessa classe Stesso package Sottoclasse Universo public SI SI SI SI protected SI SI SI (default) SI SI private SI Una variabile, un metodo o una classe hanno accessibilità di default se non hanno un modificatore di protezione esplicito come quelli indicati ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà “this” e “super” Abbiamo visto che le variabili locali prevalgono sulle variabili d’istanza con lo stesso nome: class Bicicletta { Variabile d’istanza … int marcia; void cambiaMarcia (int marcia) { marcia = 2; } } Sono la stessa variabile locale si riferiscono al parametro e non alla variabile d’istanza, che non muta il valore ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà “this” e “super” Altro esempio: class Rettangolo { double base; double altezza; double area (double base, double altezza) { base = … ; } } Sono la stessa cosa; si riferiscono al parametro e non alla property ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà “this” e “super” correttamente: “this” indica sempre la classe entro la quale si trova class Bicicletta { … int marcia; void cambiaMarcia (int marcia) { this.marcia = marcia; } } Sono la stessa cosa Sono la stessa cosa ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà “this” e “super” correttamente: Sono la stessa cosa class Rettangolo { double base; double altezza; double area (double base, double altezza) { this.base = base ; } } Sono la stessa cosa ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } “this” indica sempre la classe entro la quale si trova Ereditarietà “this” e “super” Con l’ereditarietà: class Bicicletta { class Bicicletta { … … int numRuote; int numRuote; void pedala () {…} void pedala () {…} } } class Tandem extend Bicicletta { class Tandem extend Bicicletta { int numRuote; int numRuote; void pedalaInGruppo (int n){…} void pedalaInGruppo (int n){…} … … int k=numRuote; int k=numRuote; } } Si riferisce alla variabile di Tandem (this.numRuote) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà “this” e “super” Con l’ereditarietà: class Rettangolo { class Rettangolo { double base; double base; double area () {…} double area () {…} } } class Quadrato extend Rettangolo { class Quadrato extend Rettangolo { double base; double base; double diagonale (){ double diagonale (){ … … b = base; b = base; } } } } Si riferisce alla variabile di Quadrato (this.base) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà “this” e “super” Se ci si vuole riferire alla variabile omonima della classe madre, si deve usare il prefisso “super”: Int j = super.numRuote; (es. 1) Double b = super.base; (es. 2) N.B. Le omonimie capitano perché servono spesso… ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà “this” e “super” Es.: variabili omonime possono essere di tipo diverso Class IntegerCalc { int sum; … } Class DecimalCalc extends IntegerCalc { double sum; … } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà “this” e “super” Esempi che illustrano l’uso di “this” e “super” in relazione alle properties, con i problemi connessi ExEredit2.java Rettangolo7.java Quadrato2.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Overload & Override • Overload – Sovraccaricare (overloading) un metodo, significa fornire più di un metodo con lo stesso nome, ma con differenti segnature per distinguerlo • Override – Ridefinire (overriding) un metodo dignifica sostituire l’implementazione di un metodo della superclasse con una nuova implementazione nella classe considerata. – Le segnature devono essere identiche – Non è permessa la ridefinizione dei metodi statici ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Override dei metodi Una sottoclasse può fare l’overload di metodi delle superclassi, ma può anche definire un metodo uguale a quello di una superclasse (override) Il metodo della sottoclasse “scavalca” allora completamente quello della superclasse e quest’ultimo non può essere invocato dalla sottoclasse. L’overriding dei metodi è “irreversibile” … ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Overload & Override class Bicicletta { class Bicicletta { … … int numRuote; int numRuote; void pedala () {…} void pedala () {…} void cambiaMarcia (int n) {…} void cambiaMarcia (int n) {…} } } class MyClass { class MyClass { … … Tandem T = new Tandem (); Tandem T = new Tandem (); T.cambiaMarcia(2); T.cambiaMarcia(2); } } class Tandem extend Bicicletta { class Tandem extend Bicicletta { … … void cambiaMarcia (int m){…} void cambiaMarcia (int m){…} … … } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Override dei metodi class Rettangolo { class Rettangolo { … … int numRuote; int numRuote; double area () {…} double area () {…} } } class MyClass { class MyClass { … … Quadrato Q = new Quadrato (); Quadrato Q = new Quadrato (); double a = q.area(); double a = q.area(); } } class Quadrato extend Rettangolo { class Quadrato extend Rettangolo { … … double area () {…} double area () {…} } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Override dei metodi Esempi che illustrano l’uso dell’overrideing dei metodi ExEredit3.java Rettangolo7.java Quadrato3.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Override dei metodi • I metodi statici possono essere “overridden”, ma solo da altri metodi statici • Un metodo dichiarato final non può essere “overridden” • Una classe dichiarata final non può avere sottoclassi ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Casting • È l’operazione con la quale si ospita il valore di una variabile in un’altra di tipo diverso. Esempi: int k=2 Float f = (float) k; Il valore 2 viene ospitato in una casella di memoria più ampia Viceversa: float a=5.885; Int i = (int) a; Il valore “a” viene troncato e diventa “5” ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Casting fra subclassi e superclassi Bicicletta bici = …; Tandem tandem = …; Attenzione! /* up-casting di tandem */ Il down-casting non sempre si può fare (solo previo upcasting o assegnazione di indirizzo), tipo: bici = (Bicicletta) tandem; /* down-casting di bici */ tandem = (Tandem) bici; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } bici = tandem Ereditarietà Casting - instanceof Per sapere di che classe è istanza un dato oggetto: (bici instanceof Bicicletta) restituisce un boolean … ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Casting & variabili “shadowed” Con l’upcasting si passa alle variabili delle superclassi ((Bicicletta) tandem).numruote Class Bicicletta int numRuote ((Tandem)bici).numRuote Tandem.numRuote Class Tandem int numRuote ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Casting & variabili “shadowed” L’overriding è irreversibile nel senso che anche l’upcasting si rimane con i metodi della sottoclasse ((Bicicletta) tandem).pedala Class Bicicletta void pedala(); ((Tandem)bici).pedala Tandem.pedala Class Tandem void pedala(); ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } con Ereditarietà Casting Esempi che illustrano l’uso del casting, e le conseguenze su properties e metodi ExEredit4.java Rettangolo8.java Quadrato4.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Ereditarietà & costruttori Un costruttore può riferirsi ad un altro in una superclasse con la parola super. Lo deve però fare come prima cosa: class Persona { Persona (String nome) { //operazioni col nome … } } class Dottore extends Persona { Dottore (String nome, String specializzazione) { //operazioni con la specializzazione … } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Ereditarietà & costruttori Se nell'esempio precedente non chiamiamo super(nome) avremo errore di compilazione. Perché? Se la prima istruzione del costruttore della sottoclasse non è una chiamata a this(...) o super(...), viene inserita automaticamente una chiamata a super() … Dopo la chiamata, vengono inizializzate le properties della sottoclasse ed eseguito il resto del costruttore. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Ereditarietà & costruttori Esempi che illustrano l’uso di “this” e “super” nei costruttori ExEredit5.java Rettangolo8.java Quadrato5.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Conclusioni Abbiamo visto: • Come le classi Java possono ereditare proprietà e metodi da altre classi • Come distinguere fra le proprietà di classi madri e classi figlie • Come sovrascrivere metodi delle classi madri • Come ospitare un oggetto di una classe in una classe madre, meno specifica ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Richiami e suggerimenti importante: • Imparare bene a costruire e a utilizzare le classi che ereditano da latre classi • Attenzione a proprieties e metodi omonimi • Il down-casting non è sempre possibile … ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Attributi e metodi Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Attributi e metodi Costruzione di un metodo Esempio: public double calcolaAreaRettangolo (double base, double altezza) { double area = base * altezza; return area; } Se un metodo ha un dato tipo di ritorno, la variabile che segue return (che è quella restituita) deve essere di quel tipo. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Attributi e metodi Costruzione di un metodo Se un metodo non ha tipo di ritorno, la parola chiave che si usa è void. In tal caso, non c’è istruzione return. Esempio: public void stampaArea (double base, double altezza) { double area = base * altezza; System.out.println(“area=“+area); } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Attributi e metodi Uso di un metodo Usando un metodo che restituisce un tipo, il risultato del metodo deve essere ospitato in una variabile di quel tipo. Esempio: Supponiamo che il metodo calcolaArea sia in una classe Rettangolo. Se lo si vuole usare, si istanzia un oggetto di quella classe e si invoca il metodo su di esso: Rettangolo r = new Rettangolo (); double a = r.calcolaArea(2.5, 3.4); a deve essere double perché il metodo restituisce un double ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Attributi e metodi Metodi statici I metodi dichiarati static appartengono ad una classe e non ad un oggetto. Ciò significa che per invocarli non c’è bisogno di istanziare oggetti, ma si usa la sintassi: Classe.metodo(……) Cioè si usa direttamente il nome della classe (si veda la classe Math del JDK…) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Conclusioni Abbiamo visto: • come si costruiscono oggetti con diverse d'istanza • come si accede alle variabili di una classe • come si costruiscono i metodi ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } variabili Ereditarietà Richiami e suggerimenti importante: • imparare bene a scrivere metodi: attenzione alle variabili di input e output • ricordare la differenza fra variabili statiche e non, fra metodi statici e non ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Passaggio per valore e per “reference” Quando si passano argomenti di input ad un metodo • I tipi primitivi sono passati per valore • Gli oggetti sono passati per “reference” ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Passaggio per valore e per “reference” Supponiamo di dover utilizzare il metodo: class SomeClass { … void Compra (int n, Bicicletta b) { … } } – Il valore dell’int n viene copiato – Dell’oggetto b viene copiato l’indirizzo (reference) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Passaggio per valore e per “reference” Estrapoliamo il metodo dal blocco di codice: … … … … … … … … Bicicletta Bicicletta bici bici == new new Bicicletta Bicicletta (); (); int int kk == 10; 10; …… …… …… …… Compra Compra (k, (k, bici); bici); 0x01asdfg Dopo la new, bici contiene il riferimento all’oggetto Area di memoria del metodo Copia del valore di k (valore: 10) Copia del valore di bici (valore: 0x01asdfg) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Passaggio per valore e per “reference” Conseguenze: • Se dentro il metodo viene cambiato k, appena si esce, k è inalterato • Se dentro il metodo si modifica qualcosa in bici, le modifiche permangono anche quando si esce dal metodo ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Passaggio per valore e per “reference” Esempi che mostrano come nel passaggio ad un metodo, le primitive vengono copiate per valore e gli oggetti per indirizzo (reference) ExUsoRettangolo4.java Rettangolo4.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Passaggio per valore e per “reference” Ricapitolando: L’invocazione di un metodo apre un’area di memoria in cui vengono copiati: – I valori dei primitivi (non c’è accesso a quei primitivi, ma solo a delle copie) – Gli indirizzi degli oggetti (dato l’indirizzo di un oggetto, si può accedere alla sua area di memoria e modificarlo) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori “Method overloading” Letteralmente, “sovraccarico di un metodo” Rappresenta la possibilità di definire più metodi con lo stesso nome ma con diversi tipi/numeri di argomenti in input ed, eventualmente, diversi tipi di ritorno L’idea è di creare metodi dello stesso genere logico che agiscano su diversi argomenti ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori “Method overloading” Esempi: la somma int somma (int a, int b) { … } float somma (float a, float b) { … } Complex somma (Complex a, Complex b) { … } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori “Method overloading” I metodi possono avere anche numeri diversi di argomenti, e diversi tipi di ritorno: type1 someMethod (int a, int b) type1 someMethod (int a, int b, int c) type1 someMethod (int a, int b, float c) type2 someMethod (int a, int b, String c) ma non type2 someMethod (int a, int b) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori “Method overloading” I seguenti esempi mostrano il funzionamento dell’overloading di metodi ExUsoRettangolo5.java Rettangolo5.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Costruttori La parola chiave “new” istanzia un oggetto, ossia riserva un’area di memoria per esso. L’allocazione di memoria avviene tramite la parola chiave new seguita però da un oggetto “costruttore”: Bicicletta bici = new Bicicletta (); Un costruttore è un metodo speciale che ha lo stesso nome della classe. I costruttori possono accettare argomenti ed essere overloaded (un es è la classe String…) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Costruttori Quando in una classe non ci sono costruttori, Java inserisce automaticamente un costruttore senza argomenti. class Bicicletta { int numRuote; boolean haLeMarce; void pedala() { … } } Non è presente un costruttore esplicito class MyClass { Bicicletta b = new Bicicletta (); } Java inserisce in modo automatico il costruttore della classe Bicicletta ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Costruttori Esempio: class Rettangolo { double base; double altezza; double area() { … } } Non è presente un costruttore esplicito class MyClass { Rettangolo r = new Rettangolo (); } Java inserisce in modo automatico il costruttore della classe Bicicletta ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Costruttori Se in una classe ci sono costruttori con argomenti, non viene inserito automaticamente da java nessun costruttore. class Bicicletta { int numRuote; boolean haLeMarce; Bicicletta(int nr) { … } void pedala() { … } } è presente un costruttore esplicito con argomenti class MyClass { Bicicletta b = new Bicicletta (); } Errore di compilazione. Il compilatore non trova il costruttore senza argomenti ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Costruttori Esempio: Rettangolo class Rettangolo { double base; double altezza; public Rettangolo (double a, double b) { … } double area() { … } } è presente un costruttore con argomenti class MyClass { Rettangolo r = new Rettangolo (); } Errore di compilazione. Il compilatore non trova il costruttore senza argomenti ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Costruttori Questo è il modo corretto di scrivere il codice: class Bicicletta { int numRuote; boolean haLeMarce; Bicicletta() { … } Bicicletta(int nr) { … } void pedala() { … } } è presente il costruttore esplicito senza argomenti class MyClass { Bicicletta b = new Bicicletta (); } Il compilatore trova il costruttore senza argomenti e prosegue in modo corretto ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Costruttori Questo è il modo corretto di scrivere il codice: class Rettangolo { double base; double altezza; public Rettangolo (); public Rettangolo (double a, double b) { … } double area() { … } } è presente il costruttore esplicito senza argomenti class MyClass { Rettangolo r = new Rettangolo (); } Il compilatore trova il costruttore senza argomenti e prosegue in modo corretto ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Costruttori Esempi che mostrano come scrivere diversi costruttori, ricapitolando anche il “method overloading” ExUsoRettangolo6.java Rettangolo6.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Distruttori (garbage collection) È una tecnica di Java per rimuovere oggetti non più utilizzati Il garbage collector, periodicamente, in un thread a bassa priorità, esamina tutti gli oggetti e conta i riferimenti a questi: quando un oggetto non ha più riferimenti, non è più accessibile e il garbage collector lo rimuove, liberando memoria ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Distruttori (garbage collection) Il garbage collector è organizzato in 2 stadi: – Esplorazione di tutti gli oggetti e “marchiatura” di quelli ancora “vivi” – Seconda esplorazione e rimozione degli oggetti non marcati Questo processo viene eseguito in “background” in modo trasparente per l’utente. Può però essere richiamato in modo esplicito invocando il metodo: System.gc(); ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Package Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Package I Package sono gruppi di classi Java (directory con file di tipo *.class) Convenzione: i pezzi del nome di un package sono minuscoli e separati da punti Il nome completo di una classe è il nome del package seguito dal nome della classe. Ad esempio: java.util.Vector java.io.Writer java.awt.event.MouseEvent ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Package I nomi sono piatti, non gerarchici Ad esempio: java.awt.event non è un sottopackage di java.awt ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Package Se in una classe si deve usarne un’altra di un package si può: – Indicare il nome completo, oppure – Importare il package Ad esempio, indicando il nome completo: class myClass { java.util.Vector v = new java.util.Vector(); … … } //abbastanza lungo ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Package Oppure, importando il package: Import java.util.Vector class myClass { Vector v = new Vector(); … … } // molto meglio il codice è pure più leggibile Import java.util.* class myClass { Vector v = new Vector(); … … Di fatto, sono importate solo le classi che vengono usate } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Package I package sono come le librerie: danno organizzazione logica ad un codice. C’è dualità fra package e directories Prima che una classe sia presa da un server, il client trasla il nome del package in un nome di path relativo rispetto all’URL base del documento. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Package Se nel file HTML: http://www.time.ch/docs/clock.html è chiamata la classe: time.clock.MyClock il client cercherà il file MyClock.class all’URL: http://www.time.ch/docs/time/clock/ ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Package I package aggiungono un livello di scope a classi, variabili e metodi. Per includere un classe in un package: package mypackage import java.somepackage.*; class myClass { … } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Package. Visibilità delle classi Classi entro uno stesso package si possono riferire l’una all’altra semplicemente con il nome class myClass { … } Se non c’è nessuna parola chiave la classe è visibile solo dentro il package. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Package. Osservazioni • Se in una classe si importano dei package contenenti classi con lo stesso nome, bisogna usare il nome completo della classe • Se in una classe non viene dichiarato alcun package, essa viene messa nell’unnamed package, il cui path è considerato essere la directory corrente ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili, riferimenti e costruttori Conclusioni Abbiamo visto: • Il passaggio per valore e per reference ad un metodo • Il “method overloading” • L’istanziazione di un oggetto con i costruttori • I packages ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Grazie per l’attenzione – Domande? ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione alla programmazione con linguaggio Java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Note di Copyright Queste trasparenze (slide) sono coperte dalle leggi sul copyright. Testi grafica e immagini in essa contenuti sono di proprietà dei rispettivi autori: Dr. Maurizio Carta, Ing. Ing. Mauro Ennas, Ing. Ing. Stefano Piras e Ing. Ing. Fabrizio Saba. Saba. Tali slide possono essere duplicate e riprodotte dalle scuole di ogni ordine e grado italiane o estere per applicazioni legate alla didattica e senza finalità di lucro. Ogni altra finalità o uso (ivi compresa la duplicazione su supporto magnetico, la trasmissione, la memorizzazione e la stampa totale o parziale) è vietata senza autorizzazione scritta da parte degli autori. Gli autori non si assumono nessuna responsabilità sulle informazioni contenute in queste slide che sono state realizzate per finalità meramente didattiche e sono aggiornate alla data riportata in calce. L’intestazione a piè pagina deve comunque non essere alterata e deve sempre essere riportata anche in un utilizzo parziale del suddetto materiale. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Indice del corso • • • • • • • Modulo Modulo Modulo Modulo Modulo Modulo Modulo 1: Introduzione 2: Sintassi Java 3: Oggetti e Classi 4: Features 5: Eccezioni 6: GUI 7: Extra ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Modulo 4 Features ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } In questo modulo • • • • • Static e final Public, private protect Classi astratte Interfacce Wrapper ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili d’istanza Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili d’istanza Variabili d’istanza Ogni oggetto ha la sua copia delle variabili d’istanza. Ciò significa che ogni istanza di una classe avrà in memoria un suo spazio riservato per le sue variabili class ExUsoRettangolo Rettangolo r1 = new Rettangolo(); Rettangolo r2 = new Rettangolo(); r1 class ExUsoRettangolo double double double double base; altezza; area(); perimetro () ; golo() Rettan w e n 1 = golo r Rettan Rettang olo r2 = new R ettango lo(); Base = 4.1; Altezza = 3.0; r2 Base = 5.5; Altezza = 1.7; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili d’istanza Una volta definita una classe Rettangolo, si possono creare oggetti di tipo Rettangolo e accedere alle loro variabili e ai loro metodi: r1.base = 4.1; r1.altezza = 3.0; System.out.println(r1.area()); r2.base = 5.5; r2.base = 1.7; Fissa i valori Fissa i valori Si Si veda: veda: ExUsoRettangolo.java ExUsoRettangolo.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili statiche Variabili dichiarate con la parola static sono condivise da tutte le istanze di una classe esistenti nello stesso programma. Se si cambia il valore di una variabile statica in un'istanza, essa viene modificata in tutte le altre istanze. Questo è un po' pericoloso... ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili static e final Spesso le veriabili static sono dichiarate anche final, cioè “non modificabili” Convenzione: le variabili “final” sono scritte tutte maiuscole. Sono quasi sempre pubbliche: Static double gravity = 9.8; Static final double PI_GRECO = 3.1415925; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili static e final Si Si veda: veda: Rettangolo2.java Rettangolo2.java ExUsoRettangolo2.java ExUsoRettangolo2.java class Rettangolo double base; double altezza; Static double sqrt2 = 1.414; class Geometria Rettangolo rett1; Rettangolo rett2; rett1 double base = 4.1; double altezzaa = 3.0; Static double sqrt2 = 1.414; rett2 double base = 5.5; double altezzaa = 1.7; Static double sqrt2 = 1.414; ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Accesso alle variabili Una classe può limitare l’accesso alle sue variabili con alcune parole chiave: – – – – Public – accessibile a chiunque all’esterno Private – inaccessibile a chiunque all’esterno Protect – (vedremo in seguito il significato) Nessuna parola chiave – (vedremo in seguito il significato) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Accesso alle variabili tramite metodi • Spesso le variabili d'istanza sono private, e si accede ad esse mediante due tipi di metodi, noti come “set” e “get” • I metodi “set” servono per fissare il valore di una variabile d'istanza in un oggetto qualsiasi, i metodi “get” servono per ispezionarne il valore ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Accesso alle variabili tramite metodi Per ogni variabile d’istanza come, per esempio: private int pippo; Si scrivono, nella classe, i metodi: void setPippo (int newPippo) { pippo = newPippo; } int getPippo () { return pippo; } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Accesso alle variabili tramite metodi Per esempio, per la classe Rettangolo: private int base; Si scrivono, nella classe, i metodi: void setBase (double b) { base = b; } Double getBase () { return base; } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Si Si veda: veda: Rettangolo3.java Rettangolo3.java ExUsoRettangolo3.java ExUsoRettangolo3.java Variabili locali Ogni variabile ha il suo “scope”, cioè il blocco di codice entro il quale essa è accessibile e che determina quando la variabile è creata o distrutta ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili locali La posizione della dichiarazione della variabile dentro il codice ne stabilisce lo scope e la pone in una delle quattro categorie: – – – – Variabile d’istanza Variabile locale Parametro di un metodo Parametro di una “exception-handler” ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Variabili locali class MyClass Memeber Variabile Scope { … dichiarazione variabile di membro … public void aMethod (method parameters) Method Variabile Scope { … dichiarazione variabile locale … Catch (exception handler parametres) Local Variabile Scope { … } … Exception-hander Parameter Scope } … } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } “shadowing” di variabili Se una variabile d'istanza e una variabile locale (interna ad un metodo o parametro di un metodo) hanno lo stesso nome, la variabile locale nasconde o “ombreggia” il nome della variabile d'istanza. class Rettangolo { double base; double altezza; … … Void setAltezza(double aa) { double altezza = aa; } Viene assegnato il valore “aa” ad una variabile locale! } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } “shadowing” di variabili class Rettangolo { double base; double altezza; … … Void setAltezza(double altezza) { altezza = 2; } Viene assegnato il valore “altezza” al paramtro del metodo! } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Metodi astratti Si può dichiarare un metodo abstract e darne solo la “signature”, senza il corpo. Ad esempio: public abstract void aMethod (String s); In questo modo si indica il prototipo del metodo, ma non lo si realizza ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi astratte Ogni classe che contenga uno o più metodi astratti deve essere dichiarata abstract anch’essa Ad esempio: public abstract class aClass { … abstract void aMethod (String s); } Una classe astratta NON può essere istanziata! ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi astratte Una classe astratta può contenere metodi non astratti; tuttavia non può essere istanziata Per usarla, bisogna creare sottoclassi che implementino i metodi astratti, cioè diano ad essi un corpo Finchè, col “subclassing”, non sono stati implementati tutti i metodi astratti, anche le sottoclassi sono astratte e non possono essere istanziate ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Classi astratte Le classi astratte sono utilissime! Forniscono una struttura alle classi che riempiranno i metodi. Es.: la classe java.io.InputStream ha un metodo astratto: public abstract int read(); Le sue sottoclassi implementano read() a modo loro, leggendo in modo diverso dalle sorgenti. Il resto della classe ImputStream, d’altra parte, fornisce funzionalità basate sul metodo read(). Ogni sottoclasse di ImputStream eredita queste funzionalità e implementa read(). ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Interfacce Sono classi contenenti SOLO metodi astratti: sono il caso estremo delle classi astratte Si costruiscono come segue: public interface MyInterface { abstract double method1 (String s); abstract void method2 (int k); } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Interfacce Le interfacce si utilizzano in modo diverso delle classi astratte: ogni classe che voglia implementare uno o più metodi di un’interfaccia deve dichiararlo nel modo seguente: class MyClass implements MyInterface { … } Se una classe non implementa tutti i metodi astratti di un’interfaccia, deve essere dichiarata abstract, e non può essere istanziata. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Interfacce • Le interfacce sono uno strumento potentissimo nella programmazione object oriented. Definiscono un minimo standard di comportamento cui una classe deve attenersi per eseguire certi compiuti. • Sono come classi: si possono dichiarare variabili il cui tipo sia un’interfaccia, e i metodi possono accettare in input e restituire variabili di questo tipo. Ciò è molto importante: significa che oggetti di qualunque classe implementi quella interfaccia vanno bene. • Massimizzano la riutilizzabilità dei codici … ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Interfacce Esempi che mostrano come le interfacce massimizzino la riutilizzabilità di un codice, localizzando in pochi punti le modifiche necessarie per la riutilizzazione. ExInterfaccia1.java, ObjReusable.java, IPersona.java e ILibro.java ExInterfaccia2.java, ObjFactory.java, ObjReusable.java e ILibro.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Wrapper class ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Ereditarietà Conclusioni Abbiamo visto: • Cosa sono le classi astratte e come possono essere utilizzate • Le interfacce, uno strumento programmazione object oriented ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } potente della Ereditarietà Richiami e suggerimenti Importante: • Comprendere bene la potenza delle interfacce per lo sviluppo di programmi object oriented ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Grazie per l’attenzione – Domande? ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione alla programmazione con linguaggio Java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Note di Copyright Queste trasparenze (slide) sono coperte dalle leggi sul copyright. Testi grafica e immagini in essa contenuti sono di proprietà dei rispettivi autori: Dr. Maurizio Carta, Ing. Ing. Mauro Ennas, Ing. Ing. Stefano Piras e Ing. Ing. Fabrizio Saba. Saba. Tali slide possono essere duplicate e riprodotte dalle scuole di ogni ordine e grado italiane o estere per applicazioni legate alla didattica e senza finalità di lucro. Ogni altra finalità o uso (ivi compresa la duplicazione su supporto magnetico, la trasmissione, la memorizzazione e la stampa totale o parziale) è vietata senza autorizzazione scritta da parte degli autori. Gli autori non si assumono nessuna responsabilità sulle informazioni contenute in queste slide che sono state realizzate per finalità meramente didattiche e sono aggiornate alla data riportata in calce. L’intestazione a piè pagina deve comunque non essere alterata e deve sempre essere riportata anche in un utilizzo parziale del suddetto materiale. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Indice del corso • • • • • • • Modulo Modulo Modulo Modulo Modulo Modulo Modulo 1: 2: 3: 4: 5: 6: 7: Introduzione Sintassi Java Oggetti e Classi Features Eccezioni GUI Extra ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Modulo 5 Eccezioni ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } In questo modulo • • • • Categorie d’eccezioni Try e catch Identificare le eccezioni Esercitazioni con esempi ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni Java è nato come linguaggio di programmazione per hardware specializzato, come i cellulari e semplici strumenti di uso anche quotidiano; nella visione dei “padri” di Java erano anche i phon e i tostapane In queste applicazioni è importante che gli errori siano gestiti appropriatamente. Poiché è impossibile che non si verifichino, bisogna riconoscerli e tutelarsi contro le conseguenze ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni Java gestisce gli errori a livello applicativo con delle vere e proprie “corsie d’emergenza”: quando qualcosa va male, il programma esce dal normale flusso e corre in una corsia d’emergenza, terminando in maniera dolce. Queste “corsie d’emergenza” eccezioni (Exceptions) sono ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } gestite dalle Eccezioni ed errori Eccezioni: catch & throw Ogni metodo nel quale si possano verificare errori irrimediabili – problemi di lettura o scrittura, invasioni di memoria, ecc. – deve gestire questi errori (“catturarli”, catch), Oppure Segnalarne la presenza e demandare ad altri la gestione (“rilanciarli”, throw) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: lancio di un’eccezione Ogni metodo dovrebbe contemplare la possibilità, in caso di errore, di lanciare un’eccezione, cioè di istanziare un oggetto della classe java.lang.Exception o delle sue sottoclassi … someMethod (…) throw Exception { // se qualcosa va male: Exception ex = new Exception (…); throw ex; } Il metodo deve dichiarare che sta lanciando un’eccezione Lancio dell’eccezione ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: esempio L’esercizio seguente illustra come un’eccezione all’interno di un metodo: Rettangolo9.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } si lancia Eccezioni ed errori Eccezioni: cattura di un’eccezione Ogni eccezione lanciata deve essere “catturata” in un punto scelto del codice per essere gestita; in pratica, per attivare la “corsia d’emergenza”: ciò si realizza con il “try & catch”: Supponiamo che un metodo “readFromFile” lanci una Exception, e vediamo come catturarla … ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: cattura di un’eccezione Se nasce un oggetto Exception, il codice salta dentro il catch: try { readFromFile (“a.txt”); } Catch (Exception e) { // gestione dell’eccezione } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: esempio L’esercizio seguente illustra come un’eccezione lanciata da un metodo ExException1.java Rettangolo9.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } si cattura Eccezioni ed errori Eccezioni: le classi Le eccezioni sono istanziate dalla classe: java.lang.Exception E dalle sue sottoclassi. Alcune di queste possono contenere dell’informazione specializzata, altre servono solo come sottoclassi con nomi più appropriati I vari packages definiscono i propri tipi di eccezioni; ad esempio, java.io ha FileNotFoundException, IOException, ecc … ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: esempi del package java.lang Object ClassNotFoundException InstantiationException Throwable Exception NoSuchMethodException ClassCastException IndexOutOfBoundsException RuntimeException ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } NullPointerException Eccezioni ed errori Eccezioni: gestione di più eccezioni Un metodo può catturare più eccezioni è gestirle separatamente. Se per esempio il metodo readFromFile lancia FileNotFoundException e IOException, queste si possono gestire in modi diversi. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: gestione di più eccezioni Primo modo: try { readFromFile (“a.txt”); } Catch (FileNotFoundException ex) { // gestione della situazione } Catch (IOException ex) { // gestisce quest’latra situazione } Catch (Exception ex) { // gestisce tutte le altre eccezioni } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Quest’ultimo copre tutti gli altri casi, essendo Exception superclasse di tutte le eccezioni Eccezioni ed errori Eccezioni: gestione di più eccezioni Se, alternativamente, si vuole solo deviare il flusso del programma senza preoccuparsi del tipo di eccezione, si cattura genericamente Exception try { readFromFile (“a.txt”); } Catch (Exception ex) { // gestisce tutti i casi qui } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: esempio L’esercizio seguente illustra la gestione separata di più eccezioni: ExInterfaccia9.java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: “bubbling up” • Se un metodo non vuole gestire eccezioni che nascono al suo interno, può “rilanciarle”. Abbiamo visto che un’eccezione si lancia “throw”, e il metodo che la lancia deve dichiarare che intende farlo. • Se un metodo non lancia di per se eccezioni, ma contiene altri metodi che ne lanciano, per rilanciarle deve dichiarare che intende farlo ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: “bubbling up” Void aMethod (…) throw FileNotFoundException, IOException { … readFromFile (“a.txt”); … } oppure Void aMethod (…) throw Exception { … readFromFile (“a.txt”); … } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: “bubbling up” Alcune eccezioni possono essere catturate e altre rilanciate: Void aMethod (…) throw IOException { try { …readFromFile(“a.txt”); catch (FileNotFoundException ex) { … } } Ancora, si può catturare un’eccezione e, dentro il catch, lanciarne un’altra ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: il “finally” Supponiamo di voler uscire da casi sdi eccezione in maniera pulita, magari liberando memoria utilizzata. Per evitare di duplicare linee di codice in ogni catch e allo stesso tempo per mettere in evidenza le operazioni di “cleanup”, si usa il blocco “finally”, che compare per ultimo dopo tutti i catch. Esso è sempre eseguito indipendentemente dal tipo di uscita. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: il “finally” Se qualcosa va male, si entra in uno dei blocchi catch e il finally viene eseguito dopo il catch. Se viene lanciata un’eccezione che il metodo rilancia, il finally viene eseguito prima che l’eccezione si propaghi al livello successivo. Se il try va a buon fine, o anche se si esegue un return o un break, il finally viene eseguito Eventualmente, per eseguire operazioni di “cleanup”, si può usare try con finally senza catch ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Eccezioni: uso di finally try { … } catch (FileNotFoundException ex) { … } catch (IOException ex) { … } catch (Exception ex) { … } finally { // Operazioni di cleanup } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Errori Nelle API Java vi è anche la classe java.lang.Error per gli errori irrecuperabili. Gli Error non necessitano di cattura, per cui il programmatore non se ne preoccupa. Essi indicano di norma errori di link o della virtual machines, che causano l’uscita dell’interprete dal codice ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Errori: alcune sottoclassi di java.lang.Error Object Throwable Error LinkageError ThreadDeath VirtualMachinesError ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Conclusioni Abbiamo visto: • Cosa sono le eccezioni e in che modo possono essere gestite • Cosa sono gli errori ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Eccezioni ed errori Richiami e suggerimenti Importante: Imparare una corretta gestione delle eccezioni, studiando dove sia opportuno catturarle e dove invece rilanciarle ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Grazie per l’attenzione – Domande? ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione alla programmazione con linguaggio Java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Note di Copyright Queste trasparenze (slide) sono coperte dalle leggi sul copyright. Testi grafica e immagini in essa contenuti sono di proprietà dei rispettivi autori: Dr. Maurizio Carta, Ing. Ing. Mauro Ennas, Ing. Ing. Stefano Piras e Ing. Ing. Fabrizio Saba. Saba. Tali slide possono essere duplicate e riprodotte dalle scuole di ogni ordine e grado italiane o estere per applicazioni legate alla didattica e senza finalità di lucro. Ogni altra finalità o uso (ivi compresa la duplicazione su supporto magnetico, la trasmissione, la memorizzazione e la stampa totale o parziale) è vietata senza autorizzazione scritta da parte degli autori. Gli autori non si assumono nessuna responsabilità sulle informazioni contenute in queste slide che sono state realizzate per finalità meramente didattiche e sono aggiornate alla data riportata in calce. L’intestazione a piè pagina deve comunque non essere alterata e deve sempre essere riportata anche in un utilizzo parziale del suddetto materiale. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Indice del corso • • • • • • • Modulo Modulo Modulo Modulo Modulo Modulo Modulo 1: 2: 3: 4: 5: 6: 7: Introduzione Sintassi Java Oggetti e Classi Features Eccezioni GUI Extra ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Modulo 6 GUI ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } In questo modulo • • • • • • AWT e Swing Container, componenti e gestori di layout Il modello ad eventi Ascoltatori e adattatori Componenti e JFC Esercitazione: progettare una GUI ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing AWT package • L’Abstract Windows Toolkit funzionalità di base per le (“Graphics User Interface” componenti software riusabili applet e applicazioni Java. (AWT) fornisce le interfacce grafiche – GUI), tramite e compatibili con • Contiene classi che possono essere estese e le loro proprietà ereditate ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing Containers e components • Ci sono due tipi principali ci containers – Windows (java.awt.Windows) • Frame: finestra con titolo e angoli resize • Dialog: finestra senza menu bar – Panel (java.awt.Panel): è contenuto all’interno di un altro container (ad esempio una Windows o una sua sottoclasse), individua un’area rettangolare entro la quale possono essere disposti altri componenti • I containers possono contenere al loro interno altri containers e non solo componenti! Ciò permette di costruire interfacce complesse ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing Layout Manager La posizione e la dimensione di un componente in un container è determinata da un layout manager – Il container prende un riferimento da una particolare istanza del layout manager e quando ha bisogno di posizionare un componente invoca il layout manager che provvede a realizzare l’azione desiderata (delegazione) – Il layout manager ha controllo totale sui componenti del container – Il layout manager è responsabile del calcolo e della definizione delle dimensioni standard in relazione alle dimensioni attuali dello schermo ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing Principali Layout Manager Il layout manager in un container viene gestito da un layout manager che tipicamente viene associato per default a ciascun container (come un Panel o un Frame); i tipi principali di layout manager sono i seguenti: – – – – – FlowLayout BorderLayout GridLayout CardLayout GridBagLayout È possibile cambiare layout manager chiamando il metodo “setLayout()” ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing Default Layout Manager Component Container Windows Frame Dialog Panel Applet FlowLayout BorderLayout ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing FlowLayout B1 B2 B3 • Default layout per i Panel • I componenti si aggiungono da sinistra verso destra • L’allineamento è centrato ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing FlowLayout: esempio import import java.awt.*; java.awt.*; public class public class EsempioDiFlowLayout EsempioDiFlowLayout {{ private private Frame Frame myFrame; myFrame; private Button private Button myButtonA; myButtonA; private private Button Button myButtonB; myButtonB; public void esegui() public void esegui() {{ myFrame = new Frame(“Questo è un esempio”); myFrame = new Frame(“Questo è un esempio”); myFrame.setLayout(new myFrame.setLayout(new FlowLayout()); FlowLayout()); myButtonA = new Button(“Funzione myButtonA = new Button(“Funzione A”); A”); myButtonB myButtonB == new new Button(“Funzione Button(“Funzione B”); B”); myFrame.add(myButtonA); myFrame.add(myButtonA); myFrame.add(myButtonB); myFrame.add(myButtonB); myFrame.pack(); myFrame.pack(); myFrame.setVisible(true); myFrame.setVisible(true); }} public public static static void void main main (Strings (Strings args[]) args[]) {{ EsempioDiFlowLayout myFL EsempioDiFlowLayout myFL == new new EsempioDiFlowLayout(); EsempioDiFlowLayout(); myFL.esegui(); myFL.esegui(); }} }} ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing BorderLayout B1 B4 B5 B2 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } B3 AWT e Swing GridLayout B1 B2 B3 B4 B5 B6 • I componenti si aggiungono da sinistra a destra, dall’alto verso il basso • Ogni regione viene dimensionata allo stesso modo • Tramite il costruttore si specificano le righe e le colonne ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } AWT e Swing GridBagLayout B1 B2 B3 B4 B5 B6 B7 B8 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Eventi • Gli eventi sono oggetti che descrivono cosa accade • La sorgente di eventi (event source) è il generatore di un evento • Il manipolatore di eventi (event heandler) è il metodo che riceve un oggetto evento, lo decifra, ed elabora l’interazione con l’utente Quando un utente compie un’azione sull’interfaccia (preme un bottone o clicca il mouse), ciò causa un evento che può essere gestito dal programma che lo rileva ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Event Handling – Modello gerarchico (JDK 1.0) • Basato sul meccanismo del contenitore e del contenuto • Gli eventi sono da prima trasmessi al componente soggetto dell’azione, e poi propagati nei contenitori secondo l’ordine gerarchico • Gli eventi che non vengono gestiti da un handler automaticamente, continuano a propagarsi ai componenti del container – Modello a delega (JDK 1.1) • Gli eventi sono gestiti dal componente a partire dal quale tale evento è stato originato, ma consente a ciascun componente di propagarlo verso una o più classi particolari chiamate listener • I listener contengono event headler in grado di ricevere ed elaborare gli eventi ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi JDK 1.0 event model – Vantaggi: • Utilizza principi di programmazione propri dell’object oriented – Si usa la calsse java.awt.Component – Si realizza l’Override del metono headleEvent() – Svantaggi: • L’evento può essere gestito solo dal componente dal quale si è originato o da un elemento gerarchico della catena contenitore contenuto: ciò produce perdite di tempo )CPU cycles) • Per gestire l’evento si devono creare sottoclassi del componente che riceve l’evento o creare un metodo alla base del container (vertice gerarchia) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi JDK 1.1 event model – Vantaggi: • Gli eventi vengono gestiti accidentalmente come accade nel modello JDK 1.0 nel quale il contenitore può trovarsi a dover gestire ciò che il contenuto non è riuscito a gestire • Si possono costruire filtri (adapter) per classificare i tipi di azioni • Si crea una migliore distribuzione del lavoro di gestione degli eventi su tutte le calssi – Svantaggi: • I due modelli visti non possono essere combinati fra loro ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Esempio import import java.awt.*; java.awt.*; Import Import java.awt.event.*; java.awt.event.*; public class public class TwoListener TwoListener implements implements MouseMotionListener, MouseMotionListener, MouseListener MouseListener {{ private Frame f; private Frame f; private private TextField TextField tf; tf; public void esegui() { public void esegui() { ff == new new Frame(“Two Frame(“Two listener listener example”); example”); f.add(new Label(“Click and Drag the mouse”), BorderLayout.NORTH); f.add(new Label(“Click and Drag the mouse”), BorderLayout.NORTH); tf tf == new new TextField TextField (30); (30); f.add(tf, f.add(tf, BorderLayout.SHOUTH); BorderLayout.SHOUTH); f.addMouseMotionListener(this); f.addMouseMotionListener(this); f.setSize(300,200); f.setSize(300,200); f.setVisible(true); f.setVisible(true); }} }} // // mouse mouse listener listener event event Public Public void void mouseDragged mouseDragged (MouseEvent (MouseEvent e) e) {{ String String s=“Mouse s=“Mouse dragging: dragging: X=“+e.getX()+” X=“+e.getX()+” Y=“+e.getY(); Y=“+e.getY(); tf.setText(s); tf.setText(s); }} Public void mouseEvent (MouseEvent e) { Public void mouseEvent (MouseEvent e) { String String s=“The s=“The mouse mouse is is left left the the building”; building”; tf.setText(s); tf.setText(s); }} …… continua continua ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Esempio Segue Segue …… Puclic void mouseExited (mouseEvent e) { Puclic void mouseExited (mouseEvent e) { String String s=“the s=“the mouse mouse is is left left the the building”; building”; tf.setText(s); tf.setText(s); }} // // Public void mouseMoved (MouseEvente e) {}; Public void mouseMoved (MouseEvente e) {}; // // Unused Unused MouseListener MouseListener methods methods public void mousePressed public void mousePressed (MouseEvent (MouseEvent e) e) {{ }; }; public public void void mouseClicked mouseClicked (MouseEvent (MouseEvent e) e) {{ }; }; public void mouseReleased(MouseEvent e) { }; public void mouseReleased(MouseEvent e) { }; // // main main public public static static void void main main (( )) (String (String args[ args[ ]] )) {{ TwoListen two = new TwoListen( ); TwoListen two = new TwoListen( ); two.esegui( two.esegui( ); ); }} }} ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Il modello a eventi Adattatori (adaptor classes) • Le classi di ascoltatori che definiamo possono estendere le classi adapter e realizzare un override solo dei metodi necessari • In questo modo ci risparmiamo di indicare le interfacce dei metodi non utilizzati ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Caratteristiche chiave delle JFC • Le classi AWT vengono arricchite di nuovi componenti che nel complesso costituiscono le JFC • Le JFC sono componenti GUI e servizi che semplificano drasticamente il progetto di interfacce grafiche complesse e robuste • JFC sono parte integrante di SDK 2 e sono costituite principalmente da cinque API: – AWT, Java 2D, Accessibility, Drag and Drop, Swing • JFC contiene AWT (Swing estende AWT) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Caratteristiche chiave delle JFC • AWT – GUI tools in grado di soddisfare una larga parte delle applicazioni Java • Java 2D – Fornisce un set di funzionalità avanzate per la grafica 2D e l’elaborazione delle immagini • Accessibility – Mette a disposizione un set di tools avanzati per l’input output non tradizionale (speech processing) • Drag and Drop – Permette l’intercomunicabilità tra applicazioni applicazioni che non supportano java java e • Swing – Fornisce un ricco set di funzionalità per il progetto delle GUI ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } altre Componenti e JFC Componenti Swing ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Componenti Swing JLabel JList JCombobox JScrollPane JSlider JOptionPane JTable ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } JButton JToggleButton Componenti e JFC Swing • Pluggable look and feel – Le applicazioni appaiono indipendenti dalla piattaforma – Sono disponibili componenti personalizzabili • Architettura Swing – Costruite attorno a API che implementano varie parti di AWT – Molte componeneti non utilizzano componenti Platformspecific come AWT (gestione dispositivi grafici) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Cos’è un’Applet • Una classe Java che puo essere: – Richiamate da una pagina HTML, scaricata ed eseguita da un browser Web – L’applet viene eseguita nell’ambiente di un Web browser, il suo uso è legato al • • • • Caricamento URL Caricamento del documento HTML Caricamento delle classi applet Esecuzione dell’applet Queste quattro fasi sono sequenziali ed effettuate a cura del browser Web ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Applet: sicurezza • Molti browser sono in grado di prevenire – – – – L’esecuzione di un altro programma L’input-output su file Chiamate a metodi nativi Tentativi di apertura di socket su host diversi da quello sul quale è in esecuzione l’applet corrente ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Applet: metodi • init() – Inizializzazioni base per l’applet • start() – Viene chiamato quando l’applet diviene visibile • stop() – Viene chiamato quando l’applet diviene invisibile • destroy() – Utilizzato solo se devono rilasciarsi risorse specifiche (ad esempio thread generati dall’applet) • paint() – Visualizza l’applet ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Progettare una semplice GUI: fasi • Stabilire le funzionalità • Disegnare l’interfaccia utente • Scegliere il layout manager appropriato • Scegliere i componenti in base alle funzionalità (leggere la documentazione) • Implementare il modello ad eventi • Testare il funzionamento ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } ESERCITAZIONE Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Componenti e JFC Progettare una semplice applicazione in Java • Analisi dei requisiti • Analisi dell’applicazione – La GUI • Event handling – Strutturare le classi • Eccezioni • Streaming I/O • Progetto e implementazione • Testing ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Grazie per l’attenzione – Domande? ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione alla programmazione con linguaggio Java ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Note di Copyright Queste trasparenze (slide) sono coperte dalle leggi sul copyright. Testi grafica e immagini in essa contenuti sono di proprietà dei rispettivi autori: Dr. Maurizio Carta, Ing. Ing. Mauro Ennas, Ing. Ing. Stefano Piras e Ing. Ing. Fabrizio Saba. Saba. Tali slide possono essere duplicate e riprodotte dalle scuole di ogni ordine e grado italiane o estere per applicazioni legate alla didattica e senza finalità di lucro. Ogni altra finalità o uso (ivi compresa la duplicazione su supporto magnetico, la trasmissione, la memorizzazione e la stampa totale o parziale) è vietata senza autorizzazione scritta da parte degli autori. Gli autori non si assumono nessuna responsabilità sulle informazioni contenute in queste slide che sono state realizzate per finalità meramente didattiche e sono aggiornate alla data riportata in calce. L’intestazione a piè pagina deve comunque non essere alterata e deve sempre essere riportata anche in un utilizzo parziale del suddetto materiale. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Indice del corso • • • • • • • Modulo Modulo Modulo Modulo Modulo Modulo Modulo 1: 2: 3: 4: 5: 6: 7: Introduzione Sintassi Java Oggetti e Classi Features Eccezioni GUI Extra ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Modulo 7 Extra ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } In questo modulo • • • • • Thread I/O streaming e file Introduzione al networking Cenni sulla connessione ai database Cenni sulla programmazione JSP ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Thread (cenni) Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Thread Definizione di “thread” • Il thread è una CPU virtuale – In un contesto di esecuzione, il thread rappresenta il lavoro svolto da una CPU virtuale che esegue il suo programma (porzione di codice) su propri dati • La classe di riferimento è java.lang.Thread ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Thread Creare thread • Un thread viene riferito attravesro un’istanza di una classe Thread – Creare un’istanza di una classe che implementa l’interfaccia “Runnable” – Creare un’istanza della classe “Thread” alla quale passare l’istanza creata al punto precedente – Attivarel’istanza della classe “Thread” con il metodo start() ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Thread Creare thread implementando “Runnable” • Creare un’istanza di l’interfaccia”Runnable” una classe che implementa class MyRun implements Runnable { int i; public void run() { while(true) { System.out.println(“Hello “+ i++); if (i==50){ break } } } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Thread Creare thread implementando “Runnable” • Creare un’istanza della classe “Thread” alla quale passare l’istanza creata al punto precedente public class ThreadTest { public static void main (String args[]) { MyRun r = new MyRun(); Thread t = new Thread(r); //creare t.start(); //attivare } } • Attivare l’istanza della classe “Thread” con il metodo start() ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Thread Creare thread estendendo la classe “Thread” public class MyThread extends Thread { public void run () { // istruzioni try { sleep(100); } catch (InterruptedException e) { // interruzione dello sleep } } } public static void main (String args[]) { Thread t = new Thread(); t.start(); } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Thread Implementare Runnable • Poiché la tecnologia Java permette solo ereditarietà singola, può essere necessario (ad esempio nel caso in cui si stiano estendendo altre classi quali applet) utilizzare i thread mediante implementazione di Runnable, non potendo estendere la classe Thread … ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Thread Estendere la classe Thread • L’utilizzo dell’estensione della classe Thread è delicato, bisogna tenere conto del fatto che non è permessa ereditarietà multipla. Ad ogni modo se si opta per questa via si semplifica la scrittura del codice, i metodi possono essere chiamati direttamente in quanto verranno applicati senza amiguità al thread corrente Thread.currentThread().sleep(100); Diventa sleep(100); ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Thread Multithreading • Multithreading programming – Più thread dipendenti dalla stessa istanza “Runnable” – I threads condividono stessi dati e codice – Dichiarazione thread t1 = new Thread(r); thread t2 = new Thread(r); In questo caso entrambi condividono stesso codice e stessi dati ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Thread Controllare l’esecuzione • Utilizzare il metodo start() • Mettere il thread in uno stato runnable • Testare i thread – isAlive() • Restituisce true se un thread è stato attivato, anche se non ha terminato il suo task • Sospendere e attivare – sleep() • Sblocca il chimante per un certo periodo di tempo • Permette ad altri thread di essere portati in esecuzione – join() • Mette il thread corrente in attesa finchè il chiamante del metodo join() non ha terminato ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Thread Scheduling dei thread • Spesso, in Java, i thread sono trattati con il modello a prelazione (preemptive), non necessariamente timeslice • Nl modello con preemptive scheluding molti thread possono essere eseguibili ma uno solo è attualmente in esecuzione … questo thread continua ad essere eseguito finché cessa di essere eseguibile oppure un altro thread di maggior priorità diviene eseguibile (runnable) • Tutti i thread eseguibili vengono raccolti in una coda a priorità ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } I/O straming e file (cenni) Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } I/O streaming e file Architettura • Tutte le classi JDK sono serializzabili eccetto – Classi con tutti i campi static e/o transient – Classi rappresentanti caratteristiche specifiche della Virtual Machine • Quando si deserializzano oggetti con campi static o transient vengono generati in loro corrispondenza valori di default ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } I/O streaming e file Serializzazione su file import java.io.*; import java.util.Date; public class SerializeDate { SerializaDate() { Date d = new Date(); try{ FileOutputStream f = new FileoutputStream(“date.ser”); ObjectOutputStream s = new ObjectOutputStream(f); s.writeObject(d); s.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main (String args[]) { new SerializeDate(); } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } I/O streaming e file Serializzazione su file Date d = new Date (); FileOutputStream f = new FileOutputStream (“date.ser”); ObjectOutputStream s = new ObjectOutputStream (f); s.writeObject (d); s.close(); Hfhgf … hfhgfg Date d ObjectOutputStream s FileOutputStream f ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } I/O streaming e file Deserializzazione su file import java.io.*; import java.util.Date; public class UnSerializeDate { UnSerializeDate () { Date d = null; try { FileInputStream f = new FileInputStream ("date.ser"); ObjectInputStream s = new ObjectInputStream (f); d = (Date) s.readObject (); s.close (); } catch (Exception e) { e.printStackTrace (); } System.out.println("Unserialized Date object from date.ser"); System.out.println("Date: "+d); } public static void main (String args[]) { new UnSerializeDate(); } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } I/O streaming e file Flusso di dati di input import java.io.*; public class CharInput { public static void main (String args[]) trows java.io.IOException{ String s; InputStreamreader ir; BufferedReader in; ir = new InputStreamReader(System.ini); in = new Bufferedreader(ir); While ((s = in.readLine()) != null) { System.out.println(“read: “+s); } } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione al Networking Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione al Networking Networking in Java • Indirizzamento della connession – Indirizzo o nome della macchina remota – Numero della porta per individuare il servizio • Il numero di porta – Compreso tra 0 e 65535 • Socket – Indirizzo_IP:Porta ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione al Networking Modello di networking in Java ServerSocket (port_number) ServerSocket.accept() Socket() OutputStream InputStream Socket.close() Socket (host, port_number) OutputStream InputStream Socket.close() ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione al Networking Modello di networking in Java ServerSocket (port_number) ServerSocket.accept() Socket() Registrazione del Socket di ascolto sul Server e attesa della richiesta del Client All’arrivo della richiesta viene creato il Socket di comunicazione ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione al Networking Modello di networking in Java Richiesta di apertura della connessione dalla parte Client Se il lato Server ha attivato il ServerSocket e lanciato il metodo di attesa “accept” la connessione potrà essere attivata (creazione del socket sul lato Server) Socket (host, port_number) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione al Networking Server Side 1 import java.net.*; 2 import java.io.*; 3 4 public class SimpleServer{ 5 public static void main(String args[]) { 6 ServerSocket s = null; 7 Socket s1; 8 String sendString = “Hello Net World!”; 9 int slength = sendString.lenght(); 10 OutputStream s1out; 11 DataOutputStream dos; 12 13 // register your service on port 5432 14 try { 15 S = new ServerSocket(5432); 16 } catch (IOException e) { 17 // ignore 18 } 19 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione al Networking Server Side 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 // Run the listen/accept loop forever While (true) { Try { // wait and listen for a connection s1=s.accept(); // get a communication stream associated with the socket s1out = s1.getOutputStream(); Dos = new DataOutputStream(s1out); // send your string! // (UTF provides machine indeoendence) dos.writeUTF(sendString); // close the connection, but not the server socket dos.close(); s1out.close(); s1.close(); } catch (IOException e) { //ignore } } } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Introduzione al Networking Client Side 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import java.net.*; import java.io.*; public class SimpleClietn { public static void main (String args{}) throw IOException { int c; Socket s1; InputStream s1ln; DataInputStream dis; // open your connection to a server, at port 54321 // localhost used here s1 = new Socket (“127.0.0.1”,5432): // Get an input file handle from socket and // read th input s1ln = s1.getInputStream(); Dis = new DataInputStream(s1ln); String st = new String (dis_readUTE()); System.out.println(st); // When done, just close the connection and exit dis.close(); s1ln.close(); s1.close(); } } ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Connessione ai Database (cenni) Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Connessione ai Database Modello client/server a 3 livelli Presentazione Business logic (funzionalità) Dati Tre livelli indipendenti di software, ognuno dei quali è modificabile separatamente senza influire sugli altri. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Connessione ai Database Modello client/server a 2 livelli Richiesta SQL front-end (Client) Database Server Database (back-end) Risposta SQL Il client accede ai dati attraverso il back-end del database server, senza nessuna madiazione ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Connessione ai Database Accesso ai dati a 3 livelli Richiesta SQL front-end (Client) Middle tier Database (bisiness logic) (back-end) Risposta SQL Database Il ‘middle tier’ permette di ottenere un’interfaccia indipendente dal database e rende il ‘front-end’ più robusto. ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Connessione ai Database JDBC: Java DataBase Connectivity JDBC API Applicazione Java Driver Manager (JDBC) JDBC Driver API Driver Protocol Handler (JDBC) DBMS Database JDBC fornisce un’interfaccia standard per accedere ai database tramite un set di classi e metodi per realizzare le chiamate SQL Ogni database commerciale fornisce l’interfaccia proprietaria necessaria a realizzare l’aggancio con le API JDBC per permettere la gestione appropriata del DBMS ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Programmazione JSP (cenni) Programmazione Java SDK 2.0 ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Programmazione JSP Applicazioni web • Applicazioni client/server – Il server esegue l’applicazione che offre il servizio – Il client deve essere in grado di richiedere il servizio e di comprendere ed utilizzare la risposta del server • Utilizza prevalentemente il protocollo di livello applicazione HTTP (HyperText Transfer Protocol) • Il PayLoad è codificato usandol’HTML (HyperText Markup Language) ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Programmazione JSP Java Server Pages (JSP) • Tecnologia lato server – Si basa sulla tecnologia servlet Java • Basata sul modello di comunicazione “request/response” implementato nel protocollo HTTP ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Programmazione JSP Server Web <html> … … … <html> Risposta Client 1 Richiesta Infrastruttura di rete Server web Client n ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Programma (Software) Programmazione JSP HTTP • Protocollo di livello applicazione – Il server non mantiene alcuna informazione sul client dopo che ha inviato la risposta (‘stateless’), quindi non riconosce la eventuale correlazione tra più richieste – Ogni interazione client/server richiede uno scambio del tipo richiesta/risposta – Nulla indica al server come viene effettuata la richiesta, quindi il server non distingue tra vari modi di generazione della richiesta da parte del client 8non distingue un click da un form …) – Non consente al server di richiamare funzioni specifiche del client ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Programmazione JSP Servlet • Codice che aggiunge server (web) funzionalità specifiche al – Indipendenza dalla piattaforma e dal produttore( sono supportate dai principali produttori) – Integrazione (possono sfruttare tutte le tecnologie Java quali JDBC, JNDI, RMI, EJB …) – Efficienza (ogni richiesta servlet viene eseguita come thread separato all’interno di un processo che termina quando viene chiusa l’applicazione basata sulla servlet) – Scalabilità – Robustezza e sicurezza ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Programmazione JSP Ciclo di vita di unaservlet Risposta del server CLASSE SERVLET Richiesta di servizio Client Server web Alla prima richiesta oppure all’avvio del server init(ServletConfig config) O ogni richiesta service(ServletRequest req, ServletResponse res) Una volta all’arresto del server destroy() ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } Programmazione JSP Fasi di traduzione e di elaborazione di una pagina JSP Server con contenitore per JSP J SP ella d a ur Lett [2 ] mio_servizio.jsp [1] GET/mio_servizio.jsp mio_servizioServlet.java Client [6] HTTP/1.0 200 OK <html>Messaggio di saluto<html> [3] Generazione della servlet [4] Compilazione [5] Esecuzione del servizio ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba } mio_servizioServlet.class Grazie per l’attenzione – Domande? ©2004 { Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba }