Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla...

45
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

Transcript of Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla...

Page 1: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 2: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 3: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 4: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 5: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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;

Page 6: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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;}

Page 7: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 8: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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;

}

Page 9: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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;

}}

Page 10: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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);

Page 11: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 12: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 13: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 14: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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);

}}

Page 15: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 16: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 17: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 18: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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);

}}

Page 19: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 20: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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)

Page 21: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 22: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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)

Page 23: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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)

Page 24: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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]

Page 25: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 26: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 27: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 28: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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);

}

Page 29: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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()

Page 30: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 31: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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]

Page 32: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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!

Page 33: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 34: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 35: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 36: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 37: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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()

Page 38: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 39: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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);

}}

Page 40: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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 '@'}

}

Page 41: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 42: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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

Page 43: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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));

}

Page 44: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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;

}

Page 45: Capitolo 7 Programmazione con metodi e classi Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004.

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); }