Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Metodi Metodo istanza Opera su un oggetto (vale a dire un'istanza della classe) String s = new String("Help every cow reach its " + "potential!"); int n = s.length(); Metodo di classe Servizio fornito da una classe che non è associato a un particolare oggetto String t = String.valueOf(n); Metodo istanza Metodo di classe
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Campi dati Variabile istanza e costanti istanza Attributo di un particolare oggetto Solitamente una variabile Point p = new Point(5, 5); int px = p.x; Variabile e costanti di classe Informazioni collettive che non sono specifiche per i singoli oggetti della classe Solitamente una costante Color favoriteColor = Color.MAGENTA; double favoriteNumber = MATH.PI - MATH.E; Variabile istanza Costanti di classe
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Attività - Conversion.java Supporta la conversione tra valori anglosassoni e metrici d degrees Fahrenheit = (d -32)/1.8 degrees Celsius 1 mile = kilometers 1 gallon = liters 1 ounce (avdp) = grams 1 acre = square miles = hectares
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Implementazione della conversione public class Conversion // equivalenze per la conversione private static final double KILOMETERS_PER_MILE = ; private static final double LITERS_PER_GALLON = ; private static final double GRAMS_PER_OUNCE = ; private static final double HECTARES_PER_ACRE = ;
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Implementazione della conversione // metodi di conversione della temperatura public static double fahrenheitToCelsius(double f) return (f - 32) / 1.8; } public static double celsiusToFahrenheit(double c) return 1.8 * c + 32; } // metodi di conversione della lunghezza public static double kilometersToMiles(double km) return km / KILOMETERS_PER_MILE; }
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Implementazione della conversione Il modificatore public indica che altre classi possono utilizzare questo metodo Il modificatore static indica che questo metodo è un metodo di classe Si noti che il metodo non contiene un riferimento a un attributo di un oggetto Conversion implicito (ossia, manca la parola chiave "this"). Questa assenza è una caratteristica tipica dei metodi di classe, che vengono invocati senza far riferimento a un particolare oggetto
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Implementazione della conversione // metodi di conversione della massa public static double litersToGallons(double liters) return liters / LITERS_PER_GALLON; } public static double gallonsToLiters(double gallons) return gallons * LITERS_PER_GALLON; } public static double gramsToOunces(double grams) return grams / GRAMS_PER_OUNCE; } public static double ouncesToGrams(double ounces) return ounces * GRAMS_PER_OUNCE; }
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Implementazione della conversione // metodi di conversione dell'area public static double hectaresToAcres(double hectares) return hectares / HECTARES_PER_ACRE; } public static double acresToHectares(double acres) return acres * HECTARES_PER_ACRE; }
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Utilizzo della conversione BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); System.out.print("Enter a length in kilometers: "); double kilometers = Double.parseDouble(stdin.readLine()); System.out.print("Enter a mass in liters: "); double liters = Double.parseDouble(stdin.readLine()); System.out.print("Enter a mass in grams: "); double grams = Double.parseDouble(stdin.readLine()); System.out.print("Enter an area in hectares: "); double hectares = Double.parseDouble(stdin.readLine()); double miles = Conversion.kilometersToMiles(kilometers); double gallons = Conversion.litersToGallons(liters); double ounces = Conversion.gramsToOunces(grams); double acres = Conversion.hectaresToAcres(hectares);
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Utilizzo della conversione System.out.println(kilometers + " kilometers = " + miles + " miles "); System.out.println(liters + " liters = " + gallons + " gallons"); System.out.println(grams + " grams = " + ounces + " ounces"); System.out.println(hectares + " hectares = " + acres + " acres"); 2.0 kilometers = miles 3.0 liters = gallons 4.0 grams = ounces 5.0 hectares = acres
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Utilizzo preferito della conversione NumberFormat style = NumberFormat.getNumberInstance(); style.setMaximumFractionDigits(2); style.setMinimumFractionDigits(2); System.out.println(kilometers + " kilometers = " + style.format(miles) + " miles "); System.out.println(liters + " liters = " + style.format(gallons) + " gallons"); System.out.println(grams + " grams = " + style.format(ounces) + " ounces"); System.out.println(hectares + " hectares = " + style.format(acres) + " acres"); 2.0 kilometers = 2,00 km 3.0 liters = 0,79 gallons 4.0 grams = 0,14 ounces 5.0 hectares = acres Parte di java.text
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Invocazioni dei metodi I parametri effettivi forniscono informazioni altrimenti non disponibili per un metodo Quando viene invocato un metodo Java riserva la memoria per quella particolare invocazione Viene chiamato il record di attivazione Il record di attivazione memorizza, tra le altre cose, i valori dei parametri formali I parametri formali inizializzati con i valori dei parametri effettivi Dopo l'inizializzazione, i parametri effettivi e i parametri formali sono indipendenti gli uni dagli altri Il flusso di controllo è trasferito temporaneamente a quel metodo
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Dimostrazione del passaggio di parametri per valore public class Demo public static double add(double x, double y) double result = x + y; return result; } public static double multiply(double x, double y) x = x * y; return x; } public static void main(String[] args) double a = 8, b = 11; double sum = add(a, b); System.out.println(a + " + " + b + " = " + sum); double product = multiply(a, b); System.out.println(a + " * " + b + " = " + product); }
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Dimostrazione del passaggio di parametri per valore multiply() non cambia il parametro effettivo
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Demo.java I valori iniziali dei parametri formali derivano dai parametri effettivi
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Demo.java I valori iniziali dei parametri formali derivano dai parametri effettivi
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl PassingReferences.java public class PassingReferences public static void f(Point v) v = new Point(0, 0); } public static void g(Point v) v.setLocation(0, 0); } public static void main(String[] args) Point p = new Point(10, 10); System.out.println(p); f(p); System.out.println(p); g(p); System.out.println(p); }
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Esecuzione di PassingReferences.java g() può cambiare gli attributi delloggetto a cui p fa riferimento
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl PassingReferences.java public static void main(String[] args){ Point p = new Point(10, 10); System.out.println(p); f(p); java.awt.Point[x=10,y=10 ] La variabile p del metodo main() e il parametro formale del metodo f() hanno lo stesso valore, che è un riferimento a un oggetto che rappresenta la posizione (10,10)
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl PassingReferences.java public static void f(Point v) { v = new Point(0, 0); }
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl PassingReferences.java public static void main(String[] args){ Point p = new Point(10, 10); System.out.println(p); f(p); System.out.println(p); g(p); java.awt.Point[x=10,y=10 ] La variabile p del metodo main() e il parametro formale del metodo f() hanno lo stesso valore, che è un riferimento a un oggetto che rappresenta la posizione (10,10)
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl PassingReferences.java public static void g(Point v) { v.setLocation(0, 0); } La variabile p del metodo main() e il parametro formale del metodo f() hanno lo stesso valore, che è un riferimento a un oggetto che rappresenta la posizione (10,10)
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl PassingReferences.java public static void main(String[] args){ Point p = new Point(10, 10); System.out.println(p); f(p); System.out.println(p); g(p); System.out.println(p); java.awt.Point[x=10,y=10 ] java.awt.Point[x=0,y=0]
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Attività - Triple.java Rappresenta gli oggetti con tre attributi interi public Triple() Costruisce un valore Triple predefinito che rappresenta tre zeri public Triple(int a, int b, int c) Costruisce una rappresentazione dei valori a, b e c public int getValue(int i) Restituisce l'iesimo elemento del Triple associato public void setValue(int i, int value) Imposta l'iesimo elemento del Triple associato sul valore
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Attività - Triple.java Rappresenta gli oggetti con tre attributi interi public String toString() Restituisce una rappresentazione di testo del Triple associato public Object clone() Restituisce un nuovo Triple la cui rappresentazione è la stessa del triple associato public boolean equals(Object v) Indica se v è equivalente al Triple associato Questi tre metodi sono prevalenze sui metodi ereditati
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Implementazione di Triple.java Il nuovo oggetto Triple (l'oggetto this) viene costruito invocando il costruttore Triple che si aspetta tre valori int come parametri effettivi Invocazione this() illegale. Un'invocazione this() deve essere all'inizio del corpo dell'istruzione
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Implementazione di Triple.java // Triple(): costruttore specifico public Triple(int a, int b, int c) setValue(1, a); setValue(2, b); setValue(3, c); } // Triple(): costruttore specifico - definizione alternativa public Triple(int a, int b, int c) this.setValue(1, a); this.setValue(2, b); this.setValue(3, c); }
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Implementazione di Triple.java La classe Triple è simile a ogni altra classe Java Automaticamente un'estensione della classe standard Object La classe Object specifica alcuni comportamenti di base comuni a tutti gli oggetti Questi comportamenti sono ereditati Tre dei metodi Object ereditati toString() clone() equals()
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Raccomandazione Le classi dovrebbero avere la prevalenza (fornire un'implementazione specifica per la classe) toString() clone() equals() In questo modo può essere fornito il comportamento previsto dal programmatore System.out.println(p); // versione stringa di // oggetto referenziato da p System.out.println(q); // versione stringa di // oggetto referenziato da q
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Implementazione di toString() per Triple.java public String toString(){ int a = getValue(1); int b = getValue(2); int c = getValue(3); return "Triple[" + a + ", " + b + ", " + c+ "]"); } Considerare Triple t1 = new Triple(10, 20, 30); System.out.println(t1); Triple t2 = new Triple(8, 88, 888); System.out.println(t2); Produce Triple[10, 20, 30] Triple[8, 88, 888]
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Implementazione di clone() per Triple.java public String clone() { int a = getValue(1); int b = getValue(2); int c = getValue(3); return new Triple(a, b, c); } Considerare Triple t1 = new Triple(9, 28, 29); Triple t2 = (Triple) t1.clone(); System.out.println("t1 = " + t1); System.out.println("t2 = " + t2); Produce Triple[9, 28, 29] Deve eseguire la conversione!
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Implementazione di equals() per Triple.java public boolean equals(Object v) if (v instanceof Triple) int a1 = getValue(1); int b1 = getValue(2); int c1 = getValue(3); Triple t = (Triple) v; int a2 = t.getValue(1); int b2 = t.getValue(2); int c2 = t.getValue(3); return (a1 == a2) && (b1 == b2) && (c1 == c2); } else return false; } Non può essere uguale a meno che sia un Triple Confronta gli attributi corrispondenti
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Triple.java - equals() Triple e = new Triple(4, 6, 10); Triple f = new Triple(4, 6, 11);, Triple g = new Triple(4, 6, 10); Triple h = new Triple(4, 5, 11); boolean flag1 = e.equals(f);
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Triple.java - equals() Triple e = new Triple(4, 6, 10); Triple f = new Triple(4, 6, 11);, Triple g = new Triple(4, 6, 10); Triple h = new Triple(4, 5, 11); boolean flag2 = e.equals(g);
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Triple.java - equals() Triple e = new Triple(4, 6, 10); Triple f = new Triple(4, 6, 11);, Triple g = new Triple(4, 6, 10); Triple h = new Triple(4, 5, 11); boolean flag3 = g.equals(h);
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Che cosa non va? class Scope { public static void f(int a) { int b = 1; // definizione locale System.out.println(a); // stampa 10 a = b; // aggiorna a System.out.println(a); // stampa 1 } public static void main(String[] args){ int i = 10; // definizione locale f(i); // invoca f() con i come parametro System.out.println(a); System.out.println(b); } Le variabili a e b non esistono nell'ambito del metodo main()
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Regole per blocchi e ambito Un blocco è un elenco di istruzioni nidificate all'interno di parentesi graffe Il corpo di un metodo è un blocco Un blocco può essere posto ovunque sia consentita un'istruzione Un blocco contenuto in un altro blocco è un blocco nidificato Un parametro formale deve essere definito all'inizio del corpo del metodo Una variabile locale può essere utilizzata solo in un'istruzione o nei blocchi nidificati che seguono la sua definizione Un nome di identificatore può essere riutilizzato finché i blocchi che contengono le dichiarazioni duplicate non sono nidificati l'uno nell'altro Il riutilizzo del nome all'interno di un metodo è consentito finché avviene in blocchi distinti
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Consentito class Scope2 { public static void main(String[] args){ int a = 10; f(a); System.out.println(a); } public static void f(int a) { System.out.println(a); a = 1; System.out.println(a); }
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Consentito, ma sconsigliato public void g() { { int j = 1; // definisce j System.out.println(j); // stampa 1 } { int j = 10; // definisce un j differente System.out.println(j); // stampa 10 } { char j = // definisce un j differente System.out.println(j); // stampa }
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Qual è l'output? for (int i = 0; i < 3; ++i) { int j = 0; ++j; System.out.println(j); } L'ambito della variabile j è il corpo del ciclo for j non è nell'ambito durante ++i j non è nell'ambito quando i < 3 viene valutato j viene ridefinito e reinizializzato ad ogni iterazione nel ciclo
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Overloading È stato visto spesso con gli operatori int i = ; double x = ; String s = "April " + "June"; Java supporta anche l'overloading dei metodi Diversi metodi possono avere lo stesso nome Utile quando occorre scrivere metodi che eseguono attività simili ma con elenchi di parametri diversi Il nome del metodo può subire l'overloading finché la sua firma è diversa dagli altri metodi della sua classe Differenza nei nomi, nei tipi, nel numero o nell'ordine dei parametri
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Consentito public static int min(int a, int b, int c) return Math.min(a, Math.min(b, c)); } public static int min(int a, int b, int c, int d) return Math.min(a, min(b, c, d)); }
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Consentito public static int power(int x, int n) int result = 1; for (int i = 1; i <= n; ++i) result *= x; } return result; } public static double power(double x, int n) double result = 1; for (int i = 1; i <= n; ++i) result *= x; } return result; }
Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl Qual è l'output? public static void f(int a, int b) { System.out.println(a + b); } public static void f(double a, double b) { System.out.println(a - b); } public static void main(String[] args){ int i = 19; double x = 54.0; f(i, x); }