Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento...
Transcript of Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento...
1
Introduzione
Contenuti del corso
• Programmazione ad OggettiOggetti, polimorfismo, ereditarieta
• Metodologie di progettoAstrazione ed incapsulamento (encapsulation)Contratti e invariantiAsserzioni e documentazione
• Programmazione ad EventiInterfacce grafiche
• Programmazione di strutture datiCollections e streams
Contenuti – dettaglio
1. Introduzione: oggetti, e introduzione alla programmazione grafica2. Definizione di classi e progetto di semplici applicazioni grafiche3. Tipi di dato fondamentali: stringhe, array, arraylists4. Progetto di classi: packages, pre/post condizioni, invarianti
asserzioni, design,by contract.5. Interfacce e polimorfismo , progetto di applicazioni grafiche interattive6. Ereditarietà7. Streams, eccezioni8. Programmazione ad eventi e interfacce grafiche9. Un caso di studio: Automatic Teller Machine 10. Programmazione parametrica: generics e strutture dati11. Il framework Collection di Java12. C# e la piattaforma .net / Design patterns
2
Libri di testo
• Metodologie di progetto OOObject Oriented Software Development using in Java (II Edition)Xiaoping Jia. Pearson Education, 2002
• JavaJava Concepts (V Edition)Cay Horstmann. Wiley & Sons, 2008….
Esame
• Esercitazioni e progetticonsegna durante il corsodiscussione orale
• Scrittosolo per chi consegna le esercitazioni
MP on-line
• Informazioni e news sulla pagina web del corso
http://www.dsi.unive.it/~mp
• Consegna esercitazioniAutomatica (servizio in corso di attivazione)
3
JavaTM
L’ambiente diprogrammazione
JavaTM
• Alto livelloNo puntatori, no gestione esplicita dellamemoria (free/malloc)
• EspressivoFacilmente estendibile con nuovi tipi di dato, ricca collezione di tipi nelle librerie
• Portabile: bytecode eseguibile su JVM
• Robustocontrollo dei tipi forte, analisi di sicurezza
JavaTM – nato per la rete
4
Versioni di JavaTM
Aggiornamento delle Librerie20061.6
Generics, auto-boxing, for loops20051.5
Asserzioni20021.4
Nuovo compilatore20001.3
Swing e Collections19981.2
Classi interne19971.1
Prima versione19961.0
NovitàAnnoVersione
La piattaforma JavaTM
Compilazione ed Esecuzione
A.java A.class
BytecodeSorgente
5
Una vecchia conoscenza . . .
1: public class HelloTester2: { 3: public static void main(String[] args) 4: { 5: // Scrivi in output un saluto6:7: System.out.println("Hello, World!"); 8: } 9: }
Il cuore del programma
• Una chiamata di metodo
Compilazione ed esecuzione
• Compilazionejavac HelloTester.java
• Se ha successo crea il fileHelloTester.class
• Esecuzionejava HelloTester.class
• OutputHello World!
6
JVM – Java Virtual Machine
• Una macchina astratta: esegue codice intermedio (bytecode)specifica (istruzioni, registri, heap,…) indipendente dall’architettura sottostante
• Indipendente dal sistema operativo
• Presente nei browser più diffusi
• Implementazioni specifiche per smart card, palmari, cellulari (KVM) …
Java Virtual Machine• CLASS LOADER
carica in memoria tutte le classinecessarie al programma (anchequelle delle librerie usate)
• BYTECODE VERIFIERControlla l’integrità degli accessi in memoria, verifica l’aderenza allaspecifica della JVM, …
• SECURITY MANAGERverifica la sicurezza delle classicaricate a run time, controlla gliaccessi ai file, …
JVM
Security Manager
Bytecode Verifier
Class Loader
Interpreter
JAVAIL LINGUAGGIO
7
Tipi e variabili• Ogni valore nel linguaggio ha un tipo
• Ogni variabile deve essere dichiarata edassociata ad un tipo:
• Il tipo determina quali sono le operazionilegali sui valori (e le variabili)
• Variabili di un tipo possono solo assumerevalori di quel tipo
String greeting = "Hello, World!";PrintStream printer = System.out;int luckyNumber = 13;
Operatore di assegnamento
• =
• Modifica il valore delle variabiliint luckyNumber = 13; // inizializzazioneluckyNumber = 12; // assegnamento
Oggetti
• Entità manipolabili all’interno di un programma (mediante i metodi)
• Di un oggetto non necessariamenteconosciamo la struttura interna
• La cosa importante è che l’oggetto abbia un comportamento ben definito
una interfaccia verso l’esterno ben definita
• È tutto quello che ci serve per utilizzarel’oggetto
8
Programmazione procedurale
• Scopo: trovare la sequenza di passi che risolve il problema
• Incentrata sulla ricerca dell’algoritmo risolutivo
Programmazione ad oggetti
• Identifica gli oggetti del sistema e ne definisce struttura interna e interfaccia
• Coordina le interazioni tra oggetti, basandosi sulle interfacce
? ?
?
Classi e oggetti
• Ogni oggetto appartiene ad una classe. • Ad esempio System.out appartiene alla
classe PrintStream
9
Metodi• Codice che permette di accedere ai dati di un
oggetto
• I dati / lo stato di un oggetto sono accessibilisolo attraverso i metodi dell’oggetto
• La classe definisce i metodi dei suoi oggetti
• Interfaccia pubblica: specifica quali sono i metodi invocabili sugli oggetti della classe
Continua…
Due oggetti di tipo String
Metodi della classe String
• length: conta il numero di caratteri dellastringa
Continua…
String greeting = "Hello, World!";
int n = greeting.length(); // n = 13
Oggetto Metodo
10
Metodi della classe String
• toUpperCase: crea un altro oggetto di tipoString che contiene i caratteri della stringaoriginaria, ma convertiti in maiuscolo
Continua…
String fiume = "Mississippi";String fiumeInUpperCase = fiume.toUpperCase(); // fiumeInUpperCase = "MISSISSIPPI"
Metodi della classe String
• L’invocazione di un metodo su un oggetto èlegale solo se il metodo è parte dell’interfaccia pubblica della classe a cui l’oggetto appartiene
System.out.length(); // ERRORE
Oggetti di classe Rectangle
• Definita nella libreria java.awt
• Descrivono un rettangolo posizionato ad unadata coordinata sul piano
(x,y) = origine: angolo in alto a sinistra
11
Costruttori
• Il costrutto new costruisce un nuovo oggettodi tipo rettangolo
• Usa i parametri (5, 10, 20, e 30) per inizializzare I dati dell’oggetto
• Restituisce un riferimento all’oggetto
• Tipicamente il risultato viene assegnato ad una variabile
Rectangle box = new Rectangle(5, 10, 20, 30);
new Rectangle(5, 10, 20, 30)
Costruttori
• Una classe può fornire più di un costruttore(sempre con lo stesso nome) all’interno dellastessa classe
• fornisce diverse modalità di creazione dioggetti
new Rectangle()// costruisce un rettangolo con origine (0,0)// larghezza 0, e altezza zero 0
Sintassi: new
new ClassName(parameters)
Esempio:new Rectangle(5, 10, 20, 30)new Rectangle()
• Costruisce un nuovo oggetto, inizializza lo stato con i parametri, e restituisce un riferimento all’oggetto costruito.
12
Metodi della classe Rectangle
• getWidth: restituisce il valore che corrispondealla base del rettangolo
• translate: modifica l’oggetto su cui vieneinvocato modificando le coordinate dellaposizione
• Mutators: metodi con side effectsContinua…
box.translate(15, 25);
Metodi e side-effects
box.translate(15, 25);
Parametri espliciti e impliciti• Parametri = dati in input per i metodi
• Non tutti i metodi hanno parametri
• Tutti i metodi hanno un parametro implicito: l’oggetto su cui il metodo viene invocato
Continua…
System.out.println(greeting) greeting.length() // no parametri espliciti
System.out.println(greeting)
13
Parametri espliciti e impliciti
“Hello, World” è un parametro passato al metodo println
Parametri espliciti e impliciti
• Replace: ancora un metodo su stringhe
• Parametri:Uno implicito: "Mississippi"Due espliciti: "issipp" e "our"
• Risultato: "Missouri"
Continua…
fiume.replace("issipp", "our");
Parametri espliciti e impliciti
14
Definizione di metodi
• La definizione di un metodo specificai parametri espliciti con i loro tipiil tipo del risultato
• Il tipo del parametro implicito non vienespecificato
è la classe di cui la definizione di metodo faparte
Continua…
Definizione di metodi• I metodi che non restituiscono valori sono dichiarativoid
• Overloading:Un nome di metodo si può usare in più definizioniSe le definizioni sono nella stessa classe diciamo cheil nome è overloaded Le versioni di un metodo overloaded devono avereparametri diversi
public void println(String output) // classe PrintStream
public void println(String output)public void println(int output)
Oggetti e riferimenti
• Un riferimento è una astrazione del puntatoread un oggetto
• L’operatore new restituice un riferimento ad un nuovo oggetto
• Diverse variabili di tipo oggetto possonocondividere lo stesso riferimentoRectangle box = new Rectangle(5, 10, 20, 30);Rectangle box2 = box;box2.translate(15, 25);
Rectangle box = new Rectangle();
Continua…
15
Riferimenti ad oggetti
• Il comportamento delle variabili varia rispettoal loro tipo.
• In particolare le variabili di tipo primitivo sicomportano in modo diverso rispetto allevariabili di tipo oggetto
• Le differenze si manifestano negli effettidell’istruzione di assegnamento
Variabili di tipo primitivo
Contengono valori del loro tipo
Variabili di tipo oggetto
Contengono riferimenti ad oggetti, non oggetti
16
Assegnamento su tipi primitivi• int luckyNumber = 13;
int luckyNumber2 = luckyNumber;luckyNumber2 = 12;
Due variabili, due valori distinti
Assegnamento su tipi oggetto• Rectangle box = new Rectangle(5, 10, 20, 30);
Rectangle box2 = box;box2.translate(15, 25);
Continua…
Assegnamento su tipi oggetto
Due variabili, stessoriferimento
17
Classi test
Ovvero: come eseguire il test di una classe
• Definisci una nuova classe• Definisci un metodo main
• All’interno del main costruisci uno o piùoggetti delle classi da testare
• Invoca i metodi su tali oggetti
• Stampa i risultati
File MoveTester.java01: import java.awt.Rectangle;02:03: public class MoveTester04: {05: public static void main(String[] args)06: {07: Rectangle box = new Rectangle(5, 10, 20, 30);08:09: // Sposta il rettangolo10: box.translate(15, 25);11:12: // Stampa nuove info13: System.out.println(“Origine dopo la traslazione:”); 14: System.out.println(box.getX());15: System.out.println(box.getY());16: }17: }
Classi di libreria
• Sempre includere le classi di libreriautilizzate dall’applicazione
classi delle librerie raggruppate in packages
Importiamo le classi specificando i nomi dipackage e di classe
Le classi del package java.lang (ad esempio String e System)sono importateautomaticamente
import java.awt.Rectangle;
18
Sintassi: import
import packageName.ClassName;
Esempio:import java.awt.Rectangle; // importa la classe Rectangle
import packageName.*;
Esempio:import java.util.*; // importa tutte le classi del package
Documentazione sulle API
• API: Application Programming Interface
• Include la descrizione delle classi e dei relativimetodi della (fornitissima!) libreria Java
• http://java.sun.com/j2se/1.5/docs/api/index.html
• http://java.sun.com/j2se/1.6/docs/api/index.html
Documentazione sulle API
19
La API della classe Rectangle
Javadoc Method Summary
Documentazione del metodo translate
20
Elementi diprogrammazione grafica
Contenuti
• Introduzione alle applicazione di graficacontesto graficiforme geometriche elementaricolori“input dialogs” per ottenere input dall’utente
• Frames e applets
Frames• La classe JFrame
• import javax.swing.*;
JFrame frame = new JFrame();frame.setSize(300, 400);frame.setTitle(“Un frame vuoto");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);
21
Frames
File EmptyFrameViewer.java01: import javax.swing.*;02:03: class EmptyFrameViewer04: {05: public static void main(String[] args)06: {07: JFrame frame = new JFrame();08:09: final int FRAME_WIDTH = 300;10: final int FRAME_HEIGHT = 400;11:12: frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);13: frame.setTitle(“Un frame vuoto");14: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);15:16: frame.setVisible(true);17: }18: }
Disegno di forme geometriche• JComponent
La classe che definisce contenitorigenerici, al al cui interno includiamoforme geometriche
• Figure geometriche incluse in nuoviJComponentclass ShapeComponent extends JComponent{. . .}
22
Disegno di forme geometriche• paintComponent
il metodo invocato (automaticamente) tutte le volte che il componente per il quale e` definitoviene ridisegnatoè in questo metodo che si produce il disegno
class ShapeComponent extends JComponent{
public void paintComponent(Graphics g){
// Converti in Graphics2DGraphics2D g2 = (Graphics2D) g;. . .
}}
Disegno di forme geometriche
• Graphics classe che permette di manipolare lo stato della componente grafica(posizione/colore corrente)
• Graphics2D classe con metodi per la creazione e il disegno di figure geometriche
• Usa un cast per ottenere un oggetto di tipoGraphics2D dal parametro di tipo Graphics
• package java.awt
Rectangle r = new Rectangle(5, 10, 20, 30);g2.draw(rect);
File ShapeComponent.java01: import java.awt.Graphics;02: import java.awt.Graphics2D;03: import java.awt.Rectangle;04: import javax.swing.JPanel;05: import javax.swing.JComponent;06:07: /**08: Un Component che disegna due rettangoli.09: */10: class ShapeComponent extends JComponent11: { 12: public void paintComponent(Graphics g)13: { 14: // Ottieni un graphics2D15: Graphics2D g2 = (Graphics2D) g;16:
Continua…
23
File ShapeComponent.java
17: // Costruisci un rettangolo e disegna18: Rectangle r = new Rectangle(5, 10, 20, 30);19: g2.draw(r);20:21: // Trasla il rettangolo (15 a dx, 25 in basso) 22: r.translate(15, 25);23:24: // Disegna il rettangolo traslato25: g2.draw(r);26: }27: }
Applicazioni
• ShapeViewer
classe che lancia una finestra all’interno dellaquale vengono raffigurate Ie componentiL’applicazione è costruita interamenteall’interno del metodo main della classeDisegna due rettangoli
Continua…
Applicazione ShapeViewer
24
Il metodo main
1. Costruisci il frame2. Costruisci un oggetto della classe component
3. Aggiunti il component al frame
La chiamata è leggermente più complicata per versioni di Java precedenti alla 5:
4. Rendi visibile il frame
ShapeComponent component = new ShapeComponent();
frame.add(component);
frame.getContentPane().add(component);
File ShapeViewer.java
01: import javax.swing.JFrame;02:03: class ShapeViewer04: {05: public static void main(String[] args)06: {07: JFrame frame = new JFrame();08:09: final int FRAME_WIDTH = 300;10: final int FRAME_HEIGHT = 400;11: 12: frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);13: frame.setTitle(“Due rettangoli");14: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);15:
Continua…
File ShapeViewer.java
16: ShapeComponent component = new ShapeComponent();17: frame.add(component);18:19: frame.setVisible(true);20: }21: }
25
Applets
• Applets sono applicazioni eseguiteall’interno di un browser
• L’implementazione di un Applet utilizza ilpattern seguente: public class MyApplet extends JApplet{
public void paint(Graphics g){
// Ottieni un contesto graficoGraphics2D g2 = (Graphics2D) g;// Istruzioni per il disegno. . .
}}
Applets
• La struttura è molto simile a quella di un JComponent, con due differenze: 1. Estendiamo JApplet, invece di
JComponent
2. IL codice del disegno è parte del metodopaint, invece che del metodopaintComponent
• Per eseguire un applet, dobbiamo creare un file HTML ed inserire il codice che lancial’applet mediante la tag applet
Applets
• Un file HTML può avere diversi applets, ciascuno dei quali introdotto da unacorrispondente tag (di tipo applet)
• Un applet può essere lanciato mediantel’appletviewer, o all’interno di un browser in cui Java sia stato abilitato.
appletviewer RectangleApplet.html
26
File ShapeApplet.java
01: import java.awt.Graphics;02: import java.awt.Graphics2D;03: import java.awt.Rectangle;04: import javax.swing.JApplet;05:06: /**07: Un applet che disegna due rettangoli.08: */09: public class ShapeApplet extends JApplet10: { 11: public void paint(Graphics g)12: { 13: // Ottieni un contesto grafico14: Graphics2D g2 = (Graphics2D) g;
Continua…
File ShapeApplet.java
17: // Costruisci un rettangolo e disegna18: Rectangle r = new Rectangle(5, 10, 20, 30);19: g2.draw(r);20:21: // Trasla il rettangolo (15 a dx, 25 in basso) 22: r.translate(15, 25);23:24: // Disegna il rettangolo traslato25: g2.draw(r);26: }27: }
File ShapeAppletViewer.html
<html> <head>
<title>Due rettangoli</title> </head> <body>
<p>Here’s my first applet:</p> <applet code="RectangleApplet.class" width="300" height="400"></applet>
</body></html>
27
Applets
Forme Geometriche
• Rectangle, Ellipse2D.Double,Line2D.Double fornite dal package java.awt
• Alcune di queste classi, e.g. Line2D.Double, sono interne. Per il momento ignoriamo questoaspetto, ma notiamo la dichiarazione import
• Per disegnare una forma dobbiamo costruirla e disegnarlaEllipse2D.Double e = new Ellipse2D.Double(x, y, width, height);g2.draw(e);
import java.awt.geom.Ellipse2D; // no .Double
Una ellisse e la sua bounding box
28
Linee
• Due modi per disegnare una linea:
oppure,
Line2D.Double segmento = new Line2D.Double(x1, y1, x2, y2);
Point2D.Double from = new Point2D.Double(x1, y1);Point2D.Double to = new Point2D.Double(x2, y2);Line2D.Double segmento = new Line2D.Double(from, to);
Stringhe
g2.drawString("Message", 50, 100);
Colori
• Colori standard Color.BLUE, Color.RED, …
• Nuovi colori: formato rgb settando i valori dellecomponenti red, green, blue tra 0.0F e 1.0F
• setColor setta il colore del Graphic Contexts
• Usa il colore con i metodi draw e fill
g2.setColor(magenta);
g2.fill(rectangle); // riempito con il colore corrente
Color magenta = new Color(1.0F,0.0F,1.0F), // F = float