OGGETTI JAVA Cos’è un oggetto? Ogni volta che definiamo una nuova classe stiamo costruendo un oggetto Esempio: Rettangolo int base, altezza int perimetro (int x,int y) int area (int x, int y) double diagonale (int x,int y) Oggetto software Un oggetto (non solo in java) è un sistema chiuso: ha uno stato (i valori contenuti nelle variabili) e dei metodi (le azioni che è possibile compiere su questo oggetto). Lo “stato” di un Rettangolo è costituito dai valori di base e altezza; le azioni che si possono compiere sono i calcoli del perimetro, dell’area e della diagonale Creare le proprie classi class Rettangolo{ public Rettangolo(){ …} public int area(){ …} public int perimetro(){ …} public double diagonale(){ …} } Costruttore: un metodo speciale E se mi servissero più rettangoli? ciascuno con base e altezza diverse? Per definire istanze multiple di un oggetto è necessario che sia definito un metodo COSTRUTTORE, ossia un metodo speciale che è in grado di generare un nuovo oggetto. N.B. Il costruttore ha sempre lo stesso nome della classe. Istanze di un oggetto Cosa fa il costruttore? Ciascun oggetto si differenzia dagli altri per le sue proprietà (in questo caso base e altezza), il costruttore si occuperà quindi di assegnare a ciascuna istanza dell’oggetto rettangolo le sue proprietà. Per tutte le istanze saranno disponibili gli stessi metodi. Variabili di istanza Le variabili di istanza sono le variabili definite all’interno della classe ma esternamente ai metodi e rappresentano lo stato dell’oggetto. Ogni oggetto creato avrà la sua copia di variabili di istanza indipendente da quella posseduta dagli altri oggetti. Nel caso della classe Rettangolo, base e altezza sono le variabili di istanza. class Rettangolo{ int base, altezza; public Rettangolo(int x, int y){ base=x; altezza=y; } public int area(){ return base*altezza; } } 1 OGGETTI JAVA Se creiamo due oggetti: Rettangolo primoRettangolo = new Rettangolo(20,40); Rettangolo secondoRettangolo = new Rettangolo(30,10); il valore delle variabili di istanza dipende dall’oggetto a cui sono associate: per primoRettangolo base=20 e altezza=40, per secondoRettangolo base=30 e altezza=10 private: modificatore di visibilità Per fare in modo che le variabili di istanza base e altezza siano modificabili e/o utilizzabili solamente dal costruttore e da tutti i metodi della classe le dichiariamo private . class Rettangolo{ private int base, altezza; public Rettangolo(int x, int y){ Il compito del costruttore è assegnare, alle variabili di istanza, le informazioni ricevute come argomento Usare le proprie classi Una volta scritto e compilato correttamente il file Rettangolo.java avremo a disposizione il file Rettangolo.class. Possiamo utilizzare la classe Rettangolo dichiarando oggetti di quel tipo in un’altra classe. Rettangolo.java class Rettangolo{ private int base, altezza; public Rettangolo(int x, int y){ base=x; altezza=y; } public double diagonale(){ return (Math.sqrt(Math.pow(base,2)+Math.pow(altezza,2))); } public int perimetro(){ return (2*(base+altezza)); } public void mostra(){ System.out.println("Rettangolo:"); System.out.println(" - base: "+base); System.out.println(" - altezza: "+altezza); } } Geometria.java public class Geometria { public static void main(String args[]) { ogni volta che chiamo il int num1,num2; costruttore DEVO usare num1=35; la parola chiave new num2=27; Rettangolo primoRettangolo; primoRettangolo = new Rettangolo(num1,num2); primoRettangolo.mostra(); System.out.println("Questo rettangolo ha area uguale a "+primoRettangolo.area()); System.out.println("Questo rettangolo ha perimetro uguale a "+primoRettangolo.perimetro()); } } Overloading Si usa in una classe quando è necessario definire più metodi con lo stesso nome ma che si comportano in maniera diversa a seconda dei parametri che gli vengono passati. Per esempio nella classe Rettangolo potremmo fare un secondo costruttore senza parametri che genera un rettangolo standard con base 10 e altezza 5. Se richiamo new Rettangolo(8,19) verrà attivato in automatico il primo metodo, se richiamo new Rettangolo() si attiverà il secondo costruttore. 2 OGGETTI JAVA Aggiunta a Rettangolo.java Aggiungiamo il secondo costruttore public Rettangolo(){ base=10; altezza=5; } N.B. per tutti i metodi si può fare overloading Aggiunta a Geometria.java Rettangolo secondoRettangolo; secondoRettangolo=new Rettangolo(); secondoRettangolo.mostra(); System.out.println("Questo rettangolo ha area uguale a "+secondoRettangolo.area()); System.out.println("Questo rettangolo ha perimetro uguale a "+secondoRettangolo.perimetro()); Assegnazione tipi primitivi int a,b; a = 9; b = 13; a = b; System.out.println(a); a = 33; System.out.println(a); System.out.println(b); Assegnazione oggetti: riferimento! L’assegnazione di oggetti è molto differente da quella dei tipi primitivi. Infatti l’assegnazione di un oggetto ad un altro della stessa classe copia il riferimento all’oggetto stesso, non il suo contenuto. Facciamo una prova. Altra aggiunta a Rettangolo.java Supponiamo di scrivere un metodo della classe Rettangolo per modificare la base public void cambiaBase(int x){ base=x; } Altra aggiunta a Geometria.java System.out.print("Primo "); primoRettangolo.mostra(); System.out.print("Secondo "); secondoRettangolo.mostra(); System.out.println("Adesso faccio primoRettangolo=secondoRettangolo"); primoRettangolo=secondoRettangolo; System.out.print("Primo "); primoRettangolo.mostra(); System.out.print("Secondo "); secondoRettangolo.mostra(); System.out.println("Adesso cambio la base del primo e la metto = a 89"); primoRettangolo.cambiaBase(89); System.out.print("Primo "); primoRettangolo.mostra(); System.out.print("Secondo "); secondoRettangolo.mostra(); 3 OGGETTI JAVA new anche per le librerie String è una classe: questo significa che esiste un costruttore che si chiama String e che posso creare un nuovo oggetto di tipo String ??? SI invoca il new String(“Una bella giornata di sole”); costruttore della classe Uso di oggetti istanziati Se non assegno a una variabile ciò che ho creato con la new non posso utilizzarlo. String s; s = new String(“Cani e gatti”); String maiuscolo; maiuscolo = s.toUpperCase(); Esercizi // questa classe implementa un modello di umano // 1. la classe andrà poi estesa: mettere i modificatori corretti alle variabili di istanza // 2. dare il nome corretto al costruttore // 3. specificare i parametri che deve ricevere il costruttore analizzando il codice del costruttore stesso // 4. completare il metodo mostra in modo che stampi le proprietà dell'umano class Umano{ int eta; float altezza; boolean maschio; public (){ eta=x; altezza=y; maschio=z; } public void mostra(){ System.out.println(); System.out.println(); System.out.println(); } } definite 3 variabili di tipo Umano, per ciascuna richiamate il costruttore e date le proprietà corrette per ciascuno poi fate stampare a video le proprietà di ciascuno, Maria è già definita fate stampare a video anche lei... public class Amici { public static void main(String args[]) { Umano Maria; Maria=new Umano (21,1.60,false); } } 4