UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Java
Prof. Michele Amoretti
Fondamenti di Informatica
a.a. 2007/2008
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Sommario
Java
•
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
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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/
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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 Library
Collezione 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
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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\
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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
%JAVA_HOME%\bin; %JAVA_HOME%\lib;
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Portabilità di un programma Java
La portabilità è il principale vantaggio dell’utilizzo di Java.
Portabilità significa:
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Compilazione di un sorgente Java
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
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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\
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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);
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
SlotMachine firstSlotMachine = new SlotMachine();
firstSlotMachine.setCash(3);
boolean win = firstSlotMachine.play();
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Primo esempio - HelloWorld
HelloWorld.java
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);
}
}
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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 – 1;
items--;
items -= 1;
Per incrementare/decrementare di una quantità generica x:
items = items + x;
items += x;
Java
items = items – x;
items -= x;
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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!
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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: &, |, ^, ~
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Flusso di controllo
Decisioni
Es.
if (<condizione>)
<istruzione> o {blocco di istruzioni}
else
<istruzione> o {blocco di istruzioni}
if (a < 10)
a += 10;
else
a –= 10;
if (<condizione1>)
<istruzione> o {blocco
else if (<condizione2>)
<istruzione> o {blocco
…
else if (<condizioneN>)
<istruzione> o {blocco
else
<istruzione> o {blocco
Java
di istruzioni}
di istruzioni}
di istruzioni}
if (a
a
else
a
else
a
< 10)
+= 10;
if ((a > 10) && (a < 20))
–= 10;
–= 20;
di istruzioni}
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Flusso di controllo
Java
Decisioni
Es.
switch (<char> o <int>)
{
case valore1:
<sequenza di istruzioni>
break;
case valore2:
<sequenza di istruzioni>
break;
..
default:
<sequenza di istruzioni>
break;
}
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;
}
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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);
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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> }
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Flusso di controllo
try e catch()
Es.
String fileName = “pippo.txt”;
Parser parser = new Parser();
try {
parser.read(fileName);
}
catch(IOException ioe) {
ioe.printStackTrace();
}
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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”);
Java
// 
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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!
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
La dichiarazione va fuori dai blocchi,
Car myCar = null;
altrimenti la variabile risulta visibile
if (carType.equals(“sport”)) {
solo all’interno del blocco in cui
myCar = new SportCar();
viene fatta!
….
Java
}
else if (carType.equals(“suv”))
myCar = new SuvCar();
myCar.run();
…
È il concetto di SCOPE di una variabile.
Vale per tutti i tipi di variabile!
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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à)
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Secondo esempio - Architect
Fondamenti di Informatica
Rectangle.java
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;
}
}
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Secondo esempio - Architect
Fondamenti di Informatica
Architect.java
package second.example;
import second.example.Rectangle;
public class Architect {
public static void main(String[] args) {
// Creates two rectangles
Rectangle r1 = new Rectangle(5, 7);
Rectangle r2 = new Rectangle(4, 8);
// Compute their areas
int area1 = r1.area();
int area2 = r2.area();
// Print their values
System.out.println("Area del rettangolo 1: " + area1);
System.out.println("Area del rettangolo 2: " + area2);
}
}
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Categorie di variabili
1.
2.
3.
Campi di esemplare (variabili membro)
Variabili locali
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Categorie di variabili
public class BankAccount {
private double balance;
campo di esemplare
public BankAccount(double initialBalance) {
balance = initialBalance;
variabili parametro
}
}
public void deposit(double amount) {
double newBalance = balance + amount;
balance = newBalance;
}
variabile locale
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!
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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 {
}
Java
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=0
ogg1.a = 20
ogg2.a = 20
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Stringhe
Una stringa è una sequenza di caratteri. Le stringhe sono esemplari
della classe String, che è definita nella Java Class Library.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Stringhe
Esempi d’uso:
String greetings = “Hello”;
// creazione
String message = greetings + “ Michele!”
String part = greeting.substring(0,4);
if (part.equals(“Hell”))
…
// part è “Hell”
// confronto
if (greetings.contains(part))
…
// altro tipo di confronto
int length = greetings.length();
char c = greetings.charAt(4);
Java
// concatenazione
// misura della lunghezza
// c è ‘o’
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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);
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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();
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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();
System.out.println(line);
}
in.close();
Java
// legge una riga
// e la stampa a video
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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();
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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 è:
Hello
World!
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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 esemplare
nuovi 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();
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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;
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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 istanziabile
public void metodo1() { … } // non utilizzabile
public void metodo2() {
…
}
private int metodo3() {
…
}
}
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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();
}
Java
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; }
}
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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.
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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;
}
}
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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().
Java
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
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!”);
}
}
Java
Prof. M. Amoretti