Introduzione alla programmazione con linguaggio Java

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 }