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