Classi e oggetti in Java File - e-Learning

Software Architecture Lab
www.sal.disco.unimib.it
Programmazione con Java
Classi e istanze in Java
Definizione di classe in Java
• A meno che non si usino classi già scritte da altri, prima di poter creare un qualsiasi oggetto devo creare la sua rappresentazione: cioè la classe
• Si ricorda che un programma ad oggetti consiste di oggetti creati a partire da classi diverse che interagiscono fra loro
public class NomeClasse {
//Definizione Attributi di istanza o di classe
//Implementazione Costruttori
//Implementazione Metodi
}
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
2
1
Come descrivere al programmatore le classi?
• Esempio classe Punto:
• «Realizzare una classe che rappresenta un punto in uno spazio bidimensionale a cui attribuire nome Punto. Qualsiasi oggetto creato a partire dalla classe Punto è caratterizzato dall’avere un attributo con identificativo x e di tipo int (che rappresenta l’ascissa) e un altro attributo con identificativo y e di tipo int
(che rappresenta l’ordinata). Entrambi gli attributi hanno visibilità pubblica.»
Classi e istanze in Java
Software Architecture Lab
www.sal.disco.unimib.it
3
Rappresentazione in UML • La classe Punto in un diagramma delle classi di design è rappresentata come in figura
Punto
+
+
• Sintassi:
x: int
y: int
Modificatore_di_visibilità Identificatore_dell’attributo: tipo
Modificatore_di_visibilità:
+ indica public (appartenente all’interfaccia della classe)
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
4
2
Esempio: la classe Punto
Definizione di classe
Il nome della classe
public class Punto {
public int x;
public int y;
}
Definizione degli attributi di istanza
Modificatore di visibilità. public: appartiene all’interfaccia
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
5
Come si crea un oggetto?
NomeClasse nomeReference;
nomeReference = new NomeClasse();
nomeReference.comando();
nomeReference.attributo;
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
dichiara, non crea
crea
accesso all’interfaccia pubblica
6
3
Esempio: utilizzo della classe Punto
• Ogni attributo di istanza possiede un tipo!
Punto p1;
p1 = new Punto();
p1.x = 3;
p1.y = 4;
int valoreX = p1.x;
int valorey = p1.y;
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
7
Esempio
• Creare due punti e assegnare i valori per x e y 3 e 4 e 50 e 90. Stampare a video quale punto ha x maggiore
public class TestPunto1 {
public static void main(String a[]) {
Punto p1, p2;
p1 = new Punto();
p2 = new Punto();
p1.x = 3;
p1.y = 4;
p2.x = 50;
p2.y = 90;
if(p1.x >= p2.x) {
System.out.println(Il punto p1 ha x maggiore);
} else {
System.out.println(Il punto p2 ha x maggiore);
}
}
}
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
8
4
Esercizio: classe Rettangolo
• Rettangolo
– Creare una classe che rappresenta un rettangolo
Rettangolo
+
+
base: int
altezza: int
– Creare 2 istanze della classe assegnando valori per la base e l’altezza
– Calcolare l’area e il perimetro di entrambi indicando quale ha area e perimetro maggiore
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
9
Esercizio: classe Automobile
• Auto
– Creare una classe che rappresenta un’auto (proprietario, vel max e velocità corrente)
Automobile
+
+
+
proprietario: String
velocitaMax: int
velocitaCorrente: int
– Creare tre istanze della stessa assegnando i valori per gli attributi – Determinare se le due istanze create hanno lo stesso stato!
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
10
5
Oggetti e reference
• Variabili di tipo classe (tipo p1 o p2 dell’esempio precedente) sono molto differenti rispetto a variabili di tipo primitivo (come int o char)
Punto p1, p2;
p1 = new Punto();
p2 = new Punto();
int n, m;
n = 10;
m = n;
n = 9;
System.out.println(“n ” + n + “ m ” + m);
p1.x = 1;
p1.y = 2;
p2 = p1;
p2.x = 3;
p2.y = 4;
System.out.println(“p1 x: ” + p1.x + “ y: ” + p1.y);
System.out.println(“p2 x: ” + p2.x + “ y: ” + p2.y);
?
Classi e istanze in Java
Software Architecture Lab
www.sal.disco.unimib.it
11
L’operatore =
• Il risultato di un assegnamento tra reference: fa si che l’oggetto a sinistra dell’assegnamento sia referenziato anche dal reference a destra
1)
2)
p1
?
p2
?
Punto p1, p2;
p1
p1 = new Punto();
p2
3)
Software Architecture Lab
www.sal.disco.unimib.it
x
y
?
p1
x
y
p2
x
y
p2 = new Punto();
Classi e istanze in Java
12
6
L’operatore =
4)
5)
6)
p1
x=1
y
p2
x
y
p1
x=1
y=2
p2
x
y
p1
x=1
y=2
p2
x
y
p1.x = 1;
p1.y = 2;
p2 = p1;
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
13
Variabili, stack, heap, parametri
• Vediamo bene cosa succede in memoria
• Esempi informali di “cosa succede” quando
–
–
–
–
si dichiara una variabile
si istanzia una classe
si effettuano assegnamenti
si passano parametri
• Gli esempi – sono in forma intuitiva
– non hanno la pretesa di essere completamente rigorosi
– sono basati su Java, ma valgono in generale anche per altri linguaggi (es., C++)
• Suggerimento: nel dubbio, fare i disegni
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
14
7
Variabili e memoria
• A livello “linguaggio macchina” (o Assembler) la memoria è organizzata logicamente come un insieme di locazioni accessibili attraverso un indirizzo
– NB; in realtà non è la vera organizzazione fisica (vedi “Memoria virtuale” in Architetture e Sistemi Operativi). • A livello di linguaggio evoluto (Java etc.) la memoria è organizzata come un insieme di zone gestite in modo specifico
• Una variabile corrisponde a un indirizzo di memoria
– che identifica una locazione (o un insieme di locazioni) allocate nella zona opportuna
– zone diverse hanno meccanismi di allocazione diversi…
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
15
Variabili: dove sono, quando esistono?
Memoria
variabili statiche
(attributi di classe)
allocate al lancio del programma tempo di vita = esecuzione programma
static
heap
variabili dinamiche
allocate a fronte di un’azione esplicita
new() in Java
deallocate quando non servono
automaticamente in Java
stack
variabili dinamiche (e parametri)
allocate all’atto della chiamata di un metodo
tempo di vita = esecuzione metodo
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
16
8
Il metodo main
• main è un metodo chiamato automaticamente al momento del lancio di un programma • Quindi…
– le variabili dichiarate nel main sono allocate in stack
– e rimangono allocate fino all’uscita dal main (che di solito coincide con la terminazione del programma)
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
17
Variabili: locali al metodo, tipo primitivo
main {
stack
heap
int a, b;
a = 50;
b = a;
a = a+1;
}
b
a
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
50
?
51
50
?
18
9
Variabili: locali al metodo, tipo non primitivo
class Persona {
public String nome;
public double costo;
}
stack
heap
37412
37412
39625
39625
null
50000
6000
0
main {
Persona a,b;
a = new Persona();
a.costo = 50000;
a.nome = “Rossi”;
b = new Persona();
b.costo = 3000; b.nome = “Verdi”;
b = a;
a.costo = 6000;
}
Software Architecture Lab
www.sal.disco.unimib.it
nome
nome
costo
costo
Rossi
Verdi
41917
null
40646
0
3000
b
?
37412
41917
a
37412
?
Classi e istanze in Java
nome
costo
19
La costante null
• Si indica con null la costante utilizzata per inizializzare un reference ad un valore di default – usato anche per verificare se il reference è stato correttamente inizializzato dopo la dichiarazione
• Esempio:
Punto p1 = null;
if (p1 == null) {
p1 = new Punto();
} else {
System.out.println(“oggetto già istanziato”);
}
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
20
10
Punti essenziali
• Una variabile di tipo primitivo contiene un valore
• Una variabile di tipo non primitivo contiene l’indirizzo di un oggetto
– ricordare che array e stringhe sono oggetti!
• Puntatore (“pointer”): una variabile che contiene un indirizzo (C, C++ e altri linguaggi)
• Ref (“reference”) in Java: un puntatore – protetto: non si possono eseguire manipolazioni (aritmetiche, logiche etc.) (per fortuna!)
– “tipato”: può riferisi solo a oggetti di un certo tipo (controllo a compile‐time e a run‐time)
• Garbage collection (Java, non C++!!)
– gli oggetti non più referenziato (refCount == 0) sono deallocati automaticamente
Classi e istanze in Java
Software Architecture Lab
www.sal.disco.unimib.it
21
Uguaglianza fra ref
• Uguaglianza fra ref (a == b)
– il contenuto dei ref è uguale…
– quindi si riferiscono allo stesso oggetto
– non vuol dire che gli oggetti riferiti sono uguali!
main {
Persona
a = new
a.costo
b = new
b.costo
boolean
b = a;
esito =
}
Software Architecture Lab
www.sal.disco.unimib.it
a,b;
Persona();
= 50000; a.nome = “Rossi”;
Persona();
= 50000; b.nome = “Rossi”;
esito = (a = = b);
(a==b);
Classi e istanze in Java
22
11
L’operatore == altro esempio
• Esempio:
Punto p1, p2;
p1 = new Punto();
p2 = new Punto();
p1.x = 1;
p1.y = 2;
p2.x = 4;
p2.y = 3;
System.out.println(p1 == p2);
p1
x=1
x=2
p2
x=4
y=3
p2 = p1;
System.out.println(p1 == p2);
p1
x=1
x=2
p2
x=4
y=3
• La prima stampa stampa false, la seconda true
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
23
La keyword instanceof
• Permette di verificare se un oggetto è stato istanziato a partire dalla classe specificata
• Sintassi: reference instanceof NomeClasse
• Esempio:
Punto p1;
p1 = new Punto();
if (p1 instanceof Punto)
System.out.println(“p1 referenzia un oggetto” +
“ di tipo Punto”);
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
24
12
Esercizi
•
Creare una classe che rappresenti una Bicicletta. La bicicletta è caratterizzata da avere un colore, una marca ed il numero di marce. Creare quindi una nuova classe (TestBicicletta) in cui vengono istanziate la bicicletta di colore blu, marca Bianchi e numero di marce 4 e la bicicletta di colore rosso, marca Bianchi e numero di marce 5. Verificare se i due oggetti si trovano nello stesso stato.
•
Creare una classe che rappresenti un DVD. Il DVD è caratterizzato dal titolo, dal nome del regista, dal tipo di film e dalla lunghezza (espressa in minuti) del movie. Creare quindi una nuova classe (TestDVD) in cui vengono istanziati 3 dvd i cui attributi verranno inizializzati dall’utente. Stampare quindi a video lo stato dei tre oggetti creati e verificare se i 3 DVD sono uguali.
•
Creare una classe (Moto) che rappresenti una moto (proprietario, modello, colore)
– Creare tre istanze della stessa assegnando i valori per gli attributi – Stampare a video lo stato delle istanze
– Assegnare due reference allo stesso oggetto
– Stampare a video (dopo aver verificato) lo stato dell’istanza con un solo reference
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
25
Esercizi
• Creare una classe Auto (modello, proprietario, colore)
– Utilizzare la classe Moto (del punto precedente)
– Creare una classe TestVeicolo dove si istanziano 2 auto e 2 moto (inserimento dati dall’utente), stampare gli stati degli oggetti, indicando se sono auto o moto.
• Creare una classe StampaVeicoli, dove vengono istanziati 1 moto e 2 auto, dato a tutti il valore di default null, in un secondo momento fare inserire i dati di alcuni oggetti e stampare solo quelli diversi da null.
Software Architecture Lab
www.sal.disco.unimib.it
Classi e istanze in Java
26
13