Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla...
-
Upload
valeria-simonetti -
Category
Documents
-
view
219 -
download
1
Transcript of Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla...
Capitolo 7Programmazione
con metodi e classi
Lucidi relativi al volume:
Java – Guida alla programmazione James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - 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 © 2004 - 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 © 2004 - 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 = 1.609344 kilometers 1 gallon = 3.785411784 liters 1 ounce (avdp) = 28.349523125 grams 1 acre = 0.0015625 square miles = 0.40468564 hectares
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Implementazione della conversionepublic class Conversion
// equivalenze per la conversioneprivate static final double
KILOMETERS_PER_MILE = 1.609344;private static final double
LITERS_PER_GALLON = 3.785411784;private static final double
GRAMS_PER_OUNCE = 28.349523125;private static final double
HECTARES_PER_ACRE = 0.40468564;
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Implementazione della conversione// metodi di conversione della temperaturapublic 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 lunghezzapublic static double kilometersToMiles(double km)
return km / KILOMETERS_PER_MILE;}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Implementazione della conversione
public static double fahrenheitToCelsius(double f) { return (f - 32) / 1.8;}
Modifier public indicates other classes can use the method
Modifier static indicates the method is a class method
Observe there is no reference in the method to an attribute ofan implicit Conversion object (i.e., a "this" object). This absenceis a class method requirement. Class methods are invokedwithout respect to any particular object
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 © 2004 - The McGraw-Hill Companies srl
Implementazione della conversione// metodi di conversione della massapublic 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 © 2004 - The McGraw-Hill Companies srl
Implementazione della conversione// metodi di conversione dell'areapublic 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 © 2004 - The McGraw-Hill Companies srl
Utilizzo della conversioneBufferedReader 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 © 2004 - 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 = 1.242742384474668 miles3.0 liters = 0.7925161570744452 gallons4.0 grams = 0.14109584779832166 ounces5.0 hectares = 12.355269141746666 acres
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srlUtilizzo preferito della conversioneNumberFormat 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 km3.0 liters = 0,79 gallons4.0 grams = 0,14 ounces5.0 hectares = 12.36 acres
Parte di java.text
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - 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 © 2004 - The McGraw-Hill Companies srlDimostrazione del passaggio di parametri per valorepublic 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 © 2004 - The McGraw-Hill Companies srlDimostrazione del passaggio di parametri per valore
multiply() non cambia il parametro effettivo
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
8.0x
add()
11.0y
-result
8.0x
add()
11.0y
19.0result
Demo.java
8.0a
main()
11.0b
-sum
-product
double sum = add(a, b);
public static double add(double x, double y) {double result = x + yreturn result;
}
Initial values of formal parameterscome from the actual parameters
8.0a
main()
11.0b
19.0sum
-product
I valori iniziali dei parametri formali derivano dai parametri effettivi
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
8.0x
multiply()
11.0y
88.0x
multiply()
11.0y
8.0a
main()
11.0b
19.0sum
-product
8.0a
main()
11.0b
19.0sum
88.0product
Demo.java
double multiply = multiply(a, b);
public static double multiply(double x, double y) {x = x + yreturn x;
}
Initial values of formal parameterscome from the actual parametersI valori iniziali dei parametri formali derivano dai parametri effettivi
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
PassingReferences.javapublic 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 © 2004 - The McGraw-Hill Companies srlEsecuzione di PassingReferences.java
g() può cambiare gli attributi dell’oggetto a cui p fa riferimento
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
PassingReferences.javapublic static void main(String[] args){
Point p = new Point(10, 10);System.out.println(p);
f(p);
p
main()Point
x: 10y: 10p
main()Point
x: 10y: 10
v
f()
Method main()'s variable pand method f()'s formal
parameter v have the samevalue, which is a reference to
an object representinglocation (10, 10)
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 © 2004 - The McGraw-Hill Companies srl
PassingReferences.javapublic static void f(Point v) {
v = new Point(0, 0);}
p
main()Point
x: 10y: 10p
main()Point
x: 10y: 10
v
f()Point
x: 0y: 0
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
PassingReferences.javapublic static void main(String[] args){
Point p = new Point(10, 10);System.out.println(p);
f(p);
System.out.println(p);
g(p);
p
main()Point
x: 10y: 10
java.awt.Point[x=10,y=10]java.awt.Point[x=10,y=10]
p
main()Point
x: 10y: 10
v
g()
Method main()'s variable pand method g()'s formal
parameter v have the samevalue, which is a reference to
an object representinglocation (10, 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 © 2004 - The McGraw-Hill Companies srl
p
main()Point
x: 0y: 0p
main()Point
x: 0y: 0
v
g()
PassingReferences.javapublic static void g(Point v) {
v.setLocation(0, 0);}
p
main()Point
x: 10y: 10
v
g()
Method main()'s variable pand method g()'s formal
parameter v have the samevalue, which is a reference to
an object representinglocation (10, 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 © 2004 - The McGraw-Hill Companies srl
PassingReferences.javapublic 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);
p
main()Point
x: 0y: 0
java.awt.Point[x=10,y=10]java.awt.Point[x=10,y=10]java.awt.Point[x=0,y=0]
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - 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 © 2004 - 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 © 2004 - The McGraw-Hill Companies srl
Implementazione di Triple.java
public Triple() {int a = 0;int b = 0;int c = 0;this(a, b, c);
}
Illegal this() invocation. A this() invocationmust begin its statement body
// Triple(): default constructorpublic Triple() {
this(0, 0, 0);} The new Triple object (the this object) is constructed
by invoking the Triple constructor expecting three intvalues as actual parameters
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 © 2004 - The McGraw-Hill Companies srl
Implementazione di Triple.java
// Triple(): costruttore specificopublic Triple(int a, int b, int c)
setValue(1, a);setValue(2, b);setValue(3, c);
}
// Triple(): costruttore specifico - definizione alternativapublic 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 © 2004 - 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 © 2004 - 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 pSystem.out.println(q); // versione stringa di // oggetto referenziato da q
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srlImplementazione di toString() per Triple.javapublic 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 © 2004 - The McGraw-Hill Companies srlImplementazione di clone() per Triple.javapublic 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]Triple[9, 28, 29]
Deve eseguire la conversione!
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srlImplementazione di equals() per Triple.javapublic 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 © 2004 - 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);
eTriple
x1: 4
f
g
h
x2: 6 x3: 10
Triple
x1: 4 x2: 6 x3: 11
Triple
x1: 4 x2: 6 x3: 10
Triple
x1: 4 x2: 5 x3: 11
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - 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);
eTriple
x1: 4
f
g
h
x2: 6 x3: 10
Triple
x1: 4 x2: 6 x3: 11
Triple
x1: 4 x2: 6 x3: 10
Triple
x1: 4 x2: 5 x3: 11
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - 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);
eTriple
x1: 4
f
g
h
x2: 6 x3: 10
Triple
x1: 4 x2: 6 x3: 11
Triple
x1: 4 x2: 6 x3: 10
Triple
x1: 4 x2: 5 x3: 11
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Che cosa non va?class Scope {
public static void f(int a) {int b = 1; // definizione localeSystem.out.println(a); // stampa 10a = b; // aggiorna aSystem.out.println(a); // stampa 1
}
public static void main(String[] args){int i = 10; // definizione localef(i); // invoca f() con i come
parametroSystem.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 © 2004 - 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 © 2004 - The McGraw-Hill Companies srl
Consentitoclass 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 © 2004 - The McGraw-Hill Companies srl
Consentito, ma sconsigliatopublic void g() {
{int j = 1; // definisce jSystem.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 © 2004 - 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 © 2004 - The McGraw-Hill Companies srl
Overloading È stato visto spesso con gli operatori
int i = 11 + 28;double x = 6.9 + 11.29;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 © 2004 - 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 © 2004 - The McGraw-Hill Companies srl
Consentitopublic 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 © 2004 - 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); }