PROGRAMMAZIONE AVANZATA JAVA E C Massimiliano Redolfi Lezione 1: warm-up Premessa [email protected] ricevimento: martedì dalle 11.30 alle 12.30 mandate mail con oggetto [pajc cognome nome] descrizione Ricordate che le informazioni utili verranno date a tempo utile… Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Prerequisiti, argomenti, libri e altro…. Il corso di Fondamenti è un prerequisito… daremo per scontate e quindi note: • le conoscenze base Java (perlomeno tipi dati, costrutti, classi, gestione errori) • le conoscenze base relativi ad algoritmi e pattern fondamentali • le conoscenze base realtive ai sistemi operativi (ls, df, du, top, …) ! • saper utilizzare un calcolatore • saper utilizzare eclipse Tanto per non sbagliarci e dare troppo per scontato faremo comunque qualche ripasso-test al momento opportuno. Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Prerequisiti, argomenti, libri e altro…. Libri di testo: Thinking in Java, Bruce Eckel, Prentice Hall Core Java 2 Volume I e II Pearson, Cay S. Horstmann, Gary Cornell - Prentice Hall Il linguaggio C – seconda edizione, Brian W. Kernighan, Dennis M. Ritchie Pearson – Prentice Hall Qualche url… Oppure libri equivalenti che avete. Scegliete testi in inglese, sono più aggiornati più chiari e contengono meno errori. sito del corso (disponibile dal 22/9…) http://apollo.ing.unibs.it/pajc PS: esiste anche una nuova risorsa, Internet… provare ad utilizzarla non è male, e non è un consiglio! PS2: durante lo svolgimento del corso avremo modo di analizzare altre risorse… a tempo debito… Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Prerequisiti, argomenti, libri e altro…. Le slide sono INDICI (parziali) di ciò che DOVETE sapere Le slide: • non sostituiscono i libri • non sostituiscono gli appunti • non sono fatte per “studiarci sopra” • non sono esaustive • non sono complete • vengono distribuite dopo le lezioni Per tutto quanto sopra a voi le slide NON servono! Voi state frequentando il corso, potete prendere appunti che saranno certamente più completi! Le slide dovrebbero servire solo a chi non frequenta il corso per sapere (più o meno) ciò che si è perso. Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Orario ORARIO UFFICIALE MARTEDÌ dalle 8.30 alle 11.30 VENERDÌ dalle 8.30 alle 12.30 ORARIO EFFETTIVO MARTEDÌ VENERDÌ dalle 8.45 alle 11.15++ (pausa alle 10.00 circa) dalle 8.45 alle 12.00++ (pausa alle 10.30 circa) aule MARTEDÌ — MLAB1 VENERDÌ — N9 Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi I perché del corso… ossia cosa dovreste sapere alla fine JAVA: •OOP •programmazione event driven •programmazione concorrente •GUI / grafica •web service, XML, XSD •applicazioni web (applet) •mobile (Android) C: •programmazione procedurale •connessione stretta tra programma e hardware •comprensione profonda di come funziona un calcolatore Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi I perché del corso… last but not least •comprendere un problema •saper risolvere un problema •saper definire algoritmi efficienti ed efficaci per risolvere problemi •imparare a progettare algoritmi che generano algoritmi che risolvono problemi •saper provare (*) per problema si intende un problema di natura informatica, altri esulano dagli obiettivi del corso (almeno da quelli principali) Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Modalità d’esame Prova scritta - domande a risposta multipla - domande aperte - esercizi Java / C Orale: - se il voto della prova scritta è al limite della sufficienza - oppure se si vuole migliorare il proprio voto (attenzione si può anche peggiorarlo od essere bocciati) Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Ricetta per superare l’esame seguire le lezioni seguire tutte le lezioni (o almeno la maggior parte) capire le lezioni studiare sugli appunti, sui libri e sul proprio PC (slide solo come indice) eseguire i compiti assegnati provare a realizzare propri progetti ed a verificarne il funzionamento porsi domande ed approfondire oltre i compiti assegnati e gli argomenti visti iscriversi e partecipare all’esame e rispondere correttamente (senza copiare) Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi WARMUP Ok! Let’s go! Riprendiamoci dalle ferie… …rispolveriamo un po di Java e iniziamo a dare un occhio al C Siamo capitati nel nel bimondo dove tutto è a due dimensioni… abbiamo un problema… aiutare gli abitanti a classificare i loro oggetti… Prima di tutto salutiamo… Java vs C: Hello World HelloWorld.java package it.unibs.eps; public class HelloWorld { public static void main(String[] args) { System.out.printf("Hello World from JAVA!"); } } main.c #include <stdio.h> int main(void) { printf("Hello World from C"); return 0; } Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi primo tempo Iniziamo con i Rettangoli… Java vs C: Rectangle package it.unibs.eps; Main.java public class Main { public static int perimeter(Rectangle r) { return (r.height + r.width) * 2; } public static int area(Rectangle r) … public static void main(String[] args) { Rectangle r = new Rectangle(); r.height = 5; r.width = 7; System.out.printf(“Per.: %d\n", perimeter(r)); System.out.printf("Area: %d\n", area(r)); System.out.printf("Area: %s\n", r); } } Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi package it.unibs.eps; public class Rectangle { public int height; public int width; } Rectangle.java Java vs C: Rectangle #include <stdio.h> main.c typedef struct Rectangle_ST { int width; int height; } Rectangle_T; package it.unibs.eps; Rectangle.java public class Rectangle { public int height; public int width; } int perimeter(Rectangle_T r) { return (r.width + r.height) * 2; } package it.unibs.eps; Main.java public class Main { public static int perimeter(Rectangle r) { return (r.height + r.width) * 2; } int area(Rectangle_T r) { return r.width * r.height; } public static int area(Rectangle r) … public static void main(String[] args) { int main(void) { Rectangle_T r; r.height = 5; r.width = 8; Rectangle r = new Rectangle(); r.height = 5; r.width = 7; printf("Perimetro rettangolo: %d\n", perimeter(r)); printf("Area rettangolo: %d\n", area(r)); System.out.printf(“Per.: %d\n", perimeter(r)); System.out.printf("Area: %d\n", area(r)); System.out.printf("Area: %s\n", r); return 0; } } } Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Java: l’operatore new e la costruzione di oggetti… Main.java package it.unibs.eps; package it.unibs.eps; public class Main { public static int perimeter(Rectangle r) { return (r.height + r.width) * 2; } public class Rectangle { public int height; public int width; } Rectangle.java public static int area(Rectangle r) … public static void main(String[] args) { Rectangle r = new Rectangle(); r.height = 5; r.width = 7; System.out.printf(“Per.: %d\n", perimeter(r)); System.out.printf("Area: %d\n", area(r)); System.out.printf("Area: %s\n", r); } } Operatore: new Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi L’operatore new crea un’istanza della classe Rectangle, un oggetto di tipo Rectangle, che viene assegnato alla variabile r. Java: l’operatore new e la costruzione di oggetti… Main.java Rectangle.java package it.unibs.eps; package it.unibs.eps; public class Main { public static int perimeter(Rectangle r) { return (r.height + r.width) * 2; } public class Rectangle { public int height; public int width; Dov’è il metodo Rectangle()?? è un costruttore } implicito automaticamente definito per ogni classe public static int area(Rectangle r) … public static void main(String[] args) { Costruttore implicito Rectangle r = new Rectangle(); r.height = 5; r.width = 7; System.out.printf(“Per.: %d\n", perimeter(r)); System.out.printf("Area: %d\n", area(r)); System.out.printf("Area: %s\n", r); } } Il costruttore di una classe è una particolare funzione che viene richiamata al momento della creazione dell’istanza della classe ottenuta tramite l’operatore new ed ha lo scopo di inizializzare l’oggetto creato. Un costruttore ha lo stesso nome della classe e non restituisce alcun valore, può essere implicito (quello di default) o esplicito. Operatore: new Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Java: esplicitiamo il costruttore e passiamo larghezza ed altezza… Main.java Rectangle.java package it.unibs.eps; package it.unibs.eps; public class Main { public static int perimeter(Rectangle r) { return (r.height + r.width) * 2; } public class Rectangle { public int width; public int height; public Rectangle(int width, int height) { this.width = width; this.height = height; } public static int area(Rectangle r) … } public static void main(String[] args) { Rectangle r = new Rectangle(5, 7); System.out.printf(“Per.: %d\n", perimeter(r)); System.out.printf("Area: %d\n", area(r)); System.out.printf("Area: %s\n", r); } } Operatore: new Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi this, l’oggetto corrente, l’oggetto che invoca il metodo Costruttore esplicito L002 secondo tempo Aggiungiamo i quadrati… Java vs C: … aggiungiamo un quadrato main.c #include <stdio.h> package it.unibs.eps; public class Rectangle { public int width; public int height; typedef struct Rectangle_ST… int perimeter(Rectangle_T r)… int area(Rectangle_T r)… public Rectangle(int width, int height) { this.width = width; this.height = height; } typedef struct Square_ST { int width; int height; } Square_T; } int perimeter_sq(Square_T r){ return (r.width + r.height) * 2; } package it.unibs.eps; int area_sq(Square_T r){ return r.width * r.height; } int main(void) { Rectangle_T r; Square_T s; r.height = 5; Rectangle.java Square.java public class Square { public int width; public int height; r.width = 8; public Square(int size) { this.width = size; this.height = size; } s.height = s.width = 9; printf("Perimetro rettangolo: %d\n", perimeter(r)); printf("Area rettangolo: %d\n", area(r)); } printf("Perimetro quad.: %d\n", perimeter_sq(s)); printf("Area quadrato: %d\n", area_sq(s)); return 0; } Main.java Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Java vs C: calcolare perimetro e area… polimorfismo main.c #include <stdio.h> public class Main { public static int perimeter(Rectangle r) { return (r.height + r.width) * 2; } typedef struct Square_ST { int width; int height; } Square_T; public static int area(Rectangle r) { return r.height * r.width; } int perimeter_sq(Square_T r){ return (r.width + r.height) * 2; } public static int perimeter(Square r) { return (r.height + r.width) * 2; } int area_sq(Square_T r){ return r.width * r.height; } Square_T s; r.height = 5; Rectangle.java Main.java package it.unibs.eps; typedef struct Rectangle_ST… int perimeter(Rectangle_T r)… int area(Rectangle_T r)… int main(void) { Rectangle_T r; Square.java public static int area(Square r) { return r.height * r.width; } r.width = 8; public static void main(String[] args) { s.height = s.width = 9; Rectangle r = new Rectangle(5, 7); Square s = new Square(9); printf("Perimetro rettangolo: %d\n", perimeter(r)); printf("Area rettangolo: %d\n", area(r)); System.out.printf(“P.R.: %d\n", perimeter(r)); System.out.printf(“A.R.: %d\n", area(r)); printf("Perimetro quad.: %d\n", perimeter_sq(s)); printf("Area quadrato: %d\n", area_sq(s)); System.out.printf(“P.Q.: %d\n", perimeter(s)); System.out.printf(“A.Q.: %d\n", area(s)); return 0; } } } Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Java vs C: calcolare perimetro e area… polimorfismo package it.unibs.eps; Main.java public class Main { public static int perimeter(Rectangle r) { return (r.height + r.width) * 2; } public static int area(Rectangle r) { return r.height * r.width; } public static int perimeter(Square r) { return (r.height + r.width) * 2; } public static int area(Square r) { return r.height * r.width; } public static void main(String[] args) { Rectangle r = new Rectangle(5, 7); Square s = new Square(9); System.out.printf(“P.R.: %d\n", perimeter(r)); System.out.printf(“A.R.: %d\n", area(r)); System.out.printf(“P.Q.: %d\n", perimeter(s)); System.out.printf(“A.Q.: %d\n", area(s)); } } Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Square.java Rectangle.java Polimorfismo: funzioni diverse possono avere lo stesso nome purché abbiano parametri diversi (come tipo o numero…) Il sistema sceglie quella da invocare in funzione del tipo di dato utilizzato/passato. Siamo in presenza di quello che viene anche definito overloading di metodi. Derivazioni sul tema rettangolare Java: ma un quadrato non è… Square Rectangle package it.unibs.eps; public class Rectangle { public int width; public int height; Rectangle.java package it.unibs.eps; public class Square { public int width; public int height; public Rectangle(int width, int height) { this.width = width; this.height = height; } } Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Square.java public Square(int size) { this.width = size; this.height = size; } } L003 Java: un quadrato deriva da un rettangolo… Square Rectangle package it.unibs.eps; Rectangle.java public class Rectangle { public int width; public int height; Square.java package it.unibs.eps; public class Square extends Rectangle { public Square(int size) { this.width = size; this.height = size; } public Rectangle(int width, int height) { this.width = width; this.height = height; } } } Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Java: un quadrato deriva da un rettangolo… SUBCLASS Classe DERIVATA / FIGLIA SUPERCLASS Classe PADRE Square Rectangle package it.unibs.eps; public class Rectangle { public int width; public int height; public Rectangle(int width, int height) { this.width = width; this.height = height; } } Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Rectangle.java package it.unibs.eps; public class Square extends Rectangle { public Square(int size) { this.width = size; this.height = size; } } Square.java Java: super, this e la construction chain SUBCLASS Classe DERIVATA / FIGLIA SUPERCLASS Classe PADRE Square Rectangle this è.. Rectangle super è ??? this è.. this… cioè Square super è Rectangle Rectangle.java package it.unibs.eps; public class Rectangle { public int width; public int height; Square.java package it.unibs.eps; public class Square extends Rectangle { public Square(int size) super(size, size); } public Rectangle(int width, int height) { this.width = width; this.height = height; } { } } Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Java: sopra tutto c’è Object Se non diversamente specificato un oggetto viene derivato automaticamente dall’oggetto Java base Object e ne eredità metodi e proprietà (come in ogni altro caso di derivazione…) Object SUBCLASS Classe DERIVATA / FIGLIA SUPERCLASS Classe PADRE Square Rectangle this è.. Rectangle super è Object this è.. this… cioè Square super è Rectangle Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Java: e se la logica la portiamo nelle classi? Rectangle.java package it.unibs.eps; Una classe come una struttura può incapsulare attributi (fields) ma non solo… può anche incapsulare logica applicativa (costruttori e metodi). Possiamo avere metodi che si applicano alla classe (static) e metodi che si applicano agli oggetti (non static) public class Rectangle { public int width; public int height; public Rectangle(int width, int height) { this.width = width; this.height = height; } public static int perimeter(Rectangle r) { return (r.width + r.height) * 2; } public static int area(Rectangle r) { return r.width * r.height; } } Rectangle r1 = new Rectangle(5,4); Rectangle r2 = new Rectangle(9,13); int p1 = Rectangle.perimeter(r1); int p2 = Rectangle.perimeter(r2); Possiamo fare meglio… possiamo avere metodi che si applicano alla classe (static) ma anche metodi che si applicano agli oggetti (non static) e ne utilizzano direttamente i valori… Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Java: metodi di istanza Rectangle.java package it.unibs.eps; public class Rectangle { public int width; public int height; public Rectangle(int width, int height) { this.width = width; this.height = height; } perimetro e area sono metodi di istanza, metodi che possono essere invocati tramite un’istanza di una classe Rectangle (cioè un oggetto di tipo rectangle come r1 o r2). public int perimeter() { return (this.width + this.height) * 2; } I metodi vengono invocati nel contesto dell’oggetto corrente, quindi al loro interno possiamo accedere ad attributi e metodi dell’oggetto valorizzati in funzione dell’oggetto chiamante. public int area() { return this.width * this.height; } La parola chiave this in questo caso può anche essere omessa. } Rectangle r1 = new Rectangle(5,4); Rectangle r2 = new Rectangle(9,13); int p1 = r1.perimeter(); int p2 = r2.perimeter(); Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Java: i metodi come gli attributi si ereditano… Rectangle.java Square.java package it.unibs.eps; package it.unibs.eps; public class Rectangle { public int width; public int height; public class Square extends Rectangle { public Square(int size) super(size, size); } public Rectangle(int width, int height) { this.width = width; this.height = height; } { ? } public int perimeter() { return (width + height) * 2; } Square s = new Square(9); System.out.printf(“Perim. quad.: %d\n", s.perimeter()); public int area() { return width * height; } } Tutto viene ereditato… Basta modificare Rectangle e Square assume nuove caratteristiche… Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Java: override di metodi Rectangle.java Square.java package it.unibs.eps; package it.unibs.eps; public class Rectangle { public int width; public int height; public class Square extends Rectangle { public Square(int size) super(size, size); } public Rectangle(int width, int height) { this.width = width; this.height = height; } public int perimeter() { return (width + height) * 2; } { public int perimeter() { return height * 4; } } public int area() { return width * height; } } E’ possibile ridefinire in una classe derivata un metodo definito in una classe base (override). In questo modo è possibile cambiare il comportamento del metodo per gli oggetti della classe specificata. Rimane possibile richiamare i metodi della classe base tramite super Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Square s = new Square(9); System.out.printf(“Perim. quad.: %d\n", s.perimeter()); Java vs C: dopo aver riorganizzato il codice… main.c #include <stdio.h> typedef struct Rectangle_ST… int perimeter(Rectangle_T r)… int area(Rectangle_T r)… System.out.printf(“P.R.: %d\n", r.perimeter()); System.out.printf(“A.R.: %d\n", r.area()); typedef struct Square_ST { int width; int height; } Square_T; System.out.printf(“P.Q.: %d\n", s.perimeter()); System.out.printf(“A.Q.: %d\n", s.area()); } int perimeter_sq(Square_T r){ return (r.width + r.height) * 2; } } Rectangle.java int area_sq(Square_T r){ return r.width * r.height; } int main(void) { Rectangle_T r; Square_T s; r.height = 5; Main.java … public class Main { public static void main(String[] args) { Rectangle r = new Rectangle(5, 7); Square s = new Square(9); … public class Rectangle { public int width; public int height; public Rectangle(int width, int height) { this.width = width; this.height = height; r.width = 8; s.height = s.width = 9; public int perimeter() { return (width+height)*2; } public int area() { return width * height; } printf("Perimetro rettangolo: %d\n", perimeter(r)); printf("Area rettangolo: %d\n", area(r)); printf("Perimetro quad.: %d\n", perimeter_sq(s)); printf("Area quadrato: %d\n", area_sq(s)); return 0; } } } Square.java … public class Square extends Rectangle { public Square(int size) { super(size, size); } } Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi terzo tempo Ellipses & Circles perimeter Shape2d area draw xAxis yAxis radius Ellipse Rectangle Circle Square Diamond Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi ma le nostre astronavi ci creano qualche problema… Come relaziono le astronavi al resto degli oggetti? draw perimeter area …e soprattutto le astronavi NON sono forme ma sono astronavi… Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Interfacce draw draw Spaceship speed armor Alfa Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Interfacce IDrawable.java IDrawable public interface IDrawable { public void draw(); } draw implements draw Spaceship speed armor Alfa … e le collezioni di oggetti si riferiscono all’interfaccia funzionale di riferimento… Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi determinazione dei tipi compile time & run time compile time instanceof / (casting) if(s instanceof Shape2d) perimetro = ((Shape2d)s).perimeter()); run time o.class.isInstance() / class.cast(o) public boolean areObjectsAssignable(Object src, Object dest) { return dest.getClass().isInstance(src); } Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Java I/O Navigare nella struttura del File System File & Directory File class: permette la gestione dei file a livello di file system Elenco dei file Accesso agli attributi Cancellazione Cambio nome … Non permette di accedere ai contenuti del file (!) Perché chiamarlo File? ottima domanda! createNewFile(); delete(); deleteOnExit(); exists(); isAbsolute(); isDirectory(); isFile(); isHidden(); list(); listFiles(); mkdir(); mkdirs(); renameTo(); setLastModified(); setReadOnly(); canRead(); canWrite(); getCanonicalPath(); getAbsolutePath(); getCanonicalFile(); getAbsoluteFile(); Vedi jEx020 I/O in Java Ma chi l’ha pensato a cosa pensava? Stream (vista semplificata) InputStream OutputStream specializzati per: • array of byte • string • file • pipe • stream sequence • altro (es. internet connection) specializzati per: • array of byte • file • pipe • stream sequence • altro (es. internet connection) readers BufferedReader writers Testo BufferedWriter PrintWriter DataInputStream Binari DataOutputStream Leggere un file di testo BufferedReader READ public static String read(String fname) { BufferedReader in; try { in = new BufferedReader(new FileReader(fname)); try { int lcount = 1; String s; StringBuilder sb = new StringBuilder(); while((s = in.readLine()) != null) sb.append(String.format("%3d| %s\n", lcount++, s)); return sb.toString(); } finally { in.close(); } } catch(IOException ex) { throw new RuntimeException(ex); } } Scrivere un file di testo BufferedWriter PrintWriter READ public static void write(String fname, String body) { BufferedWriter out; try { out = new BufferedWriter(new FileWriter(fname)); // oppure: PrintWriter out = new PrintWriter(fname); try { out.write(body); } finally { out.close(); } } catch(IOException ex) { throw new RuntimeException(ex); } } IO Binario DataInputStream DataInputStream in = new DataInputStream( new BufferedInputStream( new FileInputStream(fin))); DataOutputStream DataOutputStream in = new DataOutputStream( new BufferedOutputStream( new FileOutputStream(fin))); RandomAccessFile RandomAccessFile rf = new RandomAccessFile(fin, "rw"); E poi vene NIO (New Input Output) e il mistero si infittisce… Canali e Buffer Channel buffer File FileInputStream FileOutputStream RandomAccessFile Assignment Assignment J01 Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi Assignment C01 Equivalente (con le dovute differenze) di J01 Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi