UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica...

56
UNIVERSITA’ DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti di Informatica a.a. 2007/2008

Transcript of UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica...

Page 1: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

JavaProf. Michele Amoretti

Fondamenti di Informaticaa.a. 2007/2008

Page 2: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Sommario

• Caratteristiche fondamentali del linguaggio Java

• Download e installazione di Java SDK e di Eclipse

• Nozioni di base sulla scrittura di codice Java• Tipi primitivi, assegnazione, cast, incremento, decremento• Controllo di flusso• Classi e oggetti• Categorie di variabili• Stringhe• I/O• Array• Ereditarietà• Polimorfismo

Page 3: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Caratteristiche fondamentali del linguaggio Java

Sviluppato negli anni ’90 da Sun MicroSystems.

• È orientato agli oggetti.

• È multi-piattaforma.

Nasce dall’esigenza di svincolare il software applicativo dall’hardware e dal sistema operativo. È molto usato per sviluppare:• Sistemi orientati al Web• Graphical User Interface (GUI)• Software per sistemi mobili (telefoni cellulari, PDA)

I tool necessari per scrivere programmi Java sono gratuiti.

Page 4: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Java Development Kit (JDK)

Il codice sorgente di un programma Java può essere scritto con un qualsiasi editor di testi, e come quasi tutti i linguaggi di alto livello è indipendente dalla macchina e dal sistema operativo.

Deve essere poi tradotto (con il compilatore javac) in un codice ottimizzato chiamato bytecode, che come il codice Java è indipendente dalla macchina e dal sistema operativo.

javac e altri strumenti per lo sviluppatore (jar, javadoc, ecc.) fanno parte del JDK.

Tutorial di base per lo sviluppatore: http://java.sun.com/docs/books/tutorial/

Page 5: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Java Runtime Environment (JRE)

Per eseguire programmi Java, è necessario installare JRE, che comprende:

1) Java Virtual Machine (JVM)Macchina software che esegue il bytecode.

2) Java Class LibraryCollezione di classi già pronte (e compilate), che offrono strutture dati e funzioni di base, molto utili al programmatore.

JDK include JRE ed è scaricabile da: http://java.sun.com

- Java SE (Standard Edition) v1.6 - Java EE (Enterprise Edition) v1.5 - Java ME (Mobile Edition) diverse versioni a seconda del tipo di device

Page 6: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Download e installazione di Java JDK e JRE

Andare alla seguente pagina:

http://java.sun.com/javase/downloads/

Scaricare:

JDK 6 Update 3 (clickare sul bottone DOWNLOAD)

Nella pagina seguente selezionare:

Windows Offline Installation, Multi-language

Il file da scaricare ed eseguire è: jdk-6u3-windows-i586-p.exe

Alla fine si avranno Java SDK e JRE in C:\Programmi\Java\

Page 7: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Download e installazione di Java JDK e JRE

Potrebbe essere necessario definire la variabile d’ambiente JAVA_HOME e aggiornare la variabile d’ambiente Path.

In Windows XP:

Risorse del computer Visualizza informazioni sul sistema

Avanzate Variabili d’ambiente

JAVA_HOME = C:\Programmi\Java\jdk1.6.0

In Path aggiungere %JAVA_HOME%\bin; %JAVA_HOME%\lib;

Page 8: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Ciclo di vita di un programma Java

La JVM non interpreta il bytecode (sarebbe poco efficiente), ma utilizza un compilatore interno, chiamato JIT (Just In Time), che genera codice eseguibile dalla macchina fisica ogni volta che nuovo bytecode viene caricato.

Il codice generato dal compilatore JIT è più lento di un codice macchina generato da un linguaggio come il C++, ma ha prestazioni ragionevoli.

Page 9: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Portabilità di un programma Java

La portabilità è il principale vantaggio dell’utilizzo di Java.

Portabilità significa:

Page 10: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Compilazione di un sorgente Java

• Tutti i sorgenti sono messi nella stessa directory ed hanno estensione ‘.java’.

• Se un file si chiama X.java, allora contiene una classe pubblica che si chiama X.

• Per compilare, si usa il comando:javac <nome_del_file_compreso_.java>

• Partendo da X.java, viene generato il bytecode X.class.

• Per eseguire il bytecode, si usa il comando:java <nome_del_file_senza_estensione>

• Se il bytecode è X.class, si scrive java X

Page 11: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

L’ambiente di sviluppo Eclipse

Con una comoda interfaccia grafica, permette di scrivere codice Java, e poi compilarlo ed eseguirlo con un semplice click del mouse.

www.eclipse.org

L’installazione è semplice: basta scaricarlo e scompattarlo.

http://www.eclipse.org/downloads/

Eclipse Classic - Windows (140 MB)

Il file si chiama eclipse-SDK-3.3.1-win32.zip

Potete scompattarlo in C:\Programmi\eclipse\

Page 12: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Nozioni di base sulla scrittura di codice Java

Ciascuna istruzione deve terminare con ; ad eccezione di quelle per il controllo di flusso e delle definizioni dei metodi.

Le { } aprono e chiudono blocchi di istruzioni all’interno di• metodi• iterazioni• decisioni

Singole righe di commento devono essere precedute da //Blocchi di righe di commento devono stare tra /* e */I commenti vengono ignorati dal compilatore che crea il bytecode

Per rendere più leggibile il sorgente, indentare in modo opportuno con il tasto TAB:

for (int i = 0; i < 10; i++)accumulator.add(i);

Page 13: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Nozioni di base sulla scrittura di codice Java

Se per un programma che stiamo scrivendo dobbiamo definire N nuove classi, scriviamo il codice di ciascuna classe in un file .java distinto.

Ciascun file deve cominciare con l’istruzione

package nome.del.package; // è un nome che identifica un gruppo di classi

In tutto avremo N+1 file, includendo quello della classe che contiene il metodo main(). Tale classe (detta classe principale) in genere ha il nome del programma. E’ la JVM a istanziare la classe principale.

Se una classe A usa altre classi che non stanno nello stesso package di A, all’inizio del file A.java dobbiamo scrivere l’istruzione

import package.della.classe.NomeClasse;

per ciascuna classe usata da A.

Page 14: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Nozioni di base sulla scrittura di codice Java

Convenzioni stilistiche:

• I nomi delle classi devono cominciare sempre con la lettera maiuscola.

• I nomi delle variabili, degli oggetti, dei metodi devono cominciare sempre con la lettera minuscola.

• Nei nomi composti, ciascuna parola interna deve cominciare con la lettera maiuscola.

Es. SlotMachine firstSlotMachine = new SlotMachine();firstSlotMachine.setCash(3);boolean win = firstSlotMachine.play();

Page 15: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Primo esempio - HelloWorld

package first.example;

import java.lang.String;

public class HelloWorld {

/** * This program prints a message in the standard output */

public static void main(String[] args) {String message = "Hello, World!";

System.out.println(message);}

}

HelloWorld.java

Page 16: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Tipi primitivi

int – tipo intero da 4 byte

byte – tipo intero da 1 byte

short – tipo intero da 2 byte

long – tipo intero da 8 byte

double – tipo in virgola mobile da 8 byte (±10308 e 15 cifre decimali)

float – tipo in virgola mobile da 4 byte (±1038 e 7 cifre decimali)

char – tipo che rappresenta caratteri Unicode (1 byte)

boolean – tipo per i due valori logici true e false

Page 17: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Assegnazione, incremento e decremento

L’operatore = è detto operatore di assegnazione (o assegnamento). Alla sua sinistra ci deve essere il nome di una variabile, mentre alla destra ci può essere un singolo valore o un’espressione.L’operatore imposta la variabile al valore dato.

items = 12;

Forme equivalenti per l’incremento/decremento di 1:

items = items + 1; items = items – 1;items++; items--;items += 1; items -= 1;

Per incrementare/decrementare di una quantità generica x:

items = items + x; items = items – x;items += x; items -= x;

Page 18: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Cast di tipi

In Java è lecito assegnare un valore intero a una variabile in virgola mobile:

int dollars = 100;double balance = dollars; // va bene

Non è possibile fare il contrario:

double balance = 13.75;int dollars = balance; // errore

Per risolvere questo problema, occorre usare un “cast” (forzatura):

int dollars = (int) balance;

Il cast si usa anche tra oggetti compatibili!

Page 19: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Altri operatori

Moltiplicazione: *Divisione: /

Occhio alla precedenza degli operatori! (a+b)/c è diverso da a+b/c

Uguaglianza: ==Disuguaglianza: !=

if (a == b)System.out.println(“a equals b”);

Confronto tra espressioni booleane: &&, ||, !

if ( (a > b) && (b> c) )System.out.println(“a > c”);

Confronto bitwise: &, |, ^, ~

Page 20: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Flusso di controllo

Decisioni

if (<condizione>)<istruzione> o {blocco di istruzioni}

else<istruzione> o {blocco di istruzioni}

if (<condizione1>)<istruzione> o {blocco di istruzioni}

else if (<condizione2>)<istruzione> o {blocco di istruzioni}

…else if (<condizioneN>)

<istruzione> o {blocco di istruzioni}else

<istruzione> o {blocco di istruzioni}

Es.

if (a < 10) a += 10;else a –= 10;

if (a < 10) a += 10;else if ((a > 10) && (a < 20)) a –= 10;else a –= 20;

Page 21: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Flusso di controllo

Decisioni

switch (<char> o <int>){

case valore1:<sequenza di istruzioni>break;

case valore2:<sequenza di istruzioni>break;

..default:

<sequenza di istruzioni>break;

}

Es.

switch (digit) { case 1:

System.out.print(“one”);break;

case 2: System.out.print(“two”);break;

… case 10:

System.out.print(“ten”);break;

default: System.out.print(“error”);break;

}

Page 22: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Flusso di controllo

Iterazioni

while (<condizione>)<istruzione> o {blocco di istruzioni}

do <istruzione> o {blocco di istruzioni}while (<condizione>);

for (<inizializzazione>; <condizione>; <aggiornamento>)<istruzione> o {blocco di istruzioni}

Es.

for (int i = 0; i < 20; i++)

System.out.println(i);

Page 23: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Flusso di controllo

try e catch()

E’ possibile associare un metodo a una o più “eccezioni”, cioè classi che vengono istanziate quando si verifica qualcosa di sbagliato all’interno del metodo.

Es.public void read(String filename)

throws IOException{ .. }

Per invocare questo tipo di metodi bisogna usare il costrutto

try { <invocazione del metodo> }catch(<eccezione>) { <gestione dell’eccezione> }

Page 24: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Flusso di controllo

try e catch()

Es.

String fileName = “pippo.txt”;Parser parser = new Parser();

try {parser.read(fileName);

}catch(IOException ioe) {

ioe.printStackTrace();}

Page 25: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Classi e oggetti

Un nuovo oggetto si istanzia con il comando new:

Car myCar = new Car();

Una classe può definire un metodo costruttore (sempre public), o anche più di uno, per la sua inizializzazione:

public class Car {private String model;

public Car(String model) { this.model = model; }}

In tal caso l’oggetto deve essere istanziato con i paramatri necessari:

Car myCar = new Car(“Fiat Duna”); //

Page 26: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Classi e oggetti

Per la precisione, la variabile myCar è un riferimento all’oggetto che è stato istanziato (e che occupa memoria fisica). La seguente istruzione:

Car yourCar = myCar;

Non crea una copia dell’oggetto a cui myCar fa riferimento! L’oggetto è sempre uno solo, solo che ora ci sono due variabili che vi fanno riferimento!

Page 27: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Classi e oggetti

Se non uso il comando new ma scrivo semplicemente: Car myCar;il compilatore segnala errore:The local variable myCar may not have been initialized

A volte, anziché usare new o assegnare alla variabile un riferimento valido, si dichiara esplicitamente la variabile null, ad esempio perché l’oggetto a cui il riferimento deve puntare viene istanziato all’interno di un successivo blocco nel contesto di una operazione di controllo di flusso.

Car myCar = null;if (carType.equals(“sport”)) {

myCar = new SportCar();….

}else if (carType.equals(“suv”))

myCar = new SuvCar();myCar.run();…

La dichiarazione va fuori dai blocchi, altrimenti la variabile risulta visibile solo all’interno del blocco in cui viene fatta!

È il concetto di SCOPE di una variabile.Vale per tutti i tipi di variabile!

Page 28: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Classi e oggetti

Un metodo può restituire (return) un risultato di un qualche tipo:

public int add(int a, int b) {return a+b;

}

Se la signature indica che il metodo non restituisce alcun risultato (void), il corpo del metodo non include alcun comando return.

public void printMessage(String message) {System.out.println(message);

}

Eccezione: il metodo costruttore, quando c’è! Non restituisce nulla ma non deve avere la parola void nella signature.

Page 29: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Classi e oggetti

Variabili membro e metodi di una classe possono essere:

public – possono essere usati dall’esterno rispetto alla classe che li definisce

private – possono essere utilizzati solo all’interno della classe stessa

protected – possono essere utilizzati solo all’interno della classe stessa oppure all’interno di classi derivate (vedi ereditarietà)

Page 30: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Secondo esempio - Architect

package second.example;

public class Rectangle {private int width = 0;private int height = 0;

public Rectangle(int w, int h) {width = w; height = h;

}

public int area() {return width*height;

}

public int perimeter() {return 2*width + 2*height;

}}

Rectangle.java

Page 31: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Secondo esempio - Architect

package second.example;

import second.example.Rectangle;

public class Architect {

public static void main(String[] args) {// Creates two rectanglesRectangle r1 = new Rectangle(5, 7);Rectangle r2 = new Rectangle(4, 8);// Compute their areasint area1 = r1.area();int area2 = r2.area();// Print their valuesSystem.out.println("Area del rettangolo 1: " + area1);System.out.println("Area del rettangolo 2: " + area2);

}}

Architect.java

Page 32: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Categorie di variabili

1. Campi di esemplare (variabili membro)2. Variabili locali3. Variabili parametro

I campi di esemplare appartengono agli oggetti e ciascun oggetto ha le proprie copie di ogni campo esemplare definito nella classe. Per un dato oggetto, le sue copie dei campi di esemplare cessano di esistere (in memoria) quando non c’è più nemmeno un metodo che sta utilizzando l’oggetto.

Le variabili locali e le variabili parametro appartengono a un metodo in esecuzione: non esistono più quando un metodo termina la propria esecuzione.

Page 33: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Categorie di variabili

public class BankAccount {private double balance;

public BankAccount(double initialBalance) {balance = initialBalance;

}

public void deposit(double amount) {double newBalance = balance + amount;balance = newBalance;

}}

La JVM ha al suo interno un “raccoglitore di spazzatura” (garbage collector) che ogni tanto (a istanti impredicibili) elimina tutti gli oggetti non più utilizzati.E’ comodo per il programmatore che non deve fare pulizia da solo, ma preclude l’uso di Java nelle applicazioni real-time!

campo di esemplare

variabili parametro

variabile locale

Page 34: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Il modificatore static

Potremmo tradurre il termine static con "condiviso da tutte le istanze della classe", oppure "della classe". Per quanto detto, un membro statico ha la caratteristica di poter essere utilizzato mediante una particolare sintassi del tipo:

NomeClasse.nomeMembro

in luogo di:

nomeOggetto.nomeMembro

Anche senza istanziare la classe, l’utilizzo di un membro statico, provoca il caricamento in memoria della classe contenente il membro in questione.

Page 35: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Il modificatore static

Una variabile statica, essendo condivisa da tutte le istanze della classe, assume lo stesso valore per ogni oggetto di una classe.

public class ClasseDiEsempio { public static int a = 0; }

public class ClasseDiEsempioPrincipale {

public static void main (String args[]) { System.out.println("a = “ + ClasseDiEsempio.a); ClasseDiEsempio ogg1 = new ClasseDiEsempio(); ClasseDiEsempio ogg2 = new ClasseDiEsempio(); ogg2.a=20; System.out.println("ogg1.a = " + ogg1.a); System.out.println("ogg2.a = " + ogg2.a); } }

Output:a = 0ogg1.a = 20ogg2.a = 20

Page 36: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Il modificatore static

Un esempio di metodo statico, è il metodo sqrt() della classe Math, che viene chiamato tramite la sintassi:

Math.sqrt(numero)

Math, è quindi il nome della classe e non il nome di un’istanza di quella classe. La ragione per cui la classe Math dichiara tutti i suoi metodi statici è facilmente comprensibile. Non ha senso istanziare oggetti di tipo matematica, che come si sa, è unica.

Page 37: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Documentazione

La documentazione online sulla Java Class Library si trova al seguente indirizzo: http://java.sun.com/javase/6/docs/api/

C’è anche una versione scaricabile per consultazione offline!http://java.sun.com/javase/downloads/ Java SE 6 Documentation

Page 38: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Stringhe

Una stringa è una sequenza di caratteri. Le stringhe sono esemplari della classe String, che è definita nella Java Class Library.

Page 39: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Stringhe

Esempi d’uso:

String greetings = “Hello”; // creazione

String message = greetings + “ Michele!” // concatenazione

String part = greeting.substring(0,4); // part è “Hell”

if (part.equals(“Hell”)) // confronto…

if (greetings.contains(part)) // altro tipo di confronto…

int length = greetings.length(); // misura della lunghezza

char c = greetings.charAt(4); // c è ‘o’

Page 40: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

I/O

Per stampare un messaggio nella “console” si usa l’istruzione

System.out.print(massage);

Dove message è di tipo String ma può essere una concatenazione di stringhe e numeri (il cast è sottinteso).

int b = 4;System.out.print(“Il valore di b è ” + b + “.”);// nella console si legge: Il valore di b è 4.

Per stampare un messaggio e andare a capo, si usa:

System.out.println(massage);

Page 41: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

I/O

Per leggere dati in ingresso dall’utente (introdotti da “console”) bisogna costruire un oggetto di tipo Scanner:

Scanner in = new Scanner(System.in);

E poi usare i metodi opportuni, a seconda del tipo di dato che si deve leggere:

System.out.print(“Enter quantity: ”);int quantity = in.nextInt();

System.out.print(“Enter price: ”);double price = in.nextDouble();

System.out.println(“Enter city: ”);String city = in.next();

Page 42: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

I/O

Per leggere un file di testo:

FileReader reader = null;try {

reader = new FileReader("input.txt");} catch (FileNotFoundException e) {

e.printStackTrace();}

Scanner in = new Scanner(reader);while (in.hasNextLine()) {

String line = in.nextLine(); // legge una rigaSystem.out.println(line); // e la stampa a video

}in.close();

Page 43: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

I/O

Per scrivere in un file di testo:

PrintWriter out = null;try {

out = new PrintWriter("output.txt");} catch (FileNotFoundException e) {

e.printStackTrace();}out.println("Hello, World!");out.println(29.95);out.close();

Page 44: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Array

Due modi per costruire un array:

1) NomeTipo[] nomeArray = new NomeTipo[lunghezza];

Es. int[] a = new int[10];

2) NomeTipo[] nomeArray = {elenco elementi}

Es. int[] a = {1, 3, 5, 7};

Nel primo caso l’array viene creato in memoria ma è vuoto! O meglio, i suoi elementi sono null.

Nel secondo caso l’array viene creato in memoria e i suoi elementi sono inizializzati.

Page 45: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Array

Es.

public class ArrayManipulator {

public static void main(String[] args) {for (int i = 0; i < args.length; i++) { System.out.println(args[i]);}

}}

Eseguendo: java ArrayManipulator Hello World!

L’output su schermo è:

HelloWorld!

Page 46: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Ereditarietà

Se si deve realizzare una nuova classe ed è già disponibile una classe che rappresenta un concetto più generale, la nuova classe può essere derivata dalla classe esistente (superclasse), di cui eredita attributi e metodi.

public class NuovaClasse extends Superclasse {nuovi campi di esemplarenuovi metodi

}

Non esiste l’ereditarietà multipla! NuovaClasse può estendere solo una classe esistente.

All’interno della classe derivata, per fare riferimento ai campi e ai metodi della superclasse, si usa il comando super come se fosse una istanza della superclasse.

super.metodoDellaSuperclasse();

Page 47: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Ereditarietà

Note sulle conversioni tra classi imparentate

SavingsAccount estende la classe BankAccount, rispetto alla quale ha in più il metodo addInterest().

SavingsAccount collegeFund = new SavingsAccount(10);BankAccount anAccount = collegeFund;

Essendo anAccount dichiarato di tipo BankAccount, non è possibile invocare su di esso il metodo addInterest(), anche se anAccount è una copia di collegeFund che è un riferimento a oggetto di tipo SavingsAccount.

Page 48: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Ereditarietà

Note sulle conversioni tra classi imparentate

Per copiare un riferimento di superclasse in un riferimento di sottoclasse, bisogna forzare (cast).

Nell’esempio di prima, la variabile anAccount è di tipo BankAccount ma sappiamo che è un riferimento a oggetto di tipo SavingsAccount. Per cui possiamo fare:

SavingsAccount anotherCollegeFund = (SavingsAccount) anAccount;

Prima di fare un cast di questo tipo, è bene verificare che abbia senso:

SavingsAccount anotherCollegeFund = null;if (anAccount instanceof SavingsAccount)

anotherCollegeFund = (SavingsAccount) anAccount;

Page 49: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Ereditarietà

Una classe dichiarata abstract deve essere per forza estesa da un’altra classe.

Se un metodo è dichiarato abstract, non può essere usato. Solo le classi che estendendo la prima ne implementano tale metodo, lo rendono disponibile.

Es.

public abstract class NomeClasse { // non istanziabilepublic void metodo1() { … } // non utilizzabile public void metodo2() { …}private int metodo3() { …}

}

Page 50: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Ereditarietà

Per aggirare il limite sull’ereditarietà multipla, si usano le interfacce. Una interfaccia è una classe senza variabili membro, senza costruttore e i cui metodi sono solo dichiarati (e sono tutti public, è sottinteso).

public interface Shape {double getArea();

}

public interface Colored {String getColor();

} public class ColoredCircle implements Shape, Colored {double radium = 0;String color = null;public ColoredCircle(double radium, String color) { this.radium = radium; this.color = color;}public double getArea() {

return Math.PI*radium*radium; }public String getColor() { return color; }

}

Page 51: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Ereditarietà

Non è possibile istanziare un oggetto da una interface. Se Circle è una interfaccia, la seguente istruzione è sbagliata:

Circle myCircle = new Circle();

Ma è possibile scrivere così:

Circle myCircle = new ColoredCircle(“blue”, 10);

Questo ha importanti implicazioni (in relazione al polimorfismo..)!

Come visto, una classe può implementare più interfacce.Più classi possono implementare una stessa interfaccia.

Una classe può estendere una (sola) altra classe e contemporaneamente implementare una o più interfacce.

Page 52: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Ereditarietà

Una interfaccia può estendere un’altra interfaccia (solo una!).

HttpServiceRequest è una interfaccia che estende l’interfaccia ServiceRequest.

HttpServiceRequestImpl è una classe che implementa l’interfaccia HttpServiceRequest.

HttpServiceRequestWrapper è una classe che estende la classe ServiceRequestWrapper, che implementa l’interfaccia ServiceRequest.

Page 53: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Polimorfismo

In Java, una interfaccia dichiara un insieme di metodi (tutti pubblici, anche se non viene dichiarato esplicitamente) e le loro signature. Diversamente da una classe, un’interfaccia non fornisce alcuna implementazione.

Una classe che è dichiarata come implementazione di una interfaccia deve implementare tutti i metodi di quest’ultima.

Quando più classi realizzano la medesima interfaccia, ciascuna classe può realizzare a modo suo i metodi propri dell’interfaccia.

Una classe che estende un’altra classe può ridefinirne i metodi. Anche questo è polimorfismo.

Page 54: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Polimorfismo

public interface Measurable {double getMeasure();

}

public class BankAccount implements Measurable {private double balance;public double getMeasure() {

return balance;}

}

public class Coin implements Measurable {private double value;public double getMeasure() {

return value;}

}

Page 55: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Polimorfismo

È stato detto che è possibile dichiarare una variabile di tipo interfaccia, purchè faccia riferimento a un oggetto di una classe che implementa tale interfaccia:

Measurable meas = new BankAccount();

Questa possibilità offerta da Java ha un motivo profondo: rende possibile definire metodi che accettano parametri di tipo interfaccia, e questi metodi accettano istanze di tutte le classi che implementano tale interfaccia!

public void register(Measurable meas) { .. } // metodo di una qualche classe

Quando invochiamo register() possiamo passargli un oggetto di tipo BankAccount, oppure di tipo Coin! Se modifichiamo qualcosa di queste due classi (ad es. il nome) non dobbiamo modificare il metodo register().

Page 56: UNIVERSITA DEGLI STUDI DI PARMA Corso di Laurea in Ingegneria Gestionale Fondamenti di Informatica Java Prof. M. Amoretti Java Prof. Michele Amoretti Fondamenti.

UNIVERSITA’ DEGLI STUDI DI PARMACorso di Laurea in Ingegneria Gestionale Fondamenti di Informatica

Java Prof. M. Amoretti

Polimorfismo

Una classe che estende un’altra classe può ridefinirne i metodi. Anche questo è polimorfismo.

Es.

public class Animale {public void interroga() {

System.out.println(“Grunt”); }}

public class Ghepardo extends Animale {public void interroga() {

System.out.println(“Groar!”); }

public void salta() { System.out.println(“hop!”); }}