Classi e Oggetti
Indice
• Classi, oggetti, metodi
• Documentazione e API
• Oggetti e riferimenti
Tipi e variabili
• Ogni valore nel linguaggio ha un tipo
• Ogni variabile deve essere dichiarata ed
associata ad un tipo:
String greeting = "Hello, World!";
PrintStream printer = System.out;
int luckyNumber = 13;
• Le variabili
 Memorizzano valori
 Possono essere utilizzate per rappresentare i valori
che memorizzano
Operatore di assegnamento
• =
• Modifica il valore delle variabili
int luckyNumber = 13;
luckyNumber = 12;
Variabili non inizializzate
• Sono un errore:
int luckyNumber;
System.out.println(luckyNumber);
// ERROR - uninitialized variable
Domanda
1. L’espressione 12 = 12 è sensata?
Risposta
1. No, il lato sinistro deve essere una variabile
(o più in generale, denotare una locazione)
Classi e oggetti
• Oggetto: una entità manipolabile all’interno
di un programma (mediante i suoi metodi)
• Ogni oggetto appartiene (è generato da) una
classe. Ad esempio System.out appartiene
alla classe PrintStream
Metodi
• Metodo: codice che permette di accedere ai
dati di un oggetto
• I dati (lo stato) di un oggetto sono accessibili
solo attraverso i metodi dell’oggetto
• Classe: definisce un insieme di oggetti con
lo stesso comportamento
• La classe definisce i metodi dei suoi oggetti
• La classe fornisce costruttori per creare
oggetti
Continua…
Metodi
• Interfaccia pubblica: specifica quali sono i
metodi invocabili sugli oggetti della classe
String greeting = "Hello";
greeting.println()// Errore:
greeting.length() // OK
• println non è parte dell’interfaccia
pubblica della classe string
Due oggetti di tipo String
Metodi della classe String
• length: conta il numero di caratteri della
stringa
String greeting = "Hello, World!";
int n = greeting.length(); // n = 13
Continua…
Metodi della classe String
• toUpperCase: crea un altro oggetto di tipo
String che contiene i caratteri della stringa
originaria, ma convertiti in maiuscolo
String fiume = "Mississippi";
String ucFiume = fiume.toUpperCase();
// ucFiume = "MISSISSIPPI"
Continua…
Metodi della classe String
• L’invocazione di un metodo su un oggetto è
legale solo se il metodo è parte
dell’interfaccia pubblica della classe a cui
l’oggetto appartiene
System.out.length(); // ERRORE
Domande
2. Quale è la sequenza di istruzioni per
calcolare la lunghezza della stringa
“Arcobaleno”?
3. Quale è la sequenza di istruzioni per
stampare la versione uppercase della
stringa "Hello, World!"?
4. È legale l’invocazione fiume.println()?
Perché o perché no?
Risposte
2.
“Arcobaleno".length()
3.
System.out.println(“Hello World”.toUpperCase());
4. Non è legale: la variabile fiume ha tipo
String e la classe String non definisce
il metodo il metodo println
Parametri espliciti e impliciti
• Un parametro (esplicito) rappresenta un dato
di input per il metodo
• Non tutti i metodi hanno parametri (espliciti)
System.out.println(greeting)
greeting.length() // no parametri espliciti
• Tutti i metodi hanno un parametro implicito:
l’oggetto su cui il metodo viene invocato
System.out.println(greeting)
Continua…
Parametri espliciti e impliciti
“Hello, World” è un parametro passato al
metodo println
Parametri espliciti e impliciti
• Il metodo replace esegue una operazione di
ricerca e modifica
fiume.replace("issipp", "our")
// restituisce la nuova stringa ("Missouri")
• Questa chiamata ha:
 Un parametro implicito: "Mississippi"
 Due parametri espliciti: "issipp" e "our"
• Restituisce la stringa "Missouri"
Continua…
Parametri espliciti e impliciti
Definizione di metodi
• La definizione di un metodo specifica solo i
parametri espliciti con i loro (ed il tipo del
risultato)
• Il tipo del parametro implicito è la classe in di
cui la definizione di metodo fa parte
Continua…
Definizione di metodi
• Esempio: la classe String definisce
public int length()
// return type: int
// nessun parametro
public String replace(String target, String replacement)
// return type: String;
// due parametri di tipo String
Definizione di metodi
• I metodi che non hanno valori risultato sono
dichiarati void
public void println(String output) // classe PrintStream
• Overloading:
 Un nome di metodi si può usare in più definizione
 Se le definizioni sono nella stessa classe diciamo che
il nome è overloaded
 Le versioni di un metodo overloaded devono avere
parametri diversi
public void println(String output)
public void println(int output)
Domande
5.
Quale è il risultato della chiamata
fiume.replace("p", "s")?
6.
Quale è il risultato della chiamata
greeting.replace("World","Dave").length()
7.
Come è definito il metodo toUpperCase
nella classe String?
Risposte
5.
"Missississi"
6.
12
7.
public String toUpperCase(),
ovvero senza parametri e con tipo risultato
String.
Tipi aritmetici e booleani
• Interi: short, int, long
13
• Virgola mobile: float, double
1.3
0.00013
• Booleani: true, false
• Non sono oggetti: sono tipi primitivi
Oggetti e forme Geometriche
• Java ha una ricca libreria di classi per
descrivere forme geometriche
• Oggetti di tipo Rectangle descrivono forme
rettangolari
Rectangle
• Un oggetto di tipo Rectangle contiene un
insieme di valori che rappresentano e
descrivono una forma rettangolare
• Tre oggetti, ciascuno con i suoi dati che
definiscono il proprio stato
Costruttori
new Rectangle(5, 10, 20, 30)
•
Il costrutto new costruisce un nuovo oggetto
di tipo rettangolo
•
Usa i parametri (5, 10, 20, e 30) per
inizializzare I dati dell’oggetto
•
Restituisce un riferimento all’oggetto
•
Tipicamente il risultato viene assegnato ad
una variabile
Rectangle box = new Rectangle(5, 10, 20, 30);
Costruttori
• Come nel caso dei metodi, il nome del
costruttore può essere overloaded all’interno
della stessa classe per fornire diversi
modalità di creazione di oggetti
new Rectangle()
// costruisce un rettangolo con origine (0,0)
// larghezza 0, e altezza zero 0
Sintassi: new
new ClassName(parameters)
Esempio:
new Rectangle(5, 10, 20, 30)
new Rectangle()
Effetto nella chiamata ad un costrotture
Costruisce un nuovo oggetto, inizializzandone lo stato con i parametri, e
restituisce un riferimento all’oggetto costruito.
Domande
8.
Come si costruisce un quadrato con centro
(100, 100) e lato 20?
9.
Cosa stampa la seguente istruzione?
System.out.println(new Rectangle().getWidth());
Risposte
8.
9.
new Rectangle(90, 90, 20, 20)
0
Metodi e side-effects
• In molti casi l’effetto dell’invocazione di un
metodo è la modifica dello stato dell’oggetto
su cui il metodo è invocato (il parametro
implicito
box.translate(15, 25);
• Metodi con side-effects vengono detti
“mutators”
Metodi e side-effects
box.translate(15, 25);
Domande
10. Il metodo toUpperCase della classe string
String è un mutator?
11. Quale chiamata al metodo translate
dobbiamo effettuare per spostare il
rettangolo box in modo da posizionare il
suo angolo alto-sx alle coordinate (0, 0)?
Answers
10. No, non modifica la stringa originale,
restituisce una nuova stringa
uppercase letters
11. box.translate(-5, -10)
Implementing a Test Program
• Provide a new class
• Supply a main method
• Inside the main method, construct one or
more objects
• Apply methods to the objects
• Display the results of the method calls
Importing Packages
Don't forget to include appropriate packages:
 Java classes are grouped into packages
 Import library classes by specifying the
package and class name:
import java.awt.Rectangle;
 You don't need to import classes in the
java.lang package such as String and
System
Syntax 2.4: Importing a Class from
a Package
import packageName.ClassName;
Example:
import java.awt.Rectangle;
Purpose:
To import a class from a package for use in a program.
File MoveTester.java
01: import java.awt.Rectangle;
02:
03: public class MoveTester
04: {
05:
public static void main(String[] args)
06:
{
07:
Rectangle box = new Rectangle(5, 10, 20, 30);
08:
09:
// Move the rectangle
10:
box.translate(15, 25);
11:
12:
// Print information about the moved rectangle
13:
System.out.println("After moving, the top-left
corner is:");
14:
System.out.println(box.getX());
15:
System.out.println(box.getY());
16:
}
17: }
Self Check
20. The Random class is defined in the
java.util package. What do you need to
do in order to use that class in your
program?
21. Why doesn't the MoveTester program
print the width and height of the rectangle?
Answers
20. Add the statement
import java.util.Random; at the top of
your program
21. Because the translate method doesn't
modify the shape of the rectangle
Documentazione sulle API
• API: Application Programming Interface
• Include la descrizione delle classi e dei relativi
metodi della (fornitissima!) libreria Java
• http://java.sun.com/j2se/1.5/docs/api/index.html
• http://java.sun.com/j2se/1.6/docs/api/index.html
Documentazione sulle API
La API della classe Rectangle
Javadoc Method Summary
Documentazione del metodo translate
Self Check
22. Look at the API documentation of the
String class. Which method would you
use to obtain the string "hello, world!"
from the string "Hello, World!"?
23. In the API documentation of the String
class, look at the description of the trim
method. What is the result of applying
trim to the string " Hello, Space ! "?
(Note the spaces in the string.)
Answers
22. toLowerCase
23. "Hello, Space !"–only the leading and
trailing spaces are trimmed
Oggetti e riferimenti
• Un riferimento è una astrazione del puntatore
ad un oggetto
• L’operatore new restituice un riferimento ad
un
nuovo oggetto
Rectangle box = new Rectangle();
• Diverse variabili di tipo oggetto possono
condividere lo stesso riferimento
Rectangle box = new Rectangle(5, 10, 20, 30);
Rectangle box2 = box;
box2.translate(15, 25);
Continua…
Riferimenti ad oggetti
• Il comportamento delle variabili varia rispetto
al loro tipo.
• In particolare le variabili di tipo primitivo si
comportano in modo diverso rispetto alle
variabili di tipo oggetto
Variabili di tipo primitivo
Contengono valori del loro tipo
Variabili di tipo oggetto
Contengono riferimenti ad oggetti, non oggetti
Assegnamento su tipi primitivi
•
int luckyNumber = 13;
int luckyNumber2 = luckyNumber;
luckyNumber2 = 12;
Due variabili, due valori distinti
Assegnamento su tipi oggetto
•
Rectangle box = new Rectangle(5, 10, 20, 30);
Rectangle box2 = box;
box2.translate(15, 25);
Continua…
Assegnamento su tipi oggetto
Due variabili, stesso
riferimento
Self Check
24. What is the effect of the assignment
greeting2 = greeting?
25. After calling greeting2.toUpperCase(),
what are the contents of greeting and
greeting2?
Answers
24. Now greeting and greeting2 both refer
to the same String object.
25. Both variables still refer to the same string,
and the string has not been modified.
Recall that the toUpperCase method
constructs a new string that contains
uppercase characters, leaving the original
string unchanged.