Introduzione - dsi.unive.itmp/Slides/01intro.pdf · 4 Versioni di JavaTM 1.6 2006 Aggiornamento...

Post on 26-May-2020

2 views 0 download

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