12 novembre 2015 (aggiornata!)

Transcript

12 novembre 2015 (aggiornata!)
Laboratorio di Programmazione
Lezione 4
Cristian Del Fabbro
Prossima lezione
Mercoledì 25 novembre ore 8:30-11:00
Classe
Una classe descrive degli oggetti tramite:
Proprietà/variabili/campi (dati/caratteristiche, es. colore di
una mela, ...).
Metodi/funzioni (le ”azioni”, es. sbuccia, raccogli, …).
Una istanza di una classe è la “concretizzazione” della
classe stessa (quindi è un oggetto).
Le mele
public class Apple {
private int color; // 0 = green, 1 = yellow, 2 = red
public String getColorName() {
// code
}
public void setColor(int c) {
// code
}
}
// mela_verde è una istanza della classe Mela
Apple mela_verde = new Apple();
// mela_rossa è una istanza della classe Mela
Apple mela_rossa = new Apple();
Costruttore
Un costruttore serve per inizializzare le variabili. Si
possono passare dei parametri al costruttore.
●
In Java il costruttore deve avere lo stesso nome della
classe e non deve essere specificato nessun tipo di
ritorno per il metodo.
●
Possono esistere più costruttori con lo stesso nome,
ma con numero e tipo di parametri differenti. Se non
viene specificato nessun costruttore, viene creato uno
“di default” da Java.
●
Viene invocato dalla “new” un attimo dopo avere
allocato (“creato”) tutte le variabili e un attimo primo di
terminare la “new”.
●
Esempio
public class Apple {
private int color; // 0 = green, 1 = yellow, 2 = red
public Apple() {
color = 0;
}
public Apple(int c) {
color = c;
}
Apple mela_verde = new Apple();
// default: 0
Apple mela_rossa = new Apple(2);
// colore rosso!
Distruttore
• Nella programmazione orientata agli oggetti, un distruttore
è un particolare metodo che viene invocato automaticamente
quando l'oggetto viene distrutto.
È stato concepito per liberare o finalizzare le risorse
utilizzate dall'oggetto. Ad esempio per chiudere dei file o
terminare una comunicazione.
●
In Java il distruttore si implementa mediante il metodo
finalize. Es.
●
public void finalize(){
System.out.println ("L'oggetto è stato distrutto");
}
●
Il distruttore viene attivato dal Garbage collector
Esempio
public class Apple {
private int color; // 0 = green, 1 = yellow, 2 = red
public Apple() {
color = 0;
}
public Apple(int c) {
color = c;
}
public void finalize() {
System.out.println("Destroyed a " + getColorName() + " apple!");
}
Apple class!
public class Apple {
private int color; // 0 = green, 1 = yellow, 2 = red
public Apple() {
color = 0;
}
public Apple(int c) {
color = c;
}
public void finalize() {
System.out.println("Destroyed a " + getColorName() + " apple!");
}
public String getColorName() {
switch (color) {
case 0 : return "red";
case 1 : return "green";
case 2 : return "yellow";
}
return "undefined";
}
public void setColor(int c) {
color = c;
}
}
Esempio
public static void main(String[] args) {
Apple green = new Apple();
Apple red = new Apple(2);
green.setColor(1);
System.out.println("We have " + green.getColorName()
+ " and " + red.getColorName() + " apples");
}
Parametri e variabili membro?
Premesso che in Apple esiste il campo “color”,
supponiamo di modificare la definizion di:
public void setColor(int c)
Nel seguente modo:
public void setColor(int color)
A questo punto, il corpo di color diventa:
public void setColor(int color) {
color = color;
}
… c'è qualche problema?
Soluzione: this
“this” è una parola riservata e rappresenta l'oggetto
stesso. E' invocata sempre in modo implicito ma può
essere invocata in modo esplicito:
public void setColor(int color) {
this.color = color;
}
color è il parametro di setColor
this.color è la variabile di (una istanza) di Apple
Pile e code
Proviamo a trasformare le pile e le code della lezione
precedente in classi/oggetti?
rule 1: avoid static
Da questo momento, la parola chiave “static” è bandita. E'
ammesso il suo uso solo per:
public static void main(String[] args)
Se usate “static” da qualche altra parte, probabilmente
state sbagliando qualcosa oppure si può scrivere meglio
in un altro modo.
N.B. Ovviamente ci sono un sacco di casi in cui static è
utile, ma sono dei casi che esulano da questo corso di
base.
rule 2: avoid public variables
Dichiarate tutte le variabili di una classe “private”. Le
variabili possono essere lette e modificate solo tramite
funzioni/procedure.
N.B. Non tutte le variabili necessitano di essere
lette/scritte al di fuori della classe.
rule 3: public methods
Dichiarare i metodi/funzioni/procedure come “public”.
N.B. alcuni metodi potrebbe essere più utili non averli
pubblici ma sono dei casi particolari (funzioni di
supporto).
Esercizi per casa
Definire la classe “Portafogli” con i metodi (e le opportune variabili):
●
addEuro per aggiungere un certo numero di euro al portafogli
addDollar per aggiunge un certo numero di euro (da convertire dai
dollari) al portafogli
●
●
removeEuro per rimuovere un certo numero di euro dal portafogli
removeDollar per rimuovere un certo numero di euro (da convertire
dai dollari) dal portafogli
●
●
●
balance per sapere il saldo
isBroken per sapere se siamo al verde (booleano: se il saldo è > 0)
Scrivere un programma che gestisce tre portafogli e fà un certo
numero di operazioni su ognuno
Esercizi per casa
Definire la classe “Secchio” che rappresenta un contenitore di acqua che può
contenere solo un certo numero di litri. Quando il secchio viene “costruito” si deve
passare un parametro che indica la capacità massima del secchio. All'inizio il
secchio è vuoto. Se si cerca di mettere più litri della capacità, l'eccedenza viene
persa. Scrivere i seguenti metodi:
●
riempi() che riempi il secchio fino all'orlo;
●
svuota() che svuota il secchio;
●
travasaIn(Secchio s) che svuota il contenuto del secchio dentro un altro secchio;
●
quanto() che restituisce il numero di litri contenuti nel secchio.
Scrivere un programma che utilizza un certo numero di secchi e che fà un po' di
operazioni sui secchi.