Capitolo 9 Ereditarietà e polimorfismo Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Ereditarietà Organizza gli oggetti dall'alto verso il basso, dal più generico al meno generico L'ereditarietà definisce una relazione “è un” Una mountain bike “è un” tipo di bicicletta Un'utilitaria “è un” tipo di automobile Un border collie “è un” tipo di cane Un portatile “è un” tipo di computer Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Gerarchia di strumenti musicali Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Gerarchia di strumenti musicali La gerarchia aiuta a comprendere le relazioni e le somiglianze tra gli strumenti musicali Un clarinetto “è un” tipo di strumento a fiato Gli strumenti a fiato “sono un” tipo di aerofono La relazione “è un” è transitiva Un clarinetto “è un” tipo di strumento a fiato Uno strumento a fiato “è un” tipo di aerofono Un clarinetto “è un” tipo di aerofono Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Terminologia orientata agli oggetti Nei linguaggi di programmazione orientata agli oggetti, una classe creata per estenderne un'altra è detta sottoclasse La classe utilizzata come base è detta superclasse Terminologia alternativa La superclasse è definita anche classe di base La sottoclasse è definita anche classe derivata I membranofoni I clarinetti sono un Gli strumenti ad sono un tipo di tipo di strumento ancia sono un tipo musicale ad ancia; di membranofoni; strumenti musicali; ossia, formano una ossia, formano una ossia, sono una sottoclasse dei sottoclasse degli sottocategoria degli membranofoni strumenti musicali strumenti ad ancia. In termini di programmazione, i clarinetti sono una sottoclasse degli strumenti ad ancia Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ThreeDimensionalPoint Costruire una nuova classe ThreeDimensionalPoint utilizzando l'ereditarietà ThreeDimensionalPoint estende la classe awt Point Point è la superclasse (classe di base) ThreeDimensionalPoint è la sottoclasse (classe derivata) ThreedimensionalPoint estende Point aggiungendo una nuova proprietà a Point (la coordinata z) asse y asse z (x, y, z) asse x Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Classe ThreeDimensionalPoint package Geometry; Vedere la diapositiva successiva import java.awt.*; La parola chiave extends indica che ThreeDimensionalPoint è una sottoclasse di Point public class ThreeDimensionalPoint extends Point { // costante di classe privata private final static int DEFAULT_Z = 0; // variabile istanza privata public int z = DEFAULT_Z; Nuova variabile istanza Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Pacchetti Consentono la raccolta delle definizioni in una singola entità, il pacchetto ThreeDimensionalPoint sarà aggiunta al pacchetto Geometry Le classi e i nomi nello stesso pacchetto sono memorizzati nella stessa cartella Le classi in un pacchetto appartengono al loro spazio dei nomi; pertanto, i nomi in un particolare pacchetto non sono in conflitto con altri nomi in altri pacchetti Per esempio, un pacchetto chiamato Graph potrebbe disporre di una definizione diversa di ThreeDimensionalPoint Durante la definizione dei membri di una classe o di un'interfaccia, Java non richiede una specifica di accesso esplicita. La specifica implicita è detta accesso predefinito. Ai membri di una classe con accesso predefinito possono accedere solo i membri del pacchetto Java – Guida alla programmazione - James Cohoon, Jack Davidson La madre di tutti gli oggetti Java: la classe Object Copyright © 2004 - The McGraw-Hill Companies srl Three Dimensional Point ClassClasse representing che rappresenta locations withuna an xposizione , y-, andcon z- le coordinate x, y e z. coordinates. ThreeDimensionalPoin Threet è una sottoclasse di DimensionalPoint is Point a subclass of Point. Point Class representing Classe che rappresenta locations withuna an xposizione con le and y-coordinates. coordinate x e y. Point is a subclass Point è una of Object. sottoclasse di Object Object Superclass di oftutti all Superclasse gliJava oggetti in Java objects. Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ThreeDimensionalPoint ThreeDimensionalPoint a = new ThreeDimensionalPoint(6, 21, 54); a.translate(1, 1); // invocazione della superclasse translate() a.translate(2, 2, 2); // invocazione della sottoclasse translate() Java determina il metodo da utilizzare in base al numero di parametri nell'invocazione Dopo la prima chiamata a translate, qual è il valore di a? Dopo la seconda chiamata a translate, qual è il valore di a? Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ThreeDimensionalPoint I metodi toString(), equals() e clone() non dovrebbero presentare firme diverse dalle versioni di Point ThreeDimensionalPoint c = new ThreeDImensionalPoint(1, 4, 9); ThreeDimensionalPoint d = (ThreeDimensionalPoint) c.clone(); String s = c.toString(); boolean b = c.equals(d); Cast necessario affinché il tipo restituito dal metodo clone() della sottoclasse sia Object Invocazione del metodo toString() della sottoclasse Invocazione del metodo equals() della sottoclasse Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ThreeDimensionalPoint Costruttori // ThreeDimensionalPoint(): costruttore predefinito public ThreeDimensionalPoint() { super(); } // ThreeDimensionalPoint(): costruttore specifico public ThreeDimensionalPoint(int a, int b, int c) { super(a, b); setZ(c); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ThreeDimensionalPoint Strumenti di accesso e modifica // getZ(): accesso alla coordinata z public double getZ() { return z; } // setZ(): modifica della coordinata y public void setZ(int value) { z = value; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ThreeDimensionalPoint Facilitatori // translate(): facilitatore per lo scorrimento public void translate(int dx, int dy, int dz) { translate(dx, dy); int zValue = (int) getZ(); setZ(zValue + dz); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ThreeDimensionalPoint Facilitatori // toString(): facilitatore per la conversione public String toString() { int a = (int) getX(); int b = (int) getY(); int c = (int) getZ(); return getClass() + "[" + a + ", " + b + ", " + c + "]"; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ThreeDimensionalPoint Facilitatori // equals(): facilitatore di uguaglianza public boolean equals(Object v) { if (v instanceof ThreeDimensionalPoint) { ThreeDimensionalPoint p = (ThreeDimensionalPoint) v; int z1 = (int) getZ(); int z2 = (int) p.getZ(); return super.equals(p) && (z1 == z2); } else { return false; } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ThreeDimensionalPoint Facilitatori // clone(): facilitatore per la clonazione public int int int Object clone() { a = (int) getX(); b = (int) getY(); c = (int) getZ(); return new ThreeDimensionalPoint(a, b, c); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ColoredPoint Si supponga che un'applicazione richieda l'utilizzo di punti colorati È possibile estendere naturalmente la classe Point per creare ColoredPoint La classe ColoredPoint sarà aggiunta al pacchetto geometry package Geometry; import java.awt.*; public class ColoredPoint extends Point { // variabile istanza Color color; … Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ColoredPoint Costruttori // ColoredPoint(): costruttore predefinito public ColoredPoint() { super(); setColor(Color.blue); } // ColoredPoint(): costruttore specifico public ColoredPoint(int x, int y, Color c) { super(x, y); setColor(c); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ColoredPoint Strumenti di accesso e modifica // getColor(): accesso alla proprietà color public Color getColor() { return color; } // setColor(): modifica della proprietà color public void setColor(Color c) { color = c; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ColoredPoint Facilitatori // clone(): facilitatore per la clonazione public Object clone() { int a = (int) getX(); int b = (int) getY(); Color c = getColor(); return new ColoredPoint(a, b, c); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ColoredPoint Facilitatori // toString(): facilitatore per la rappresentazione stringa public String toString() { int a = (int) getX(); int b = (int) getY(); Color c = getColor(); return getClass() + "[" + a + ", " + b + ", " + c + "]"; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ColoredPoint Facilitatori // toString(): facilitatore per la rappresentazione stringa public String toString() { int a = (int) getX(); int b = (int) getY(); Color c = getColor(); return getClass() + "[" + a + ", " + b + ", " + c + "]"; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl ColoredPoint Facilitatori // equals(): facilitatore di uguaglianza public boolean equals(Object v) { if (v instanceof ColoredPoint) { Color c1 = getColor(); Color c2 = ((ColoredPoint) v).getColor(); return super.equals(v) && c1.equals(c2); } else { return false; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Colored3DPoint Si supponga che un'applicazione necessiti di un punto colorato tridimensionale È possibile creare tale classe estendendo ThreeDimensionalPoint e ColoredPoint? No. Java non supporta l'ereditarietà molteplice Java supporta solo l'ereditarietà singola package Geometry; import java.awt.*; public class Colored3DPoint extends ThreeDimensionalPoint { // variabile istanza Color color; Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Colored3DPoint Costruttori // Colored3DPoint(): costruttore predefinito public Colored3DPoint() { setColor(Color.blue); } // Colored3DPoint(): costruttore specifico public Colored3DPoint(int a, int b, int c, Color d) { super(a, b, c); setColor(d); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Colored3DPoint Strumenti di accesso e modifica // getColor(): accesso alla proprietà color public Color getColor() { return color; } // setColor(): modifica della proprietà color public void setColor(Color c) { color = c; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Colored3DPoint Facilitatori // clone(): facilitatore per la clonazione public Object clone() { int a = (int) getX(); int b = (int) getY(); int c = (int) getZ(); Color d = getColor(); return new Colored3DPoint(a, b, c, d); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Colored3DPoint Facilitatori // toString(): facilitatore per la rappresentazione stringa public String toString() { int a = (int) getX(); int b = (int) getY(); int c = (int) getZ(); Color d = getColor(); return getClass() + "[" + a + ", " + b + ", " + c + ", " + d + "]"; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Colored3DPoint Facilitatori // equals(): facilitatore di uguaglianza public boolean equals(Object v) { if (v instanceof Colored3DPoint) { Color c1 = getColor(); Color c2 = ((Colored3DPoint) v).getColor(); return super.equals(v) && c1.equals(c2); } else { return false; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Polimorfismo Un'espressione di codice può invocare metodi diversi a seconda dei tipi di oggetti manipolati Esempio: overloading della funzione come il metodo min() di java.lang.Math Il metodo invocato dipende dai tipi di argomenti effettivi Esempio int a, b, c; double x, y, z; … c = min(a, b); // invoca min() intero z = min(x, y); // invoca min double Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Polimorfismo Due tipi di polimorfismo Polimorfismo sintattico: Java può determinare quale metodo invocare in fase di compilazione Efficiente Facile da comprendere e analizzare Detto anche polimorfismo primitivo Polimorfismo puro: il metodo da invocare può essere determinato solo in fase di esecuzione Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Polimorfismo Esempio di polimorfismo puro public class PolymorphismDemo { // main(): punto di ingresso per l'applicazione public static void main(String[] args) { Point[] p = new Point[4]; p[0] p[1] p[2] p[3] = = = = new new new new Colored3DPoint(4, 4, 4, Color.BLACK); ThreeDimensionalPoint(2, 2, 2); ColoredPoint(3, 3, Color.RED); Point(4, 4); for (int i = 0; i < p.length; ++i) { String s = p[i].toString(); System.out.println("p[" + i + "]: " + s); } return; } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Nuance dell'ereditarietà Quando viene costruito un nuovo oggetto sottoclasse, viene sempre chiamato il costruttore per la superclasse. L'invocazione del costruttore può essere implicita o esplicita Esempio public class B { // B(): costruttore predefinito public B() { System.out.println("Using B's default constructor"); } // B(): costruttore specifico public B(int i) { System.out.println("Using B's int constructor"); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Nuance dell'ereditarietà public class C extends B { // C(): costruttore predefinito public C() { System.out.println("Using C's default constructor"); System.out.println(); } // C(int a): costruttore specifico public C(int a) { System.out.println("Using C's int constructor"); System.out.println(); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Nuance dell'ereditarietà // C(int a, int b): costruttore specifico public C(int a, int b) { super(a + b); System.out.println("Using C's int-int constructor"); System.out.println(); } // main(): punto di ingresso per l'applicazione public static C c1 = new C c2 = new C c3 = new return; } void main(String[] args) { C(); C(2); C(2,4); Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Nuance dell'ereditarietà Output Using B's default constructor Using C's default constructor Using B's default constructor Using C's int constructor Using B's int constructor Using C's int-int constructor Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Controllo dell'accesso Diritti di accesso alla classe Restrizioni per i membri this Sottoclasse Pacchetto Generale public protected default private Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Controllo dell'accesso Esempio package demo; public class P { // variabile istanza private int data; // P(): costruttore predefinito public P() { setData(0); } // getData(): strumento di accesso public int getData() { return data; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Controllo dell'accesso Esempio (continua) // setData(): strumento di modifica protected void setData(int v) { data = v; } // print(): facilitatore void print() { System.out.println(); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Controllo dell'accesso Esempio import demo.P; public class Q extends P { // Q(): costruttore predefinito public Q() { Q può accedere al costruttore super(); predefinito pubblico della superclasse } // Q(): costruttore specifico public Q(int v) { setData(v); Q può accedere allo strumento di modifica protetto della superclasse } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Controllo dell'accesso Esempio // toString(): facilitatore stringa public String toString() { Q può accedere allo strumento di accesso int v = getData(); pubblico della superclasse return String.valueOf(v); } // invalid1(): metodo illegale public void invalid1() { data = 12; Q non può accedere al campo } dati privato della sottoclasse } // invalid2(): metodo illegale public void invalid2() { print(); } Q non può accedere direttamente al metodo di accesso predefinito print() della sottoclasse Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Controllo dell'accesso Esempio package demo; public class R { // variabile istanza private P p; // R(): costruttore predefinito public R() { R può accedere al costruttore predefinito pubblico di P p = new P(); } // set(): strumento di modifica public void set(int v) { R può accedere allo strumento p.setData(v); di modifica protetto di P } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Controllo dell'accesso Esempio // get(): strumento di accesso R può accedere allo public int get() { strumento di accesso return p.getData(); pubblico di P } // use(): facilitatore public void use() { R può accedere al metodo di accesso predefinito di P p.print(); } // invalid(): metodo illegale public void invalid() { p.data = 12; R non può accedere direttamente } ai dati privati di P Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Controllo dell'accesso Esempio import demo.P; public class S { // variabile istanza private P p; // S(): costruttore predefinito S può accedere al valore public S() { predefinito pubblico del p = new P(); costruttore di P } // get(): strumento di ispezione S può accedere allo strumento public int get() { di accesso pubblico di P return p.getData(); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Controllo dell'accesso Esempio } // illegal1(): metodo illegale public void illegal1(int v) { S non può accedere ai valori p.setData(v); protetti dello strumento } di modifica di P // illegal2(): metodo illegale public void illegal2() { S non può accedere direttamente p.data = 12; al campo dati privato di P } // illegal3(): metodo illegale public void illegal3() { p.print(); S non può accedere direttamente } al metodo di accesso predefinito print() di P Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Campi dati La variabile istanza di una superclasse può essere nascosta dalla definizione della sottoclasse di una variabile istanza con lo stesso nome Esempio public class D { // variabile istanza D protected int d; // D(): costruttore predefinito public D() { d = 0; } // D(): costruttore specifico public D(int v) { d = v; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Campi dati Classe D (continua) // printD(): facilitatore public void printD() { System.out.println("D's d: " + d); System.out.println(); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Campi dati La classe F estende D e introduce una nuova variabile istanza chiamata d. La definizione di d da parte di F nasconde la definizione eseguita da D. public class F extends D { // variabile istanza F int d; // F(): costruttore specifico Modifica di d public F(int v) { appartenente a this d = v; super.d = v*100; } Modifica di d appartenente alla superclasse Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Campi dati Classe F (continua) // printF(): facilitatore public void printF() { System.out.println("D's d: " + super.d); System.out.println("F's d: " + this.d); System.out.println(); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Ereditarietà e tipi Esempio public class X { // costruttore predefinito public X() { // nessun corpo necessario } // isX(): metodo di classe public static boolean isX(Object v) { return (v instanceof X); } // isObject(): metodo di classe public static boolean isObject(X v) { return (v instanceof Object); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Ereditarietà e tipi Esempio public class Y extends X { // Y(): costruttore predefinito public Y() { // nessun corpo necessario } // isY(): metodo di classe public static boolean isY(Object v) { return (v instanceof Y); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Ereditarietà e tipi public X x Y y X z Esempio (continua) static void main(String[] args) { = new X(); = new Y(); = y; System.out.println("x is an Object: " + X.isObject(x)); System.out.println("x is an X: " + X.isX(x)); System.out.println("x is a Y: " + Y.isY(x)); System.out.println(); Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Ereditarietà e tipi Esempio (continua) System.out.println("y is an Object: " + X.isObject(y)); System.out.println("y is an X: " + X.isX(y)); System.out.println("y is a Y: " + Y.isY(y)); System.out.println(); System.out.println("z is an Object: " + X.isObject(z)); System.out.println("z is an X: " + X.isX(z)); System.out.println("z is a Y: " + Y.isY(z)); return; } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Ereditarietà e tipi Output del programma: x is an Object: true x is an X: true x is a Y: false y is an Object: true y is an X: true y is a Y: true z is an Object: true z is an X: true z is a Y: true Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Polimorfismo e late binding Esempio public class L { // L(): costruttore predefinito public L() { } // f(): facilitatore public void f() { System.out.println("Using L's f()"); g(); } // g(): facilitatore public void g() { System.out.println("using L's g()"); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Polimorfismo e late binding Esempio public class M extends L { // M(): costruttore predefinito public M() { // nessun corpo necessario } // g(): facilitatore public void g() { System.out.println("Using M's g()"); } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Polimorfismo e late binding Esempio // main(): punto di ingresso per l'applicazione public static void main(String[] args) { L l = new L(); M m = new M(); l.f(); m.f(); return; } } Output Using using Using Using L's L's L's M's f() g() f() g() Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Finalità Una classe final è una classe che non può essere estesa. Gli sviluppatori potrebbero voler impedire agli utenti di estendere certe classi Rende più difficile l'intromissione mediante overriding Esempio final public class U { // U(): costruttore predefinito public U() { } // f(): facilitatore public void f() { System.out.println("f() can’t be overridden: U is final"); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Finalità Un metodo final è un metodo che non può essere sovrascritto Esempio public class V { // V(): costruttore predefinito public V() { } // f(): facilitatore final public void f() { System.out.println("Final method f() can’t be " + " overridden"); } } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Classi di base astratte Consentono la creazione di classi con metodi che corrispondono a un concetto astratto (vale a dire che non c'è un'implementazione) Si supponga di voler creare una classe GeometricObject Metodi concreti ragionevoli comprendono getPosition() setPosition() getColor() setColor() paint() Per tutti tranne paint(), è possibile creare implementazioni. Per paint(), occorre conoscere il tipo di oggetto da dipingere. È un quadrato, un triangolo ecc. Il metodo paint() dovrebbe essere un metodo astratto Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Classi di base astratte Esempio import java.awt.*; Trasforma GeometricObject in una classe astratta abstract public class GeometricObject { // variabili istanza Point position; Color color; // getPosition(): restituisce la posizione dell'oggetto public Point getPosition() { return position; } // setPosition(): aggiorna la posizione dell'oggetto public void setPosition(Point p) { position = p; } Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Classi di base astratte Esempio (continua) // getColor(): restituisce il colore dell'oggetto public Color getColor() { return color; } // setColor(): aggiorna il colore dell'oggetto public void setColor(Color c) { color = c; } // paint(): rappresenta la forma nel contesto grafico g abstract public void paint(Graphics g); } Indica che una implementazione del metodo paint() non verrà fornita Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Interfacce Un'interfaccia è un modello che specifica che cosa deve essere presente in una classe che implementa l'interfaccia Un'interfaccia non può specificare qualsiasi implementazione di un metodo Tutti i metodi di un'interfaccia sono pubblici Tutte le variabili definite in un'interfaccia sono public, final e static Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Interfacce Un'interfaccia per un oggetto colorabile public interface Colorable { // getColor(): restituisce il colore dell'oggetto public Color getColor(); // setColor(): imposta il colore dell'oggetto public void setColor(Color c); } Ora l'interfaccia può essere utilizzata per creare classi che implementano l'interfaccia Java – Guida alla programmazione - James Cohoon, Jack Davidson Copyright © 2004 - The McGraw-Hill Companies srl Interfacce ColorablePoint import java.awt.*; public class ColorablePoint extends Point implements Colorable { La classe ColorablePoint deve // variabile istanza fornire le implementazioni di Color color; getColor() e setColor() // ColorablePoint(): costruttore predefinito public ColorablePoint() { super(); setColor(Color.blue); } …