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);
}
…