APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 ·...

48
APPUNTI SU JAVA Angelo Di Iorio Università di Bologna

Transcript of APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 ·...

Page 1: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

APPUNTI SU JAVA Angelo Di Iorio Università di Bologna

Page 2: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Java per questo laboratorio • Guardiamo alcune strutture dati disponibili in Java ma

soprattutto usiamo Java per implementare strutture dati e algoritmi

• Non è un corso completo su OOP e Java ma guardiamo le parti più rilevanti per i nostri scopi

• Useremo Eclipse ma non è obbligatorio •  http://www.eclipse.org/ide/ •  Archivio con tutte le release:

•  http://archive.eclipse.org/eclipse/downloads/

Page 3: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Java: un po’ di storia •  Java è un linguaggio di programmazione general-purpose,

object-oriented, multi-thread e platform-independent

•  Ideato da James Gosling nel 1995

• Sintassi derivata dal C e C++, ma con meno funzionalità e controllo “a basso livello”

• Originariamente linguaggio proprietario (di Sun), rilasciato nel 2007 con licenza GPL

• Resta uno dei linguaggi più usati

Page 4: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Per curiosità: TIOBE Index

https://www.tiobe.com/tiobe-index/ https://www.tiobe.com/tiobe-index/programming-languages-definition/

Page 5: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Java Development Process

http://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html

Page 6: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Java Virtual Machine

http://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html

Page 7: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Esercizio 0 • Scrivere un programma Java che stampa a video il

messaggio “Hello World!”.

Page 8: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Hello World

public class HelloWorld {

public static void main(String[] args) { System.out.println("Hello World!"); }

}

Page 9: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Organizzazione file e packages •  Java usa un approccio semplice ma funzionale per

organizzare i file e le classi di un programma: ogni classe è memorizzata in un file separato, con lo stesso nome ed estensione .java

• Classi e definizioni (es. enumerazioni) diverse possono essere raggruppate in packages

•  I nomi dei package sono solitamente in minuscolo e tutti i file appartenenti allo stesso package sono nella stessa directory e contengono l’istruzione

package nomePackage; •  I package sono organizzati in subpackage con una

struttura gerarchica

Page 10: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Import e accesso ai package •  Per fare riferimento ad un nome in un package si usa un nome

qualificato tramite l’operatore . System.out.println(“Hello World”)

java.util.Scanner(…)

•  Per includere classi da un altro package si usa la keyword import import java.util.Scanner; ...

Scanner input = new Scanner(System.in);

•  Si può importante un intero package se ci si aspetta di usare molte classi (più dispendioso)

import java.util.*;

Page 11: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Operatori, costrutti di base e tipi nativi • Non guardiamo in dettaglio gli operatori e i comandi

principali di Java, la cui sintassi è simile al C: •  operatori aritmetici, booleani, di contronto, etc. •  variabili e assegnamenti •  comandi if, else, while, for, etc.

• Un costrutto che useremo spesso (for-each):

Integer[] integers = {1, 4, 5, 7, 10}; for (Integer i : integers) {

System.out.println(i);}

Page 12: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Tipi in Java •  Java è un linguaggio fortemente tipato (strongly typed): ogni

espressione ha un tipo, che il compilatore usa per controllare la correttezza delle operazioni eseguite •  molti errori sui tipi sono “anticipati” nell’IDE

•  Due tipi principali: •  tipi primitivi •  tipi classe: associati ad una classe (stesso nome) descrivono come

memorizzare gli oggetti di quella classe e i loro metodi

•  Garbage Collector: la deallocazione di memoria in Java non è gestita dal programmatore in Java ma se ne occupa direttamente il supporto run-time che libera la memoria non utilizzata

Page 13: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Tipi nativi •  int: numero intero (a 32 bit) •  byte, short, long: numero intero di diversa lunghezza (8,

16 o 64 bit) •  boolean: valori true/false •  char: carattere •  float, double: numeri decimali di diversa precisione

Page 14: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Object-Oriented Programming •  Java è nativamente object-oriented

•  La programmazione orientata agli oggetti (OOP) è un paradigma di programmazione pensato per rendere più semplice lo sviluppo, l’evoluzione, la manutenzione e il testing del software

•  Un paradigma diverso da quello imperativo (occorre ragionare

un modo diverso!)

•  Consente di scrivere le stesse applicazioni ma in modo diverso •  Fondamentale per scrivere applicazioni grandi ma utile anche

per applicazioni piccole •  Favorisce il riuso

Page 15: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

• Un programma è visto come un insieme di oggetti che: •  contengono valori e le funzioni che possono modificare tali valori •  interagiscono tra loro

• Tre concetti fondamentali: •  Incapsulamento •  Ereditarietà •  Polimorfismo (ne parleremo poco anche se è un aspetto chiave

della programmazione a oggetti)

Object-Oriented Programming

Page 16: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Terminologia: classi e oggetti •  Le classi sono tipi di dato definiti dal programmatore • Una classe è composta da:

•  attributi (o campi): variabili o costanti che definiscono le caratteristiche degli oggetti di quel tipo

•  metodi: procedure che operano sugli attributi

• Un oggetto è un’istanza di una classe

•  Le classi consentono di: •  definire il comportamento del dato •  nascondere l'implementazione (incapsulamento)

Page 17: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Incapsulamento • Un oggetto contiene una parte pubblica e una parte

privata (anche una parte protected, ci torneremo a breve) •  la parte pubblica è visibile da chi usa l’oggetto •  la parte privata no

•  La parte privata è incapsulata (information hiding)

• Si realizza così una netta separazione tra interfaccia e implementazione

• Se si modifica la parte privata lasciando inalterata quella pubblica si può continuare ad interagire con la parte pubblica •  L’interfaccia dell’oggetto non cambia

Page 18: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Visibilità •  I metodi (e in generali le classi e le variabili di istanza)

possono avere diversi livelli di accesso, definiti con apposite keyword prima del nome del metodo: •  public: il metodo può essere invocato da tutte le altre classi

•  protected: il metodo può essere invocato da: •  Sottoclassi della classe corrente (ereditarietà) •  Classi appartenenti allo stesso package

•  private: il metodo può essere invocato solo da altri metodi della stessa classe; né sottoclassi né altri classi possono accedervi

Page 19: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Costruttore •  Il costruttore è un particolare metodo di una classe che

viene invocato al momento della creazione di un oggetto e permette di inizializzare lo stato interno dell’oggetto

•  In Java il costruttore deve avere lo stesso nome della classe e non bisogna specificare il tipo di ritorno (ritorna un riferimento all’oggetto appena creato)

• Possono esistere più costruttori con lo stesso nome ma con un diverso numero di parametri

•  Il costrutto new permette di istanziare un nuovo oggetto invocando il costruttore di una classe

Page 20: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Esercizio 1 • Creare una classe Java per descrivere un rettangolo, che ha una larghezza e un’altezza (per semplicità, valori interi) e del quale si vuole poter calcolare perimetro e area.

•  Istanziare due rettangoli r1 ed r2 che hanno, rispettivamente, le seguenti dimensioni: •  r1: larghezza: 20 e altezza: 50 •  r2: larghezza: 80 e altezza: 10

Page 21: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Esempio rettangolo (in Java) public class Rettangolo {

private int l; private int h;

public Rettangolo(int l, int h) { this.h = h; this.l = l; }

int getPerimetro(){ return (this.l+this.h)*2; }

public int getArea(){ return (this.l*this.h); }

}

Page 22: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Tornando sui tipi: wrapper e automatic (un)boxing • Ci sono diverse strutture dati ed algoritmi in Java che

lavorano su oggetti e non su tipi primitivi •  Java definisce una classe wrapper per ogni tipo primitivo • Fornisce inoltre meccanismi automatici di conversioni tra i

due

Page 23: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Altri tipi comuni: String •  Java ha una classe built-in per lavorare sulle stringhe: String •  String è usato quindi per memorizzare sequenze di caratteri,

eventualmente vuote • Sulle istanze di String è possibile fare operazioni comuni:

•  concatenazione: operatore + •  calcolo della lunghezza: .length() •  estrazione di sottostringhe: substring(…) •  etc.

• API e dettagli: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

Page 24: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Enumeration

•  Le enumerazioni sono usate per rappresentare scelte tra un set finito di valori

public enum Seme{ CUORI, QUADRI, PICCHE, FIORI };

• Una enumerazione è una classe, quindi un tipo

•  I valori elencati sono nomi di oggetti pubblici (e statici) Seme s = Seme.CUORI;

• Possono essere quindi passati come parametro

Page 25: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Esercizio 1b •  Implementare in Java una classe Persona, caratterizzata

da: nome, cognome e nazionalità, dove nazionalità può essere scelta tra ‘Italiana’, ‘EU’, ‘ExtraEU’.

•  La classe implementa due metodi •  costruttore •  stampaDati(): stampa le informazioni:

esempio: “Mi chiamo Mario Rossi e ho cittadinanza EU”

Page 26: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Vettori in Java • Un array (vettore) è un contenitore:

•  di dimensione fissa •  di elementi dello stesso tipo

• Per inizializzare un vettore in Java: Integer[] integers = new Integer[10]; Integer[] integers = {10, 2, 4, 5, 6};

String[] words = {“cane”, “gatto”, “tacchino”};

•  La classe java.util.Arrays (statica) espone metodi per accedere e manipolare vettori

Page 27: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Ereditarietà •  Java (in generale OOP) permette di definire una classe a

partire da un’altra, dalla quale si ereditano campi e metodi (protected e public) •  La classe che eredita si chiama classe derivata, o sottoclasse, o

classe figlio •  La classe di partenza è la classe base, o classe padre, o superclasse

•  La modifica di un metodo della classe padre si chiama overriding

•  Java usa la keyword extends per indicare ereditarietà

•  La keyword super permette di accedere alla classe padre

•  Java non supporta ereditarietà multipla

Page 28: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Esercizio 2 • Scrivere una classe Java per gestire un conto corrente, su

cui sono possibili le seguenti operazioni: •  Apri conto corrente vuoto •  Apri conto corrente con X euro •  Versa X euro nel conto •  Preleva X euro dal conto •  Stampa un messaggio con il salto attuale

Vedi: http://diiorio.nws.cs.unibo.it/asd1819/java/

Page 29: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Esercizio 2 • Estendere la classe ContoCorrente per poter gestire

conti con valute diverse • Nuove proprietà e metodi:

•  valuta: campo privato che può assumere valori “euro”, “dollar”, “pound”

•  Costruttore ContoCorrenteConValuta(Integer s, Valuta v): prende in input il saldo iniziale la valuta

•  mostraSaldo(): override del metodo precedente per stampare il saldo in una data valuta (es. “Nel c/c hai 100 euro”)

Page 30: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Object ed ereditarietà •  In Java ogni classe deriva dalla classe Object•  Object definisce alcuni metodi che sono quindi ereditati

da tutte le classi •  public String toString()•  public boolean equals(Object obj)•  public int hashCode()•  …

• Questi metodi sono troppo generici ed è utile ridefinirli in modo appropriato

• Attenzione alla signature del metodo: i tipi devono essere esattamente gli stessi

•  public boolean equals(Object obj){…}•  public boolean equals(Studente student){…}

Entrambi metodi di Studente

Page 31: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Metodo toString()•  Il metodo toString() non ha argomenti e restituisce tutte

le informazioni relative ad un oggetto in una stringa

• Viene invocato ogni volta che si “stampa” un oggetto

•  Il comportamento di default, ereditato da Object, produce un risultato poco utile e chiaro, per cui di solito se ne ridefinisce il comportamento (overriding)

Page 32: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Esercizio 2b • Sovrascrivere il metodo toString() della classe ContoCorrenteConValuta per stampare le stesse informazioni di mostraSaldo()

Page 33: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Interfacce • Uno dei punti chiave della programmazione OOP è la

separazione tra: •  Interfaccia di una classe: cosa una classe permette di fare e come

può essere utilizzata (quali sono i metodi e che signature hanno) •  Implementazione di una classe: come una classe funziona

internamente

• Conoscendo l’interfaccia di una classe è possibile invocarne i metodi senza conoscere la loro implementazione

•  Java permette di separare interfaccia e implementazione di una classe

•  In Java le interfacce sono entità a sé stanti che possono essere “usate” da diverse classi

Page 34: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Java Interface

public interface IShape {

//Calcola areapublic double getArea();

//Calcola perimetropublic double getPerimeter();

}

Page 35: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Java Interface • Un’interfaccia contiene le intestazione dei metodi pubblici • Può anche definire costanti pubbliche

• Può contenere anche i commenti per gli utilizzatori dell’interfaccia stessa (meglio includerli!)

• Si definisce con la keyword interface (al posto di class)

• Per convenzione il nome di un’interfaccia inizia con una lettera maiuscola (come per le classi)

Page 36: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Interfaccia •  Le interfacce contengono solo prototipi di metodi

• NON contengono nessuna implementazione

• Sono tipi di classi completamente astratte

• Una classe può implementare una interfaccia

• Si usa la keywork implements per indicare che una classe implementa un’interfaccia

• Una classe che implementa un’interfaccia DEVE implementare TUTTI i metodi dell’interfaccia

Page 37: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

public class Rectangle implements IShape { //variabili e costruttore omessi @Override public double getArea() {return s1 * s2;}

@Override public double getPerimeter() {return (s1 + s2) * 2;}…

public class Circle implements IShape { //variabili e costruttore omessi

@Overridepublic double getArea() {return r * r * 3.14;}

@Overridepublic double getPerimeter() {return 2 * 3.14 * r;}

Implementare un’interfaccia

Page 38: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Interfacce multiple • Una stessa interfaccia può essere implementata da più

classi

• Una classe in Java può estendere solo un’altra classe ma può implementare più interfacce

• Se classi diverse implementano la stessa interfaccia, allora rispetto all’interfaccia gli oggetti sono dello stesso tipo

• NOTA: se una classe implementa più interfacce che definiscono lo stesso metodo (esattamente, stessa signature e stessi parametri) non c’è conflitto

Page 39: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

public class Rectangle implements IShape, IColorable { //variabili e costruttore omessi @Override public double getArea() {return s1 * s2;}

@Override public double getPerimeter() {return (s1 + s2) * 2;}

@Override public Color getColor() { return this.c; }

@Override public void setColor(Color c) {this.c = c;}

Implementare più interfacce

Page 40: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Interfaccia come tipo • Un’interfaccia definisce un tipo

• E’ possibile quindi scrivere metodi che hanno uno o più parametri di tipo interfaccia

• Sarà poi possibile invocare questi metodi passandogli oggetti che implementano quell’interfaccia

• Anche oggetti di classi diverse!

Page 41: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

import java.util.Random;

public class GeometryDemoInterface {

private static void randomizeColor(IColorable s){

Random r = new Random();

Color nc = Color.values()[r.nextInt(Color.values().length - 1)];

s.setColor(nc);}

public static void main(String[] args) {

Rectangle rect1 = new Rectangle(2, 3);Circle circle1 = new Circle(5);

randomizeColor(rect1);randomizeColor(circle1);

}}

Interfaccia come tipo

OK se entrambe le classi implementano IColorable

Page 42: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Esercizio 4 •  Implementare le classi Java necessarie a modellare

questa situazione: •  Ogni animale fa un verso e ha un certo numero di zampe •  Il gatto ha 4 zampe e miagola •  Il cane ha 4 zampe e abbaia •  Il tacchino ha 2 zampe e goglotta

• Usare un’interfaccia che descrive le due operazioni: •  fai un verso ( getVerso() ) •  dimmi quante zampe hai ( getZampe() )

• NOTA: più indicato usare una classe astratta ma qui non ne parliamo

Page 43: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Interfaccia Comparable •  Java fornisce diverse interfacce predefinite implementate

da diverse classi (ad esempio per le strutture dati)

• Una molto utilizzata è Comparable usata per imporre un ordinamento tra gli oggetti della classe che la implementa

•  In realtà Comparable definisce un solo metodo: public int compareTo(Object o);

•  Le classi che lo implementano devono ritornare: •  numero negativo se l’oggetto su cui viene chiamato “precede” il

parametro o •  zero se l’oggetto su cui viene chiamato “è uguale” al parametro •  numero positivo se l’oggetto su cui viene chiamato “è

successivo” al parametro

Page 44: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Esempio libri public class Book implements Comparable {

private String title;private Integer pubYear;

// Costruttore e metodi setter/getter omessi

public int compareTo (Object o) {return 0;

}}

Page 45: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

import java.util.Arrays;

public class ComparablesDemo {

public static void main(String[] args) {

Book[] books = new Book[3];

books[0] = new Book("Harry Potter …", 1997);books[1] = new Book("The Lord of the Rings", 1954);books[2] = new Book("Don Quixote", 1605);

Arrays.sort(books);

for (Book b : books) {System.out.println(b);

}

}

}

Book [title=Harry Potter ..., pubYear=1997]Book [title=The Lord of the Rings, pubYear=1954]Book [title=Don Quixote, pubYear=1605]

Richiama compareTo() per fare i confronti

Page 46: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Metodo compareTo()public int compareTo(Object o) {

if ( (o != null) && (o instanceof Book)) {Book nb = (Book) o;

if (this.pubYear > nb.pubYear)return 1;

else if (this.pubYear < nb.pubYear)return -1;

elsereturn 0;

//return (this.pubYear.compareTo(nb.getPubYear()));

//return (this.title.compareTo(nb.getTitle()));

}return -1; // default se si confronta

//Book con null o altre classi}

}

Page 47: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Diversi ordinamenti

Book [title=Don Quixote, pubYear=1605]Book [title=The Lord of the Rings, pubYear=1954]Book [title=Harry Potter ..., pubYear=1997]

Book [title=Harry Potter ..., pubYear=1997]Book [title=Don Quixote, pubYear=1605]Book [title=The Lord of the Rings, pubYear=1954]

• Crescente per anno di pubblicazione

• Per titolo in ordine alfabetico

Page 48: APPUNTI SU JAVA - unibo.itdiiorio.nws.cs.unibo.it/asd1819/pdf/01-java-intro.pdf · 2019-03-07 · Java: un po’ di storia • Java è un linguaggio di programmazione general-purpose,

Altri aspetti di Java

• Non ne parliamo a lezione ma sono molto utili: •  Thread •  Eccezioni •  Javadoc

•  Basic I/O, Utilities, Logging, APIs, …

• Torneremo su: •  Java generics •  Java FX