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 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 e di tipo int (che rappresenta l ordinata). Entrambi gli attributi hanno visibilità pubblica.» Classi e istanze in Java 3 Rappresentazione in UML La classe Punto in un diagramma delle classi di design è rappresentata come in figura Punto + x: int + : int Sintassi: Modificatore_di_visibilità Identificatore_dell attributo: tipo Modificatore_di_visibilità: + indica public (appartenente all interfaccia della classe) 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 ; Modificatore di visibilità. public: appartiene all interfaccia Definizione degli attributi di istanza Classi e istanze in Java 5 Come si crea un oggetto? NomeClasse nomereference; nomereference = new NomeClasse(); dichiara, non crea crea nomereference.comando(); nomereference.attributo; accesso all interfaccia pubblica Classi e istanze in Java 6 3
Esempio: utilizzo della classe Punto Ogni attributo di istanza possiede un tipo! Punto ;.x = 3;. = 4; int valorex =.x; int valore =.; Classi e istanze in Java 7 Esempio Creare due punti e assegnare i valori per x e 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, p2; p2 = new Punto();.x = 3;. = 4; p2.x = 50; p2. = 90; if(.x >= p2.x) { Sstem.out.println(Il punto ha x maggiore); else { Sstem.out.println(Il punto p2 ha x maggiore); 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 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! Classi e istanze in Java 10 5
Oggetti e reference Variabili di tipo classe (tipo o p2 dell esempio precedente) sono molto differenti rispetto a variabili di tipo primitivo (come int o char) Punto, p2; p2 = new Punto(); int n, m; n = 10;? m = n; n = 9; Sstem.out.println( n + n + m + m);.x = 1;. = 2; p2 = ; p2.x = 3; p2. = 4; Sstem.out.println( x: +.x + : +.); Sstem.out.println( p2 x: + p2.x + : + p2.); Classi e istanze in Java 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) Punto, p2;? p2? 2) p2? x 3) p2 = new Punto(); p2 Classi e istanze in Java 12 x x 6
L operatore = 4).x = 1; p2 x=1 x 5). = 2; p2 x=1 =2 x 6) p2 = ; p2 x=1 =2 x 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 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 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 variabili dinamiche (e parametri) allocate all atto della chiamata di un metodo tempo di vita = esecuzione metodo stack 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) Classi e istanze in Java 17 Variabili: locali al metodo, tipo primitivo main { int a, b; a = 50; b = a; a = a+1; stack heap b 50? a 51 50? Classi e istanze in Java 18 9
Variabili: locali al metodo, tipo non primitivo class Persona { public String nome; public double costo; stack 37412 heap 39625 null 50000 60000 nome costo 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; 41917 Rossi Verdi 40646 null 3000 0 nome costo b 41917 37412? a 37412? Classi e istanze in Java 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 = null; if ( == null) { else { Sstem.out.println( oggetto già istanziato ); 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 arra 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 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,b; a = new Persona(); a.costo = 50000; a.nome = Rossi ; b = new Persona(); b.costo = 50000; b.nome = Rossi ; boolean esito = (a = = b); b = a; esito = (a==b); Classi e istanze in Java 22 11
L operatore == altro esempio Esempio: Punto, p2; p2 = new Punto();.x = 1;. = 2; p2.x = 4; p2. = 3; Sstem.out.println( == p2); p2 = ; Sstem.out.println( == p2); p2 x=1 x=2 x=4 =3 x=1 x=2 La prima stampa stampa false, la seconda true p2 x=4 =3 Classi e istanze in Java 23 La keword instanceof Permette di verificare se un oggetto è stato istanziato a partire dalla classe specificata Sintassi: reference instanceof NomeClasse Esempio: Punto ; if ( instanceof Punto) Sstem.out.println( referenzia un oggetto + di tipo Punto ); 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 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. Classi e istanze in Java 26 13