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