Programmazione a Oggetti e JAVA Prof. B.Buttarazzi A.A. 2012/2013
Sommario Array di oggetti Gerarchie di Classi Classi astratte Esercizi
Array di oggetti In Java è possibile costruire array di oggetti
public class Persona protected String cognome; protected String nome; protected String codicefiscale; protected String citta; Persona() cognome=null; nome=null; codicefiscale=null; citta=null; Persona (String c,string n,string cf,string ct) cognome=c; nome=n; codicefiscale=cf; citta=ct;
public void setcognome(string cg) cognome=cg; public String getcognome() return cognome; public void setnome(string nm) nome=nm; public String getnome() return nome; public void setcodicefiscale(string cdf) codicefiscale=cdf; public String getcodicefiscale() return codicefiscale;
public void setcitta(string ctt) citta=ctt; public String getcitta() return citta; public String AnnoNascita() String anno; anno=codicefiscale.substring(6,8);/ /metodo che permette di estrarre la sottostringa a partire dalla posizione 6 alla 8 esclusa return anno; public String tostring() return "Nome della persona: "+nome+" "+"Cognome della persona : "+cognome;
class Studente extends Persona private String corsolaurea; private int numeromatricola; Studente(String c,string n,string cd,string ct, String np, int id) super(c,n,cd,ct); corsolaurea=np; numeromatricola=id; public void setcorsolaurea(string npr) corsolaurea=npr;
public String getcorsolaurea() return corsolaurea; public void setnumeromatricola(int idf) numeroimatricola=idf; public int getnumeromatricola() return numeromatricola; @Override public String tostring() return "Nome dello studente: "+nome+" "+"Cognome dello studente : "+cognome;
Array di oggetti di tipo Studente Studente vett[]= new Studente [3]; L unica accortezza, è che in questo caso vanno istanziati anche gli oggetti che formano l array. Nel caso dell esempio ciò può essere fatto nel modo seguente: vett[0] = new Studente ("Rossi","Mario", " RSSMRA83A01H501X","Roma",Ingegneria,23); vett[1] = new Studente ("Bianchi", Francesca", " BNCFNC83A41H501O ","Roma",Fisica,10); vett[2] = new Studente("Verdi", Marcello", " VRDMCL83A30H501F ","Roma",Matematica,30); Array di oggetti
oppure Studente primo=new Studente ("Rossi","Mario", " RSSMRA83A01H501X ","Roma",Ingegneria,23); Studente secondo=new Studente ("Bianchi", Francesca", " BNCFNC83A41H501O ","Roma",Fisica,10); Studente terzo=new Studente ("Verdi", Marcello", " VRDMCL83A30H501F ","Roma",Matematica,30 Studente vett[]=primo,secondo,terzo; Array di oggetti
Esempio di definizione e uso di oggetti di tipo Persona e Array di oggetti di tipo Studente
public class UsaPersona public static void main(string[] args) int anno,ind,app,max,i; String an; Persona p=new Persona( Manzoni", Alessandro", " MNZLSN85C07F205D ", Milano"); String c=p.getcognome(); String n=p.getnome(); an=p.annonascita(); anno=integer.parseint(an); System.out.println("cognome della persona:"+c); System.out.println("il nome della persona:"+n); System.out.println("l'anno di nascita della persona:"+anno);
Persona name=new Persona( Leopardi", Giacomo", " LPRGCM98H29H211C", Recanati"); c=name.getcognome(); n=name.getnome(); an=name.annonascita(); anno=integer.parseint(an); System.out.println("cognome della persona:"+c); System.out.println("il nome della persona:"+n); System.out.println("l'anno di nascita della persona:"+anno);
Studente primo=new Studente ("Rossi","Mario", " RSSMRA83A01H501X ","Roma",Ingegneria,23); Studente secondo=new Studente ("Bianchi", Francesca", " BNCFNC83A41H501O ","Roma",Fisica,10); Studente terzo=new Studente ("Verdi", Marcello", " VRDMCL83A30H501F ","Roma",Matematica,30 Studente vett[]=primo,secondo,terzo;
max=integer.parseint(vett[0].annonascita()); ind=0; for (i=1;i<3;i++) app=integer.parseint(vett[i].annonascita()); if (max<app) max=app; ind=i; System.out.println( lo studente più giovane e':" +vett[ind].getcognome());
Vantaggi dell ereditarietà L ereditarietà facilita il riutilizzo di software estendendone o ridefinendone caratteristiche e comportamenti; è possibile adattare una classe preesistente alle nuove esigenze. Specificare le differenze da una classe simile piuttosto che ridefinire completamente la classe facilita enormemente lo sviluppo di nuovi progetti eliminando ridondanza di codice. L ereditarietà non è un meccanismo di inclusione del codice di una classe base in una derivata. Non c è copia di codice, ogni modifica della struttura di una classe base si ripercuote automaticamente nelle sue classi derivate
Gerarchia di classi L ereditarietà può estendersi a più livelli generando quindi una gerarchia di classi. Una classe derivata può, a sua volta, essere base di nuove sottoclassi. Sportivo è sottoclasse di Persona ed è superclasse di Nuotatore, Motociclista e Calciatore. Nella parte alta della gerarchia troviamo le classi generiche, scendendo aumenta il livello di specializzazione.
Gerarchia di classi class Persona class Sportivo extends Persona class Nuotatore extends Sportivo class Motociclista extends Sportivo class Calciatore extends Sportivo
Gerarchia di classi: Esercizio Codificare in Java la gerarchia di classi riportata in figura
Gerarchia di classi: Esercizio Codificare in Java la gerarchia di classi riportata in figura class Computer class PC extends Computer class Server extends Computer class Notebook extends PC class Desktop extends PC
Classi astratte Man mano che si sale nella gerarchia dell ereditarietà, le classi diventano sempre più generiche e spesso più astratte. Ad un certo punto la classe superiore diventa a tal punto generica (astratta) che la si può pensare come una base di riferimento per la costruzione delle altre classi piuttosto che come una classe concretamente utilizzabile.
Classi astratte Sono usate come superclassi astratte per sottoclassi concrete e per dichiarare riferimenti a variabili. Diverse gerarchie di ereditarietà hanno superclassi astratte che occupano i livelli più alti. Per dichiarare una classe astratta va usata la parola chiave abstract Le classi abstract contengono almeno un metodo astratto abstract (solo definito e non implementato) Tutte le sottoclassi concrete derivate da una classe astratta DEVONO fare l override dei metodi astratti
Esempio Figura protected double base abstract protected double altezza + Figura(double b, double h) + setbase(double ba) + double getbase() + setaltezza(double al) + double getaltezza() + double area (double a, double h) abstract
Esempio abstract class Figura protected double base; protected double altezza; Figura(double b,double h) base=b; altezza=h; Figura protected double base protected double altezza + Figura(double b, double h) + setbase(double ba) abstract public void setbase(double ba) base=ba; public double getbase() return base; + double getbase() + setaltezza(double al) + double getaltezza() + double area (double a, double h) abstract
Esempio public void setaltezza(double al) altezza=al; public double getaltezza() return altezza; Figura protected double base protected double altezza + Figura(double b, double h) + setbase(double ba) + double getbase() + setaltezza(double al) + double getaltezza() abstract abstract double area(double a,double h); + double area (double a, double h) abstract Nella rappresentazione UML metodi e classi astratte sono in corsivo
Esempio public void setaltezza(double al) altezza=al; public double getaltezza() return altezza; Figura Un metodo astratto consiste in una protected double base semplice definizione (in quanto non protected double altezza implementa codice), pertanto si definisce omettendo + Figura(double b, le double parentesi h) + setbase(double ba) graffe. + double getbase() + setaltezza(double al) + double getaltezza() abstract abstract double area(double a,double h); + double area (double a, double h) abstract Nella rappresentazione UML metodi e classi astratte sono in corsivo
Classi astratte Java permette di definire classi astratte ovvero classi in cui uno o più metodi non sono implementati, ma solo dichiarati, non hanno un corpo tra parentesi graffe ma solo la dichiarazione terminata con ; questi metodi sono detti astratti e vengono marcati con la parola chiave abstract. Una classe astratta deve essere marcata a sua volta con la parola chiave abstract Attenzione: un metodo vuoto () e un metodo astratto sono due cose diverse!! Una classe che ha almeno un metodo astratto si dice classe astratta Le classi non astratte si dicono concrete
Classi astratte Si noti che che non è possibile creare istanze di una classe astratta! Infatti una classe astratta viene utilizzata come superclasse comune per un insieme di sottoclassi concrete Queste sottoclassi concrete derivate da una classe astratta DEVONO fare l override dei metodi astratti!
Esempio class Rettangolo extends Figura Rettangolo(double b,double h) super(b,h); Figura protected double base protected double altezza + Figura(double b, double h) + setbase(double ba) + double getbase() abstract public double area(double b,double h) double ar=base*altezza; return ar; Rettangolo + setaltezza(double al) + double getaltezza() + double area (double a, double h) abstract Triangolo + Rettangolo(double b, double h) + double area (double a, double h) + Triangolodouble b, double h) + double area (double a, double h)
Esempio class Triangolo extends Figura Triangolo(double b,double h) super(b,h); Figura protected double base protected double altezza + Figura(double b, double h) + setbase(double ba) + double getbase() abstract + setaltezza(double al) public double area(double b,double h) + double getaltezza() + double area (double a, double h) double ar=(base*altezza)/2; abstract return ar; Rettangolo Triangolo + Rettangolo(double b, double h) + double area (double a, double h) + Triangolodouble b, double h) + double area (double a, double h)
Esempio Metodi e classi astratte sono in corsivo class TestUsaFigura public static void main(string[] args) double arearet,areatri; Figura protected double base protected double altezza + Figura(double b, double h) abstract Metodi e classi astratte sono in corsivo Rettangolo objr=new Rettangolo(6.6,3.0); + setbase(double ba) arearet=objr.area(6.6,3.0); + double getbase() System.out.println("l'area del rettangolo:" +arearet); + setaltezza(double al) + double getaltezza() triangolo objt=new triangolo(10.2,7.5); areatri=objt.area(10.2,7.5); + double area (double a, double h) abstract System.out.println("l'area del triangolo:" +areatri); Rettangolo Triangolo + Rettangolo(double b, double h) + Triangolodouble b, double h) + double area (double a, double h) + double area (double a, double h)
class UsaTriangolo public static void main(string[] args) int ar,al,bas; Triangolo objs=new Triangolo(3,6); ar=objs.area(); System.out.println("valore dell'area:" +ar); Esempio Figura protected double base abstract objs.setaltezza(10); protected double altezza objs.setbase(20); ar=objs.area(); System.out.println("la nuova area:" +ar); + Figura(double b, double h) + setbase(double ba) + double getbase() al=objs.getaltezza(); bas=objs.getbase(); System.out.println("la nuova altezza:" +al); System.out.println("la nuova base:" +bas); + setaltezza(double al) + double getaltezza() + double area (double a, double h) abstract Rettangolo Triangolo + Rettangolo(double b, double h) + double area (double a, double h) + Triangolodouble b, double h) + double area (double a, double h)
Regole Una classe abstract ha almeno un metodo astratto Non è possibile creare oggetti di classi astratte. Es. new Figura(6.6,3.0) Causa un errore È possibile creare solo oggetti di sottoclassi concrete. Es. new Rettangolo (6.6,3.0) OK
Esempio public abstract class Programmatore private String nome; private String cognome; private int anniesperienza; public Programmatore(String n, String c, int a) nome=n; cognome=g; anniesperienza=a; public abstract void programma();
public abstract class Programmatore private String nome; private Una String classe cognome; astratta è una classe che contiene metodi astratti (almeno uno ) e non può essere private int anniesperienza; istanziata direttamente, ma solo attraverso le sottoclassi ( che effettuano l'override dei metodi public astratti) Programmatore(String che derivano da n, essa. String c, int a) nome=n; Le classi astratte vengono utilizzata quando si cognome=g; preferisce definire un determinato concetto in modo generalizzato e specificare le caratteristiche anniesperienza=a; attraverso l override delle classi derivate public abstract void programma();
public abstract class Programmatore private String nome; private String cognome; private int anniesperienza; public Programmatore(String n, String c, int a) nome=n; cognome=g; Un metodo astratto consiste in una semplice anniesperienza=a; definizione (in quanto non implementa codice), pertanto si definisce omettendo le parentesi graffe. public abstract void programma();
public ProgrammatoreJava extends Programmatore public Programmatore(String n, String c, int a) super(n,c,a); public void programma() )
Esercizio Scrivere una gerarchia di classi per rappresentare figure geometriche. La gerarchia prevede una superclasse astratta Shape da cui derivano le classi TwoDimensionalShape e ThreeDimensionalShape, anch'esse classi astratte, e le sottoclassi concrete Sfera, Parallelepipedo, Cubo, Rettangolo, Quadrato, Cerchio. Devono essere disponibili i metodi perimetro, area e volume, in modo che questi calcoli possano essere effettuati, quando istanzieremo gli oggetti delle sottoclassi concrete della gerarchia. Scrivere un programma per testare la gerarchia Shape e i suoi metodi.
Cosa abbiamo imparato? E possibile definire un array di oggetti: auto vett[]= new auto[10] Cos è una classe astratta, definendone le caratteristiche principali: vengono dichiarate tramite la parola chiave abstract e contengono almeno un metodo astratto. Tutte le sottoclassi derivate da un metodo astratto devono fare l override dei metodi astratti. Un metodo astratto consiste in una semplice definizione, pertanto si definisce omettendo le parentesi graffe.