ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 7. Java: Programmazione generica Vittorio Scarano Algoritmi e Strutture Dati: Sistemi Distribuiti Corso di Laurea in Informatica Università degli Studi di Salerno Organizzazione della lezione ASD: Sistemi Distribuiti. Vi.ttorio Scarano • La classe Object: “madre” di tutte le classi – Il metodo equals – Il metodo toString • Programmazione generica – – – – La classe ArrayList Le classi wrapper La classe Class Introspezione: alcuni esempi 2 1 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 La classe Object ASD: Sistemi Distribuiti. Vi.ttorio Scarano • E’ la radice di ogni classe costruita • In pratica ogni classe Java eredita da Object – inutile specificarlo tramite public class Prova extends Object { … } • Rappresenta una maniera elegante per offrire servizi a tutte le classi create dal programmatore – e la possibilità di ridefinire questi servizi attraverso l’override dei metodi di Object 3 Alcuni usi semplici e già visti della classe ASD: Sistemi Distribuiti. Vi.ttorio Scarano Object • Una variabile Object può fare riferimento a qualsiasi oggetto: Object obj = new Employee (“Tizio”, 25000, 1987, 10, 1); • Per poter usare però i metodi specifici dell’oggetto è necessario convertirlo esplicitamente Employee e = (Employee ) obj ; • Servizi offerti da Object: – metodo equals : • permette di verificare la uguaglianza tra oggetti – metodo toString • permette la stampa di un oggetto 4 2 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Il metodo equals • Obiettivi: ASD: Sistemi Distribuiti. Vi.ttorio Scarano – verificare se un oggetto è uguale ad un altro • La implementazione del metodo da parte di Object: – controlla se due oggetti puntano o meno alla stessa area di memoria – strategia generica (e efficace) ma che deve essere ampliata per trattare i casi specifici della classe • Tipicamente, del metodo viene fatto override – definendo cosa si intende per uguaglianza nel caso specifico 5 Le specifiche del linguaggio Java per equals (1) • (1) il metodo deve essere riflessivo: ASD: Sistemi Distribuiti. Vi.ttorio Scarano – per ogni riferimento x non nullo, x.equals(x) deve restituire true • (2) il metodo deve essere simmetrico: – per qualsiasi riferimento x e y, x.equals(y) deve restituire true sse y.equals(x) restituisce true • (3) il metodo deve essere transitivo: – per qualsiasi riferimento x, y e z, se x.equals(y) è true e y.equals(z) è true allora x.equals(z) restituisce true 6 3 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Le specifiche del linguaggio Java per equals (2) ASD: Sistemi Distribuiti. Vi.ttorio Scarano • (4) il metodo deve essere consistente – se gli oggetti a cui fanno riferimento x e y non sono cambiati, allora chiamate ripetute a x.equals(y) danno sempre lo stesso risultato • (5) per ogni riferimento x non nullo, il metodo x.equals(null) deve restituire false 7 L’esempio della classe Employee ASD: Sistemi Distribuiti. Vi.ttorio Scarano Employee.java import java.util.*; // per Date e Calendar public class Employee { public Employee (String n, double s, int year, int month, int day) { name = n; salary = s; GregorianCalendar cal = new GregorianCalendar(year, month-1, day); hireDay = cal.getTime(); } // …………………..Uno dei metodi di accesso public String getName () { return name; } private String name; private double salary; private Date hireDay; } • Il costruttore – stesso nome della classe – assegna i campi dell’oggetto che costruisce • Un metodo di accesso – restituisce il nome • Campi della istanza – – – – una stringa (Nome) un double (salario) data di assunzione tutti campi privati 8 4 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 L’esempio della classe Manager ASD: Sistemi Distribuiti. Vi.ttorio Scarano Manager.java public class Manager extends Employee { public Manager (String n, double s, int year, int month, int day) { super (n, s, year, month, day); bonus = 0; } // ……………………………..…Metodi acc./mod. public double getBonus () { return bonus; } public void setBonus(double b) { bonus = b; } // …………………………….…Metodo override public double getSalary() { double bs=super.getSalary(); return bs+bonus; } // …………………………………Variabili istanza private double bonus; } • Il costruttore – richiama il costruttore della superclasse – assegna il valore del campo bonus • Accesso/Modifica – restituisce il bonus – assegna il bonus • Metodo che fa override – il salario è la somma del salario da impiegato e il bonus • Variabile istanza 9 La dipendenza tra le due classi ASD: Sistemi Distribuiti. Vi.ttorio Scarano Employee - name - salary - hireDay : String : double : Date «constructor» +Employee(n: String, s:double, year: int, month: int, day: int) «misc» + getName() : String + getSalary() : double + getHireDay() : Date • Qualsiasi oggetto della sottoclasse è anche un oggetto della superclasse extends Manager - bonus : double «constructor» +Manager(n: String, s:double, year: int, month: int, day: int) «misc» + getBonus() : double + setBonus(b:double) : void + getSalary() : double 10 5 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Cosa è il metodo equals per Employee? • Deve controllare: ASD: Sistemi Distribuiti. Vi.ttorio Scarano – se l’oggetto passato (parametro esplicito) è null • restituisce false (regola 5) – se le classi dei due oggetti non corrispondono • restituisce false – se tutti i campi dei due oggetti sono uguali • restituisce true • altrimenti restituisce false • Attenzione: – se l’oggetto passato appartiene ad una sottoclasse il test deve restituire false! 11 Il metodo equals della classe Employee ASD: Sistemi Distribuiti. Vi.ttorio Scarano Employee.java import java.util.*; // per Date e Calendar public class Employee { …. public boolean equals (Object otherObj) { // per efficienza… if (this == otherObj) return true; // regola 5 if (otherObj == null) return false; // se le classi non corrispondono.. false! if (getClass() != otherObj.getClass()) return false; // ok, otherObj è Employee non nullo Employee other = (Employee) otherObj; return ( name.equals(other.name) && salary == other.salary && hireday.equals(other.hireDay) ) } } • Parametri – esplicito – implicito (l’oggetto) • Per ottimizzare: – controlla se riferiscono alla stessa locazione – il caso più comune • Regola 5 • Uguaglianza di classi • Ora è possibile il controllo effettivo sui singoli campi 12 6 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Cosa è il metodo equals per Manager? ASD: Sistemi Distribuiti. Vi.ttorio Scarano • E’ una sottoclasse di Employee, quindi – se non sono uguali “in quanto Employee” allora non sono uguali (restituisci false) – se risultano uguali “in quanto Employee” dobbiamo controllare che risultino uguali anche “in quanto Manager” (campi specifici della estensione a Manager) • Si deve utilizzare il metodo equals della superclasse 13 Il metodo equals della classe Manager Manager.java ASD: Sistemi Distribuiti. Vi.ttorio Scarano public class Manager extends Employee { … public boolean equals (Object otherObj) { if (!super.equals(otherObj)) return false; Manager other = (Manager) otherObj; return bonus==other.bonus; } } • Controlliamo se risultano diversi in quanto Employee – in questo caso saranno diversi come Manager • Attenzione: – il metodo della superclasse ha anche già controllato che this e otherObj appartengano alla stessa classe! • Controllo il singolo campo specifico 14 7 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Il metodo toString ASD: Sistemi Distribuiti. Vi.ttorio Scarano • Restituisce una stringa che è il “valore” dell’oggetto • Possibile fare override del metodo fornito da Object – che fornisce solo il nome della classe e la locazione di memoria dove è memorizzato l’oggetto • Convenzione utilizzata: – il nome della classe – seguito da tutti i valori dei campi, racchiusi tra [..] • Esempio: Employee e; … System.out.println (e); Employee[name=“Tizio”, salary=10000, hireDay=“10 agosto 2000”] 15 Un esempio con la classe EmployeeTest ASD: Sistemi Distribuiti. Vi.ttorio Scarano EmployeeTest.java import java.util.*; public class EmployeeTest {public static void main(String[] args) { Employee[] staff = new Employee[3]; staff [0]=new Employee ("Gianni", 30000,1987, 12, 10); staff [1]=new Employee ("Giorgio", 35000, 1985, 10, 31); staff [2]=new Manager ("Ugo", 28000, 2000, 1, 1); for (int i=0; i< staff.length; i++) System.out.println ( "Nome:"+ staff[i].getName() + " Salario:" + staff[i].getSalary() + " Assunto:"+ staff[i].getHireDay() ); for (int i=0; i< staff.length; i++) System.out.println(staff[i]); } } • Come al solito: – riempimento dell’array – stampa dell’array • Utilizzo del metodo toString – notare che uno dei tre è della classe Manager 16 8 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 ASD: Sistemi Distribuiti. Vi.ttorio Scarano Senza aggiungere toString a Employee C:\>javac Employee.java Manager.java C:\>javac EmployeeTest.java C:\>java EmployeeTest Nome:Gianni Salario:30000.0 Assunto:Thu Dec 10 …. Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31 …. Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01 …. Employee@ed645 Employee@1a698a Manager@7077e C:\> Metodo toString definito in Object: nome della classe e locazione di memoria 17 Il metodo toString della classe Employee ASD: Sistemi Distribuiti. Vi.ttorio Scarano Employee.java import java.util.*; // per Date e Calendar public class Employee { …. public String toString () { return getClass().getName() + “[name=“ + name + “,salary=“+ salary + “,hireDay”=+hireDay + “]” ; } } • Stampa il nome della classe • Aggiunge i parametri – la classe Date offre anche essa un metodo toString usato per stampare hireDay 18 9 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Con il metodo toString a Employee ASD: Sistemi Distribuiti. Vi.ttorio Scarano C:\>javac Employee.java C:\>java EmployeeTest Nome:Gianni Salario:30000.0 Assunto:Thu Dec 10 …. Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31 …. Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01 …. Employee[name=Gianni,salary=30000.0,hireDay=…] Employee[name=Giorgio,salary=35000.0,hireDay=…] Manager[name=Ugo,salary=28000.0,hireDay…] C:\> Metodo toString definito in Employee: nome della classe e valori dei campi 19 Il metodo toString della classe Manager ASD: Sistemi Distribuiti. Vi.ttorio Scarano Manager.java public class Manager extends Employee { …. public String toString () { return getClass().getName() + “[name=“ + getName() + “,salary=“ + getSalary() + “,hireDay=“ + getHireDay() + “,bonus=“ + bonus + "]" ; } } • Stampa il nome della classe • Aggiunge i parametri – compreso bonus – deve necessariamente usare i metodi di accesso get() per leggere i campi private della superclasse 20 10 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Con il metodo toString a Manager ASD: Sistemi Distribuiti. Vi.ttorio Scarano C:\>javac Manager.java C:\>java EmployeeTest Nome:Gianni Salario:30000.0 Assunto:Thu Dec 10 …. Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31 …. Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01 …. Employee[name=Gianni,salary=30000.0,hireDay=…] Employee[name=Giorgio,salary=35000.0,hireDay=…] Manager[name=Ugo,salary=28000.0,hire…,bonus=0.0] C:\> Metodo toString definito in Employee oppure in Manager : nome della classe e valori dei campi 21 Organizzazione della lezione ASD: Sistemi Distribuiti. Vi.ttorio Scarano • La classe Object: “madre” di tutte le classi – Il metodo equals – Il metodo toString • Programmazione generica – – – – La classe ArrayList Le classi wrapper La classe Class Introspezione: alcuni esempi 22 11 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 ASD: Sistemi Distribuiti. Vi.ttorio Scarano Programmazione generica • Permessa dalla esistenza di una superclasse comune a tutti gli oggetti e, quindi, di alcuni metodi comuni • Un esempio: – come scrivere un metodo che cerchi un elemento in un array e restituisce l’indice, se trovato, oppure -1 static int find (Object [ ] a, Object key) { for (int i=0; i < a.length; i++) if (a[i].equals(key)) return i; return -1; } – funziona con array di Employee, array di Date, array di Stack (se implementiamo equals!)… etc.! 23 Dimensione dinamica degli array • Importante caratteristica degli array: ASD: Sistemi Distribuiti. Vi.ttorio Scarano – permette il dimensionamento a run-time degli array • Possibile (anche se in maniera complessa) in altri linguaggi • In Java è semplice: int actualSize = ….; Employee[ ] staff = new Employee[actualSize]; • Problema: – una volta stabilita la dimensione (a run-time) è possibile cambiarla (ingrandendo o rimpicciolendo l’array)? 24 12 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 La classe ArrayList e gli array ASD: Sistemi Distribuiti. Vi.ttorio Scarano • Differenze: – gli array sono parte del linguaggio Java – la classe ArrayList è una classe di libreria del package java.util • La classe ArrayList contiene elementi di tipo Object – per aggiungere un elemento si usa il metodo add • Esempio: ArrayList staff = new ArrayList(); staff.add (new Employee(….) ); staff.add (new Employee(….) ); • Caratteristica fondamentale: – l’ArrayList alloca automaticamente spazio se risulta necessario 25 Alcuni metodi della classe ArrayList • Costruttore: ASD: Sistemi Distribuiti. Vi.ttorio Scarano – permette di stabilire una capacità iniziale ArrayList staff = new ArrayList(100); • Metodo ensureCapacity() – assicura che l’array possa contenere x elementi prima di staff.ensureCapacity(200); rilocarsi • Metodo trimToSize() staff.trimToSize(); – liberare la memoria in eccesso • Metodo size() for (int i = 0; i < staff.size(); i++) – restituisce il numero di elementi presenti 26 13 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Accesso agli elementi della classe ArrayList • La semplicità degli ArrayList comporta un prezzo: ASD: Sistemi Distribuiti. Vi.ttorio Scarano – l’accesso agli elementi non è semplice come per array • Per settare l’i-mo elemento si deve usare: staff.set (i, tizio); – laddove se staff fosse un array avremmo usato: staff[i] = tizio; • Recuperare un elemento richiede un casting: Employee e = (Employee) staff.get(i); – infatti il metodo get restituisce un Object 27 La “pericolosità” degli ArrayList ASD: Sistemi Distribuiti. Vi.ttorio Scarano • Insita nella capacità di usare Object ! – non vengono effettuati controlli a tempo di compilazione sulla consistenza ma solamente a run-time! Date birthday = new …; staff.set (i, birthday); …. // continua – in compilazione passa… ma se poi facciamo …. //continua Employee e = (Employee) staff.get(i); – causiamo un errore a run-time 28 14 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Utilizzo degli elementi di ArrayList • Attenzione: differenza tra il metodo ASD: Sistemi Distribuiti. Vi.ttorio Scarano staff.set (i, tizio); – ed il metodo staff.add (i, tizio); – set() assegna la posizione i-ma a tizio – add() “inserisce” tizio spostando tutti gli elementi avanti di una posizione • Disponibile anche: staff.add (tizio); – che inserisce dopo l’ultima posizione piena di staff 29 Organizzazione della lezione ASD: Sistemi Distribuiti. Vi.ttorio Scarano • La classe Object: “madre” di tutte le classi – Il metodo equals – Il metodo toString • Programmazione generica – – – – La classe ArrayList Le classi wrapper La classe Class Introspezione: alcuni esempi 30 15 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Motivazioni alle classi wrapper • Differenza sostanziale tra: ASD: Sistemi Distribuiti. Vi.ttorio Scarano – i tipi definiti (int, boolean, double, etc..) • che fanno parte del linguaggio – le classi • definite dal programmatore (e quindi modificabili) • che ereditano da Object • Un problema: – posso creare un ArrayList di interi? ArrayList list = new ArrayList(); list.add(44); //Errore! – no! è richiesto un Object e 44 è intero! 31 Le classi wrapper ASD: Sistemi Distribuiti. Vi.ttorio Scarano • Permettono di creare un vero e proprio oggetto partendo da un tipo definito – esiste una classe Integer che corrisponde a int – esiste una classe Double che corrisponde a double, etc. • Le classi wrapper sono final e i valori memorizzati non possono essere modificati – non possiamo incrementare un oggetto Integer • A cosa servono? Innanzitutto: ArrayList list = new ArrayList(); list.add(new Integer (44) ); //funziona! 32 16 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 ASD: Sistemi Distribuiti. Vi.ttorio Scarano Metodi di utilità delle classi wrapper • Le classi sono la “posizione” giusta per inserire metodi di utilità e costanti • Conversione tra tipi di dato: – Integer.doubleValue() – Integer.floatValue() – Integer.valueOf() , (converte stringa in intero) etc. • Costanti utili: – Integer.MIN_VALUE, Integer.MAX_VALUE 33 ASD: Sistemi Distribuiti. Vi.ttorio Scarano Un esempio di uso • Per usare ArrayList con double dobbiamo necessariamente utilizzare le classi wrapper • Questo rende l’accesso agli elementi alquanto farraginoso: ArrayList list = new ArrayList(); list.add(new Double (44.32) ); … double x = ( (Double) list.get(i)).doubleValue(); • Obiettivo: creare una classe ArrayList di Double 34 17 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 La classe DoubleArrayList ASD: Sistemi Distribuiti. Vi.ttorio Scarano DoubleArrayList.java public class DoubleArrayList { public DoubleArrayList { list = new ArrayList(); } //…………… Metodi di accesso e mod. public void set (int n, double x) { list.set (n, new Double (x)); } public void add (double x) { list.add (new Double(x)); } public double get (int n) { return ((Double)list.get(n)).doubleValue(); } public int size() { return list.size();} private ArrayList list; } • Costruttore: – crea la variabile istanza list • Metodi di accesso: – set: • crea un oggetto Double • che viene inserito in list – get: • preleva il valore da list • casting in Double • ottiene il valore come double • Variabile di istanza 35 Organizzazione della lezione ASD: Sistemi Distribuiti. Vi.ttorio Scarano • La classe Object: “madre” di tutte le classi – Il metodo equals – Il metodo toString • Programmazione generica – – – – La classe ArrayList Le classi wrapper La classe Class Introspezione: alcuni esempi 36 18 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 La gestione delle classi a run-tim ASD: Sistemi Distribuiti. Vi.ttorio Scarano • Il sistema run-time di Java mantiene per ogni oggetto informazioni sul suo tipo (la classe) – permette la selezione dei metodi corretti da chiamare • Possibile utilizzare queste informazioni in un programma Java: – utilizzando la classe Class che contiene queste informazioni Employee e; …. Class cl = e.getClass(); 37 La classe Class (1) • Alcuni metodi utili: il nome di una classe ASD: Sistemi Distribuiti. Vi.ttorio Scarano – getName() Employee e; …. Class cl = e.getClass(); System.out.println (cl.getName()); – forName() • metodo statico che permette di ottenere un oggetto Class chiamando la classe “per nome” String nomeClasse = “Manager”; Class cl = Class.forName(nomeClasse); … 38 19 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 La classe Class (2) ASD: Sistemi Distribuiti. Vi.ttorio Scarano • Alcuni metodi utili: creazione di una istanza – newInstance() • crea una istanza (costruttore vuoto) della classe Employee e; …. Employee e2 = e.getClass().newIstance(); • crea un oggetto della stessa classe di e – usando questo metodo possiamo creare un oggetto di una classe indicata da una stringa • ad esempio inserita dall’utente String s = “Manager”; Object m = Class.forName(s).newInstance(); … 39 Organizzazione della lezione ASD: Sistemi Distribuiti. Vi.ttorio Scarano • La classe Object: “madre” di tutte le classi – Il metodo equals – Il metodo toString • Programmazione generica – – – – La classe ArrayList Le classi wrapper La classe Class Introspezione: alcuni esempi 40 20 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Un esempio di uso (1) ASD: Sistemi Distribuiti. Vi.ttorio Scarano • Obiettivi: – costruire una classe che permetta di istanziare un oggetto di una classe passata (come nome) al costruttore – poter reperire informazioni sulla struttura della classe passata • nomi dei metodi • nomi dei campi • Struttura: abbiamo bisogno di – una classe di Esempio • un semplice contatore che può essere inizializzato, assegnato, incrementato e decrementato 41 La classe Esempio ASD: Sistemi Distribuiti. Vi.ttorio Scarano Esempio.java public class Esempio { public Esempio(int i) { num = i; } public Esempio() { this (0); } public void incrementa() { num++; } public void decrementa() { num--; } public int setContatore(int nuovo) { int old = num; num = nuovo; return (old); } public int dammiContatore() { return (num); } private int num; } • Costruttori: – con e senza parametro per inizializzazione • Metodi di modifica – incremento – decremento – assegnazione • Metodo di accesso • Variabile di istanza BlueJ 42 21 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 La classe Loader ASD: Sistemi Distribuiti. Vi.ttorio Scarano Loader.java public class Loader { public Loader(String n) { nomeClasse = n; try {cl = java.lang.Class.forName(n); } catch (ClassNotFoundException e) { } try { riferimento = cl.newInstance(); } catch (Exception e) { } } public String dammiNomeClasse() { String result ="Classe: "+ nomeClasse+"."; return result; } public Object dammiRiferimento() { return riferimento; } Class cl; String nomeClasse; Object riferimento; } • Costruttore – assegna nomeClasse – assegna cl – crea una nuova istanza e mantiene il riferimento • Metodi di accesso – restituisce il nome – restituisce riferimento • come Object • Variabili di istanza BlueJ 43 La classe AdvancedLoader (1) ASD: Sistemi Distribuiti. Vi.ttorio Scarano AdvancedLoader.java import java.lang.reflect.*; public class AdvancedLoader extends Loader { public AdvancedLoader(String n) { super (n); elencoMetodi = cl.getDeclaredMethods(); elencoCampi = cl.getDeclaredFields(); } public void stampaMetodi() { System.out.println ("Metodi di "+ nomeClasse); for (int i=0;i<elencoMetodi.length; i++){ System.out.println (" "+(i+1)+": "+ elencoMetodi[i].getName()); System.out.println (" Restituisce “ + elencoMetodi[i].getReturnType().getName()); } } • Deriva da Loader • Costruttore – costruisce • elenco metodi • elenco campi • Stampa a video i metodi dell’oggetto – il nome del metodo – tipo del valore restituito //… continua 44 22 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 La classe AdvancedLoader (2) ASD: Sistemi Distribuiti. Vi.ttorio Scarano AdvancedLoader.java public void stampaCampi() { System.out.println ("Campi di "+ nomeClasse); for (int i=0; i < elencoCampi.length; i++){ System.out.println (" "+(i+1)+": "+ elencoCampi[i].getName()); System.out.println (" di tipo "+ elencoCampi[i].getType().getName()); } } Method[ ] elencoMetodi; Field[ ] elencoCampi; • Stampa a video i campi dell’oggetto – il nome del campo – il tipo del campo • Variabili di istanza } BlueJ 45 Un metodo toString() generico • Si può scrivere un metodo toString() generico che: ASD: Sistemi Distribuiti. Vi.ttorio Scarano – esamini tutti i campi dell’oggetto • per stamparne il nome e.. • per chiamarne il corrispettivo metodo toString() per il valore – ed esamini bottom-up tutti i campi di tutte le superclassi a cui l’oggetto appartiene • Una semplice gerarchia: – una classe Prima con un intero i – una classe Seconda che eredita da Prima e definisce un double d – una classe Esempio che definisce una Stringa s 46 23 ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002 Le classi dell’esempio… ASD: Sistemi Distribuiti. Vi.ttorio Scarano Prima.java Seconda.java public class Prima { int i=4; } public class Seconda extends Prima { double d=3.6; } Esempio.java import java.lang.reflect.*; public class Esempio extends Seconda { public String toString() { //…. continua… } // variabili di istanza String s = "Ciao"; } 47 Il metodo toString() di Esempio ASD: Sistemi Distribuiti. Vi.ttorio Scarano Esempio.java public String toString() { Class cl = getClass(); String r = cl.getName(); do { r+= "["; Field[ ] f = cl.getDeclaredFields(); AccessibleObject.setAccessible(f,true); for (int i=0;i< f.length; i++) { r+= f[i].getName() + "="; try { r+= f[i].get(this).toString(); } catch (Exception e) { }; if (i< f.length-1) r+=","; } r+= "]"; cl = cl.getSuperclass(); } while (!cl.getName().equals( "java.lang.Object")); return r; } • Preleva la classe e il nome • Preleva i campi – li rende accessibili – per ogni campo • chiama il metodo toString – termina i campi della classe – passa alla superclasse • Fino ad arrivare a Object BlueJ 48 24