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.