Capitolo 7
Programmazione
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 istanza
 Metodo di classe
 Servizio fornito da una classe che non è associato a un particolare
oggetto
String t = String.valueOf(n);
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 istanza
 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;
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 conversione
public class Conversion
// equivalenze per la conversione
private 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 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 © 2004 - The McGraw-Hill Companies srl
Implementazione della conversione
Il modificatore
classi
possono
utilizzare
Modifier
public public
indicatindica
es ot che
her altre
classes
can
use t he
met hod
questo metodo
Il modificatore static indica che questo metodo è un
Modifier
stclasse
at ic indicat es t he met hod is a class met hod
metodo di
public static double fahrenheitToCelsius(double f) {
return (f - 32) / 1.8;
}
Si
noti che
il metodo
contiene
unat
attributo
Observe
t here
is no non
reference
in tun
heriferimento
met hod t oaan
t ribut ediof
un oggetto Conversion implicito (ossia, manca la parola chiave
an implicit Conversion object (i.e., a "t his" object ). This absence
"this"). Questa assenza è una caratteristica tipica dei metodi di
is a class
hod requirement
. Class
met hods aare
classe,
che met
vengono
invocati senza
far riferimento
uninvoked
particolare
oggetto
wit hout respect t o any part icular object
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - 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 © 2004 - 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 © 2004 - 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
double
double
double
miles = Conversion.kilometersToMiles(kilometers);
gallons = Conversion.litersToGallons(liters);
ounces = Conversion.gramsToOunces(grams);
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
3.0
4.0
5.0
kilometers = 1.242742384474668 miles
liters = 0.7925161570744452 gallons
grams = 0.14109584779832166 ounces
hectares = 12.355269141746666 acres
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Utilizzo preferito
della conversione
Copyright © 2004 - The McGraw-Hill Companies srl
Parte di java.text
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
3.0
4.0
5.0
kilometers = 2,00 km
liters = 0,79 gallons
grams = 0,14 ounces
hectares = 12.36 acres
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
Dimostrazione del passaggio di parametri
per valore
Copyright © 2004 - The McGraw-Hill Companies srl
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
Dimostrazione del passaggio di parametri
per valore
Copyright © 2004 - The McGraw-Hill Companies srl
multiply() non
cambia il
parametro effettivo
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Demo.java
double sum = add(a, b);
Init
ial values
paramet
I valori
iniziali of
deiformal
parametri
formaliers
derivano
dai tparametri
come from
he act ualeffettivi
paramet ers
public static double add(double x, double y) {
double result = x + y
return result;
}
main()
add()
a
8.0
b
sum
product
x
8.0
11.0
y
11.0
19.0
-
result
19.0
-
-
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Demo.java
double multiply = multiply(a, b);
Init
ial values
paramet
I valori
iniziali of
deiformal
parametri
formaliers
derivano
dai tparametri
come from
he act ualeffettivi
paramet ers
public static double multiply(double x, double y) {
x = x + y
return x;
}
main()
multiply()
a
8.0
b
11.0
sum
19.0
product
88.0
-
x
88.0
8.0
y
11.0
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - 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 © 2004 - The McGraw-Hill Companies srl
Esecuzione 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.java
public static void main(String[] args){
Point p = new Point(10, 10);
System.out.println(p);
f(p);
main()
Point
p
y: 10
x: 10
f()
v
java.awt.Point[x=10,y=10]
Met
hod main()'s
variable
p
La variabile
p del
metodo
and
met hod
formal
main()
e ilf()'s
parametro
paramet
er vdel
have
t he same
formale
metodo
f()
hanno
loisstesso
valore,
value,
which
a reference
to
che
è un riferimento
an object
represent inga un
oggetto
locat che
ion (1rappresenta
0, 10)
la posizione (10,10)
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
PassingReferences.java
public static void f(Point v) {
v = new Point(0, 0);
}
main()
Point
p
y: 10
x: 10
f()
Point
v
y:
0
x:
0
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - 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);
main()
Point
p
y: 10
x: 10
g()
System.out.println(p);
g(p);
v
java.awt.Point[x=10,y=10]
java.awt.Point[x=10,y=10]
Met
hod main()'s
variable
p
La variabile
p del
metodo
and
met hod
formal
main()
e ilg()'s
parametro
paramet
er vdel
have
t he same
formale
metodo
f()
hanno
loisstesso
valore,
value,
which
a reference
to
che
è un riferimento
an object
represent inga un
oggetto
locat che
ion (1rappresenta
0, 10)
la posizione (10,10)
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
PassingReferences.java
public static void g(Point v) {
v.setLocation(0, 0);
}
main()
Point
p
y:
y: 10
0
x:
x: 10
0
g()
v
Met
hod main()'s
variable
p
La variabile
p del
metodo
and
met hod
formal
main()
e ilg()'s
parametro
paramet
er vdel
have
t he same
formale
metodo
f()
hanno
loisstesso
valore,
value,
which
a reference
to
che
è un riferimento
an object
represent inga un
oggetto
locat che
ion (1rappresenta
0, 10)
la posizione (10,10)
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - 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);
main()
Point
p
y: 0
System.out.println(p);
g(p);
System.out.println(p);
java.awt.Point[x=10,y=10]
java.awt.Point[x=10,y=10]
java.awt.Point[x=0,y=0]
x: 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
// Triple(): default constructor
public Triple() {
this(0, 0, 0);
}
The new Triple object (t he t his object ) is const ruct ed
Il nuovo oggetto Triple (l'oggetto this) viene
by
invoking invocando
t he Triple const
ruct or expect
ing tche
hreesiint
costruito
il costruttore
Triple
values
astre
act valori
ual paramet
ers parametri effettivi
aspetta
int come
public Triple() {
int a = 0;
int b = 0;
int c = 0;
this(a, b, c);
}
Illegal
t his() invocat
A t his() invocat ion
Invocazione
this()ion.
illegale.
Un'invocazione
deve
essere
must
begin it s st this()
at ement
body
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 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 © 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);
System.out.println(q);
//
//
//
//
versione stringa di
oggetto referenziato da p
versione stringa di
oggetto referenziato da q
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Implementazione di toString() per
Triple.java
Copyright © 2004 - The McGraw-Hill Companies srl
public
int
int
int
String toString(){
a = getValue(1);
b = getValue(2);
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
Implementazione di clone() per
Triple.java
Copyright © 2004 - The McGraw-Hill Companies srl
public
int
int
int
String clone() {
a = getValue(1);
b = getValue(2);
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
Implementazione di equals() per
Triple.java
Copyright © 2004 - The McGraw-Hill Companies srl
public boolean equals(Object v)
if (v instanceof Triple)
int a1 = getValue(1);
int b1 = getValue(2);
int c1 = getValue(3);
Triple
int a2
int b2
int c2
t
=
=
=
Non può essere
uguale a meno che
sia un Triple
= (Triple) v;
t.getValue(1);
t.getValue(2);
t.getValue(3);
return (a1 == a2) && (b1 == b2) && (c1 == c2);
}
else
return false;
}
}
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);
Triple
e
x1: 4
x2: 6
x3: 10
Triple
f
x1: 4
x2: 6
x3: 11
Triple
g
x1: 4
x2: 6
x3: 10
Triple
h
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);
Triple
e
x1: 4
x2: 6
x3: 10
Triple
f
x1: 4
x2: 6
x3: 11
Triple
g
x1: 4
x2: 6
x3: 10
Triple
h
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);
Triple
e
x1: 4
x2: 6
x3: 10
Triple
f
x1: 4
x2: 6
x3: 11
Triple
g
x1: 4
x2: 6
x3: 10
Triple
h
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 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 © 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
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 © 2004 - The McGraw-Hill Companies srl
Consentito, ma sconsigliato
public void g() {
{
int j = 1;
System.out.println(j);
}
{
int j = 10;
// definisce j
// stampa 1
// 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
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 © 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);
}