Definizione di classi con array di oggetti 1. (Esame scritto del 18/9/2002, Esercizio 6.) La banca dati di un agenzia assicurativa per auto è caratterizzata da un insieme di polizze di assicurazioni per auto. Usando le classi PolizzaBase e PolizzaIncendioFurto definite negli esercizi precedenti, scrivere una semplice classe AgenziaAssicurativa, dove ciascun oggetto della classe è caratterizzato dal nome dell agenzia e da un elenco di polizze auto (il cui numero massimo deve essere impostato dal costruttore della classe), che abbia i seguenti metodi: (a) un metodo che aggiunge una polizza; (b) un metodo che restituisce la somma dei premi annui di tutte le polizze dell agenzia; (c) un metodo che restituisce l elenco dei valori assicurati RC di tutte le polizze dell agenzia. public class AgenziaAssicurativa { private String nome; private PolizzaBase[] elenco; private int cont; public AgenziaAssicurativa (String s, int max) { nome = s; elenco = new PolizzaBase[max]; public void addpolizza (PolizzaBase p) { if (cont < elenco.length) { elenco[cont] = p; cont++; public int sommapremi() { int somma = 0; somma += elenco[i].premio(); return somma; public int[] elencovalorirc() { int[] a = new int[cont]; a[i] = elenco[i].getvalorerc(); return a;
2. Aggiungere alla classe AgenziaAssicurativa i seguenti metodi: un metodo che restituisce l elenco di tutte le targhe dei veicoli assicurati presso una data agenzia assicurativa; un metodo che cancella una polizza da una agenzia assicurativa; un metodo che scambia due polizze tra due agenzie assicurative. public String[] elencotarghe() { String[] a = new String[cont]; a[i] = elenco[i].getveicolo(); return a; public void deletepolizza (PolizzaBase p) { int i = 0; while (i<cont) { if (p.getveicolo().equals(elenco[i].getveicolo())) { for (int j=i; j<cont-1; j++) elenco[j] = elenco[j+1]; cont--; return; else i++; public void scambiapolizze (AgenziaAssicurativa a, PolizzaBase p, PolizzaBase q) { int pos1 = this.posizione(p); int pos2 = a.posizione(q); if (pos1!= -1 && pos2!= -1) { PolizzaBase temp = this.elenco[pos1]; this.elenco[pos1] = a.elenco[pos2]; a.elenco[pos2] = temp; public int posizione (PolizzaBase p) { for (int i=0; i<cont; i++) { if (p.getveicolo().equals(elenco[i].getveicolo())) return i; return -1;
3. Scrivere inoltre un breve programma di prova che illustri l uso delle classi PolizzaBase, PolizzaIncendioFurto e AgenziaAssicurativa e dei loro metodi. public class AATest { public static void main (String[] args) { AgenziaAssicurativa a = new AgenziaAssicurativa("AA",10); PolizzaBase p = new PolizzaBase("AB122AN",10000); PolizzaBase q = new PolizzaBase("AS546CV",20000); PolizzaIncendioFurto r = new PolizzaIncendioFurto("",10000,5000); a.addpolizza(p); a.addpolizza(q); a.addpolizza(r); int[] v = a.elencovalorirc(); System.out.println("Valori RC:"); for (int i=0; i<v.length; i++) System.out.println(v[i]); System.out.println("Somma premi: " + a.sommapremi()); AgenziaAssicurativa b = new AgenziaAssicurativa("AB", 5); PolizzaIncendioFurto s = new PolizzaIncendioFurto("",5000,2000); b.addpolizza(s); String[] ta = a.elencotarghe(); String[] tb = b.elencotarghe(); System.out.println("Veicoli assicurati dall agenzia "+ b.getnome()); for (int i=0; i<tb.length; i++) System.out.println(tb[i]); a.scambiapolizze(b,q,s); System.out.println("Eseguito uno scambio di polizze, si ha:"); ta = a.elencotarghe(); tb = b.elencotarghe(); System.out.println("Veicoli assicurati dall agenzia "+ b.getnome()); for (int i=0; i<tb.length; i++) System.out.println(tb[i]); a.deletepolizza(p); System.out.println("Cancellata una polizza, si ha:"); ta = a.elencotarghe();
Il risultato di tale programma di prova è la seguente stampa: Valori RC: 10000 20000 10000 Somma premi: 450 AB122AN AS546CV Veicoli assicurati dall agenzia AB Eseguito uno scambio di polizze, si ha: AB122AN Veicoli assicurati dall agenzia AB AS546CV Cancellata una polizza, si ha: Assegnamenti tra riferimenti a oggetti di superclasse/sottoclasse, metodi sovrascritti e late binding 1. Con riferimento alle classi StudUniv (superclasse) e StudUnivFC (sottoclasse) definite precedentemente, si considerino i seguenti oggetti: StudUniv s1 = new StudUniv("Andrea", "Rossi", 134678); StudUnivFC s2 = new StudUnivFC("Elena", "Bianchi",111789,3); Il metodo info, presente nella superclasse, è sovrascritto nella sottoclasse e applicabile su entrambi gli oggetti s1 ed s2: System.out.println(s1.info()); System.out.println(s2.info()); dando luogo alla stampa delle seguenti stringhe: Rossi Andrea (matr. 134678) Se s2 (riferimento di sottoclasse) è assegnato ad s1 (riferimento di superclasse) e poi si cerca di applicare su s1 un metodo definito nella sottoclasse:
s1 = s2; String t = s1.leggiannofc(); s1.aggannofc(); si ha errore in fase di compilazione, in quanto tali metodi non appartengono alla classe a cui appartiene s1. Se invece si applica su s1 un metodo presente nella superclasse che è sovrascritto nella sottoclasse, come info, per il meccanismo del late binding, viene eseguito il metodo sovrascritto nella sottoclasse, ovvero la classe a cui appartiene l oggetto riferito da s1: System.out.println(s1.info()); Viene infatti stampato: Supponiamo di perdere il riferimento s2 all oggetto della sottoclasse e di voler assegnare s1 ad un riferimento di sottoclasse: s2 = null; StudUnivFC s3 = s1; Si ha errore in fase di compilazione in quanto i tipi di s1 e di s3 non sono compatibili. Tuttavia, il riferimento di superclasse s1 riferisce un oggetto della sottoclasse, quindi può essere assegnato al riferimento di sottoclasse s3 tramite l uso del cast forzando il tipo di s1: StudUnivFC s3 = (StudUnivFC) s1; Per evitare errori nel caso in cui s1 non riferisca effettivamente un oggetto della sottoclasse, è consigliabile usare instanceof per controllare che s1 riferisca un oggetto della classe StudUnivFC, come segue: StudUnivFC s3; if (s1 instanceof StudUnivFC) s3 = (StudUnivFC) s1; else s3 = null; System.out.println(s3.info()); Nuovamente viene stampata la stringa: