Concetti di OOP Concetti di OOP
OOP = Object Oriented Programming OOP = Object Oriented Programming OOPS = Object Oriented Mistakes OOPS = Object Oriented Mistakes
Corso di Programmazione Corso di Programmazione CdS:
CdS: Informatica e Tecnologie Informatica e Tecnologie per la Produzione di Software per la Produzione di Software Nicola Fanizzi Nicola Fanizzi
fanizzi@di.uniba.it
fanizzi@di.uniba.it
2 2
Introduzione: Concetti OOP Introduzione: Concetti OOP
Oggetti e Classi Oggetti e Classi
classi e istanziazioneclassi e istanziazione
Information Hiding Information Hiding
accessoaccesso publicpublic e e privateprivate
Ereditarietà Ereditarietà
estendere le classi: gerarchiaestendere le classi: gerarchia
ereditarietà multipla: le interfacceereditarietà multipla: le interfacce
accesso accesso protectedprotected
Polimorfismo Polimorfismo
late-bindinglate-binding
già incontrati già incontrati
3 3
Ereditarietà Ereditarietà
Possibilità di definire nuove classi utilizzando come Possibilità di definire nuove classi utilizzando come punto di partenza classi pre-esistenti
punto di partenza classi pre-esistenti
L'ereditarietà organizza astrazioni di oggetti L'ereditarietà organizza astrazioni di oggetti dai più generici ai più specifici
dai più generici ai più specifici
L'ereditarietà stabilisce una relazione L'ereditarietà stabilisce una relazione
"
" è un è un " "
Esempi:
Esempi:
Una mountain bike Una mountain bike è unè un tipo di bicicletta tipo di bicicletta
Un'utilitaria Un'utilitaria è un tipo di automobileè un tipo di automobile
Un'automobile Un'automobile è un tipo di veicoloè un tipo di veicolo
Un portatile Un portatile è un tipo di computerè un tipo di computer
4 4
Gerarchia degli Strumenti Gerarchia degli Strumenti
Musicali Musicali
Strumenti Musicali Strumenti Musicali
Idiofoni Idiofoni Membranofoni Membranofoni
Aerofoni Aerofoni
Cordofoni Cordofoni Elettrofoni Elettrofoni
Ad Ancia Ad Ancia
A Canna A Canna A Bocchino A Bocchino
Clarinetto Clarinetto Sassofono Sassofono
Fagotto Fagotto
5 5
Gerarchia Gerarchia
Strumenti Musicali Strumenti Musicali
La gerarchia aiuta a comprendere le relazioni e le La gerarchia aiuta a comprendere le relazioni e le somiglianze tra gli strumenti musicali
somiglianze tra gli strumenti musicali
Un clarinetto “è un” tipo di strumento a fiatoUn clarinetto “è un” tipo di strumento a fiato
Gli strumenti a fiato “sono un” tipo di aerofonoGli strumenti a fiato “sono un” tipo di aerofono
NB: NB: La relazione La relazione è un è un è è transitiva transitiva
Un clarinetto è unUn clarinetto tipo di strumento a fiato tipo di strumento a fiato
Uno strumento a fiato è unUno strumento a fiato tipo di aerofono tipo di aerofono
Un clarinetto è unUn clarinetto tipo di aerofono tipo di aerofono
6 6
Estensione: Terminologia Estensione: Terminologia
Estensione Estensione (o (o derivazione derivazione ) di classi ) di classi
definizione di una classe a partire da un’altra classe definizione di una classe a partire da un’altra classe mediante l’aggiunta e/o la specializzazione di
mediante l’aggiunta e/o la specializzazione di caratteristiche (attributi e/o comportamenti) caratteristiche (attributi e/o comportamenti)
classe base
classe base detta anche super-classe detta anche super-classe classe estesa
classe estesa detta anche detta anche derivataderivata ovvero ovvero sotto-classesotto-classe
Clarinetto
Clarinetto StrumentoStrumento ad ancia
ad ancia AerofonoAerofono StrumentoStrumento musicale musicale
7 7
Estensione Estensione
In Java si utilizza la parola chiave extendsIn Java si utilizza la parola chiave extends nell’intestazione della classe derivata
nell’intestazione della classe derivata
NB:NB: non è constentito estendere più di una classe non è constentito estendere più di una classe
public class Clarinetto public class Clarinetto extends
extends StrumentoAdAncia {...} StrumentoAdAncia {...}
Un oggetto di una sottoclasse, quindi, ha più tipi:Un oggetto di una sottoclasse, quindi, ha più tipi:
per dichiarazione, è del tipo della sottoclasseper dichiarazione, è del tipo della sottoclasse
è un oggetto specializzato del tipo della superclasseè un oggetto specializzato del tipo della superclasse
Clarinetto cl1 = new Clarinetto();
Clarinetto cl1 = new Clarinetto();
8 8
Classe
Classe Persona Persona
1.1. class Persona { class Persona {
2.2. private String nome;private String nome;
3.3. private String cognome;private String cognome;
4.4.
5.5. public Persona(String nome, String cognome) { public Persona(String nome, String cognome) {
6.
6. this.nome = nome; this.cognome = cognome; this.nome = nome; this.cognome = cognome;
7.7. } }
8.8.
9.
9. public String getNome() { return nome; } public String getNome() { return nome; }
10.10.
11.11. public String getCognome() { return cognome; } public String getCognome() { return cognome; }
12.12.
13.13. public String toString() { public String toString() {
14.14. return getNome() + “ ” + getCognome() + "."; return getNome() + “ ” + getCognome() + ".";
15.
15. } }
9 9
Classe
Classe Studente Studente
1.1. class Studente extends Persona { class Studente extends Persona {
2.2. private int matricola; private int matricola;
3.3.
4.4. public Studente(String n, String c, int m) { public Studente(String n, String c, int m) {
5.5. super(n, c); super(n, c);
this.matricola = m;
this.matricola = m;
6.6. } }
8.8. public String getMatricola() { public String getMatricola() { return matricola;}
return matricola;}
10.10. public String toString() { public String toString() {
11.
11. return getNome() + "" + getCognome() + return getNome() + "" + getCognome() + ", matr. " + matricola + ".";
", matr. " + matricola + ".";
12.12. } }
} // classe Studente } // classe Studente
10 10
Uso di Classi Derivate Uso di Classi Derivate
1.1. Persona p1; Persona p1;
2.2. Studente s3; Studente s3;
3.3.
4.4. p1 = new Persona("Guglielmo", "Cancelli"); p1 = new Persona("Guglielmo", "Cancelli");
5.5. System.out.println(p1.getNome()); System.out.println(p1.getNome());
6.6. // Guglielmo // Guglielmo
7.7. System.out.println(p1.toString()); System.out.println(p1.toString());
8.8. // Guglielmo Cancelli. // Guglielmo Cancelli.
9.9.
10.
10.s3 = new Studente("Marisa", "Monte", 123456); s3 = new Studente("Marisa", "Monte", 123456);
11.11.System.out.println(s3.getCognome()); System.out.println(s3.getCognome());
12.12. // Monte // Monte
13.
13.System.out.println(s3.getMatricola()); System.out.println(s3.getMatricola());
14.14. // 123456 // 123456
15.15.System.out.println(s3.toString()); System.out.println(s3.toString());
11 11
Classi
Classi Persona Persona e e Studente Studente
nome : String cognome : String
Persona(String n, String c) String getNome()
String getCognome() String toString()
Persona
estende
matricola : int
Studente(String n, String c, int m) String getMatricola()
Studente
nome = "Guglielmo"
cognome = "Cancelli"
String getNome() String getCognome() String toString()
p1 : Persona
nome = "Marisa"
cognome = "Monte"
matricola = "123456"
String getNome() String getCognome() String getmatricola()
s3 : Studente
12 12
Quando viene costruito un nuovo oggetto Quando viene costruito un nuovo oggetto
sottoclasse, viene sempre chiamato il costruttore sottoclasse, viene sempre chiamato il costruttore
per la superclasse per la superclasse
L'invocazione del costruttore della superclasse L'invocazione del costruttore della superclasse può essere:
può essere:
implicitaimplicita
chiamato del costruttore di
chiamato del costruttore di defaultdefault della classe base della classe base
esplicitaesplicita
chiamata di
chiamata di super()super() all'inizio del costruttore della all'inizio del costruttore della classe derivata
classe derivata
Ereditarietà: Costruttori
Ereditarietà: Costruttori
13 13
Ereditarietà: Costruttori Ereditarietà: Costruttori
public class
public class B { B { public public B() { B() {
System.out.println("B1"); System.out.println("B1");
} }
public public B(int B(int i) i) {{
System.out.println("B2");System.out.println("B2");
} }
} // classe B} // classe B public class
public class C extends C extends B { B { public public C() { C() {
System.out.println("C1"); System.out.println("C1");
System.out.println(); System.out.println();
} }
// segue...
// segue...
//...
//...
publicpublic C( C(intint a) a) {{
System.out.println("C1");
System.out.println("C1");
System.out.println();
System.out.println();
}}
public
public C( C(intint a, a, intint b) b) {{ super
super(a + b);(a + b);
System.out.println("C2");
System.out.println("C2");
System.out.println();
System.out.println();
}}
publicpublic staticstatic voidvoid main main (String[] args)
(String[] args) {{ C o1 =
C o1 = new C();new C();
C o2 =
C o2 = new C(2);new C(2);
C o3 =
C o3 = new C(2,4);new C(2,4);
B1B1 C1C1 B1B1 C2C2 B2B2 C2C2
14 14
Accesso
Accesso protected protected
Nella definizione di gerarchie di classi, Nella definizione di gerarchie di classi, l’uso dei soli modificatori
l’uso dei soli modificatori public public e e private
private è troppo restrittivo è troppo restrittivo
viene di solito usato il modificatore viene di solito usato il modificatore protected
protected
livello di restrizione dell’accesso intermedio livello di restrizione dell’accesso intermedio
tra tra public public e e private private
15 15
Accesso
Accesso package package
Un'istruzione packageUn'istruzione package indica che le definizioni successive fanno indica che le definizioni successive fanno parte di una collezione più vasta, detta
parte di una collezione più vasta, detta pacchettopacchetto
Classi (ed interfacce) vanno messe in un pacchettoClassi (ed interfacce) vanno messe in un pacchetto
per motivi organizzativi (modularità)per motivi organizzativi (modularità)
per motivi di accessoper motivi di accesso
Per evitare conflitti sui nomi, Java inserisce le classi di un pacchetto Per evitare conflitti sui nomi, Java inserisce le classi di un pacchetto in uno spazio di nomi (
in uno spazio di nomi (name spacename space) separato e distinto (per ogni ) separato e distinto (per ogni pacchetto).
pacchetto).
Specifica predefinita: ai membri di una classe senza specifica di Specifica predefinita: ai membri di una classe senza specifica di accesso possono accedere solo i membri del pacchetto
accesso possono accedere solo i membri del pacchetto
due classi dello stesso pacchetto hanno implicitamente accesso due classi dello stesso pacchetto hanno implicitamente accesso public
public e protected e protected
16 16
Diritti di Accesso Diritti di Accesso
private private
default default
protected protected
public public
generale generale pacchetto
pacchetto sottoclasse
sottoclasse thisthis
restrizione restrizione per i membri per i membri
17 17
Controllo dell'Accesso Controllo dell'Accesso
Esempio 1 Esempio 1
package
package demo; demo;
public class
public class P { P { private int
private int data; data;
public
public P() P() {{ setData(0);
setData(0);
}}
public int getData() public int getData() {{
return data;
return data;
}}
protected void setData protected void setData (int v)
(int v) {{
data = v;
data = v;
}}
void print() void print() {{
System.out.println();System.out.println();
}}
} // class P} // class P
18 18
Controllo dell'Accesso Controllo dell'Accesso
Esempio 2 Esempio 2
import demo.P;
import demo.P;
public class Q extends P public class Q extends P {{ public Q() public Q() {{
super();super();
}}
public Q(int v) public Q(int v) {{ setData(v);setData(v);
}}
public String toString()public String toString(){{ int v = getData(); int v = getData();
return String.valueOf(v);return String.valueOf(v);
}}
public void invalid1() public void invalid1() {{ data = 12; data = 12;
}}
public void invalid2() public void invalid2() {{ print();print();
}}
} // class Q} // class Q
19 19
Controllo dell'Accesso Controllo dell'Accesso
Esempio 3 Esempio 3
package demo;
package demo;
public class R public class R {{
private P p;
private P p;
public R() public R() {{
p = new P();
p = new P();
}}
public void set(int v) public void set(int v) {{
p.setData(v);
p.setData(v);
}}
public int get() public int get() {{
return p.getData();
return p.getData();
}}
public void use() public void use() {{
p.print();
p.print();
}}
public void invalid() public void invalid() {{
p.data = 12;
p.data = 12;
}} } } //R//R
20 20
Controllo dell'Accesso Controllo dell'Accesso
Esempio 4 Esempio 4
import demo.P;
import demo.P;
public class S public class S {{
private P p;
private P p;
public S() public S() {{
p = new P();
p = new P();
}}
public int get() public int get() {{
return p.getData();
return p.getData();
}}
public void illegal1 public void illegal1
(int v) (int v) {{
p.setData(v);
p.setData(v);
}}
public void illegal2 public void illegal2 () {() {
p.data = 12;
p.data = 12;
}}
public void illegal3 public void illegal3 () {() {
p.print();
p.print();
}} } // S} // S
21 21
Attributi ed Ereditarietà Attributi ed Ereditarietà
Un attributo/metodo di una Un attributo/metodo di una
superclasse può essere nascosto superclasse può essere nascosto
dalla definizione nella sottoclasse dalla definizione nella sottoclasse
di un attributo/metodo con lo di un attributo/metodo con lo
stesso nome
stesso nome
22 22
Attributi ed Ereditarietà Attributi ed Ereditarietà
public class D public class D {{
protected int d;
protected int d;
public D() public D() {{
d = 0;
d = 0;
}}
public D(int v) public D(int v) {{
d = v;
d = v;
}}
public void printD() public void printD() {{
System.out.println("in D, d =
System.out.println("in D, d = " + d);" + d);
System.out.println();
System.out.println();
}} }}
23 23
Attributi ed Ereditarietà Attributi ed Ereditarietà
public class F extends D public class F extends D {{
int d;
int d;
public F(int v) public F(int v) {{
d = v;
d = v;
super.d = v*100;
super.d = v*100;
}}
public void printF() public void printF() {{
System.out.println("in D, d =
System.out.println("in D, d = " + super.d);" + super.d);
System.out.println("in F, d =
System.out.println("in F, d = " + this.d);" + this.d);
System.out.println();
System.out.println();
}}
La classe
La classe F estende F estende D e D e introduce una nuova introduce una nuova
variabile istanza variabile istanza dd. .
La definizione di
La definizione di d in d in F F nasconde la definizione nasconde la definizione
eseguita da eseguita da DD
24 24
Operatore
Operatore instanceof instanceof
1.1. Persona p; Persona p;
2.2. Studente s; Studente s;
4.4. p = new Persona("Antonio", "Stornaiolo"); p = new Persona("Antonio", "Stornaiolo");
5.5. s = new Studente("Emilio", "Solfrizzi", 543210); s = new Studente("Emilio", "Solfrizzi", 543210);
7.7. System.out.println(p instanceof Persona); System.out.println(p instanceof Persona);
8.8. // true // true
9.9. System.out.println(p instanceof Studente); System.out.println(p instanceof Studente);
10.
10. // false // false
11.11.System.out.println(s instanceof Persona); System.out.println(s instanceof Persona);
12.12. // true // true
13.
13.System.out.println(s instanceof Studente); System.out.println(s instanceof Studente);
14.14. // true // true
25 25
Ereditarietà e Tipi Ereditarietà e Tipi
public class X public class X {{ public X() public X() {{
// corpo non necessario// corpo non necessario }}
public static boolean public static boolean isX(Object v) isX(Object v) {{
return (v instanceof X); return (v instanceof X);
}}
public static booleanpublic static boolean isObj(X v) isObj(X v) {{
return (v instanceof return (v instanceof Object);
Object);
}} } } // X// X
public class Y extends X { public class Y extends X { public Y() {public Y() {
// corpo non necessario // corpo non necessario }}
public static boolean isYpublic static boolean isY (Object v) {
(Object v) {
return (v instanceof Y);
return (v instanceof Y);
}}
// continua...
// continua...
26 26
Corso di Programmazione (IPSW) © 2004 S.Ferilli & N.Fanizzi - dib - UniBA Corso di Programmazione (IPSW) © 2004 S.Ferilli & N.Fanizzi - dib - UniBA
Ereditarietà e Tipi Ereditarietà e Tipi
public static void public static void
main(String[] args) main(String[] args) {{ X x = new X(); X x = new X();
Y y = new Y(); Y y = new Y();
X z = y; X z = y;
System.out.println("x System.out.println("x is an Object:
is an Object: " + " + X.isObj(x));
X.isObj(x));
System.out.println("x System.out.println("x is an X:
is an X: " + X.isX" + X.isX (x));
(x));
System.out.println("x System.out.println("x is a Y:
is a Y: " + Y.isY(x));" + Y.isY(x));
System.out.println("y System.out.println("y is an Object:
is an Object: " + " + X.isObj(y));
X.isObj(y));
System.out.println("y System.out.println("y is an X:
is an X: " + X.isX" + X.isX (y));
(y));
System.out.println("y System.out.println("y is a Y:
is a Y: " + Y.isY(y));" + Y.isY(y));
System.out.println("z System.out.println("z is an Object:
is an Object: " + " + X.isObj(z));
X.isObj(z));
System.out.println("z System.out.println("z is an X:
is an X: " + X.isX" + X.isX (z));
(z));
System.out.println("z System.out.println("z is a Y:
is a Y: " + Y.isY(z));" + Y.isY(z));
27 27
Ereditarietà e Tipi Ereditarietà e Tipi
Output del programma:
Output del programma:
x is an Object:
x is an Object: truetrue x is an X:
x is an X: truetrue x is a Y:
x is a Y: falsefalse y is an Object:
y is an Object: truetrue y is an X:
y is an X: truetrue y is a Y:
y is a Y: truetrue z is an Object:
z is an Object: truetrue z is an X:
z is an X: truetrue z is a Y:
z is a Y: truetrue
28 28
Finalizzazione di Classi Finalizzazione di Classi
Una classe finalUna classe final è una classe che non può essere estesa è una classe che non può essere estesa
Gli sviluppatori potrebbero voler impedire agli utenti di estendere Gli sviluppatori potrebbero voler impedire agli utenti di estendere certe classi
certe classi
Rende più difficile l'intromissione mediante sovrascrittura Rende più difficile l'intromissione mediante sovrascrittura (overriding)
(overriding) final public class
final public class U U {{ // U():
// U(): costruttore predefinitocostruttore predefinito public
public U() U() {{ }}
// f():
// f(): facilitatorefacilitatore public
public voidvoid f() f() {{
System.out.println("f() non può essere sovrascritto:
System.out.println("f() non può essere sovrascritto:
U e' finale");
U e' finale");
}} }}
29 29
Finalizzazione di Metodi Finalizzazione di Metodi
Un metodo Un metodo final final è un metodo che non può è un metodo che non può essere sovrascritto
essere sovrascritto
public class
public class V V {{ public
public V() V() {{ }}
final
final publicpublic void f() void f() {{
System.out.println("il metodo finale f System.out.println("il metodo finale f () non può essere sovrascritto");
() non può essere sovrascritto");
}} }}
30 30
Ereditarietà e Polimorfismo Ereditarietà e Polimorfismo
Polimorfismo Polimorfismo letteralmente: da
letteralmente: da molte forme molte forme
un oggetto di una classe viene considerato un oggetto di una classe viene considerato secondo varie sfaccettature
secondo varie sfaccettature
p. di tipo statico e p. di tipo statico e
p. di tipo dinamico ( p. di tipo dinamico ( late binding late binding ) )
in pratica in pratica
è possibile assegnare è possibile assegnare
il riferimento a un oggetto della classe estesa il riferimento a un oggetto della classe estesa
a una variabile il cui tipo è la classe base
a una variabile il cui tipo è la classe base
31 31
Polimorfismo Polimorfismo
Un'espressione di codice può invocare metodi Un'espressione di codice può invocare metodi diversi a seconda dei tipi di oggetti manipolati diversi a seconda dei tipi di oggetti manipolati
Esempio: Esempio: overloading della funzione come il overloading della funzione come il metodo
metodo min() min() di di java.lang.Math java.lang.Math
Il metodo invocato dipende dai tipi di argomenti Il metodo invocato dipende dai tipi di argomenti effettivi
effettivi
int a, b, c;int a, b, c;
double
double x, y, z; x, y, z;
……
c = min(a, b);
c = min(a, b); // invoca min() su interi// invoca min() su interi z = min(x, y);
z = min(x, y); // invoca min() su double// invoca min() su double
32 32
Polimorfismo Polimorfismo
Due tipi di polimorfismo Due tipi di polimorfismo
Polimorfismo Polimorfismo sintattico sintattico : determinare quale : determinare quale metodo invocare in fase di compilazione
metodo invocare in fase di compilazione
Efficiente Efficiente
Facile da comprendere e analizzare Facile da comprendere e analizzare
Detto anche polimorfismo
Detto anche polimorfismo primitivoprimitivo
Polimorfismo Polimorfismo puro puro : il metodo da invocare : il metodo da invocare può essere determinato solo in fase di
può essere determinato solo in fase di esecuzione
esecuzione
33 33
PolymorphismDemo PolymorphismDemo
// Esempio di polimorfismo puro // Esempio di polimorfismo puro public
public classclass PolymorphismDemo { PolymorphismDemo { public
public static static voidvoid main(String[] args) main(String[] args) {{ Point[] p =
Point[] p = newnew Point[4]; Point[4];
p[0] =
p[0] = newnew Colored3DPoint(4, 4, 4, Color.BLACK); Colored3DPoint(4, 4, 4, Color.BLACK);
p[1] =
p[1] = newnew ThreeDimensionalPoint(2, 2, 2); ThreeDimensionalPoint(2, 2, 2);
p[2] =
p[2] = newnew ColoredPoint(3, 3, Color.RED); ColoredPoint(3, 3, Color.RED);
p[3] =
p[3] = newnew Point(4, 4); Point(4, 4);
for (int i = 0; i < p.length; ++i) for (int i = 0; i < p.length; ++i) {{ String s = p[i].toString();
String s = p[i].toString();
System.out.println("p[" + i + "]:
System.out.println("p[" + i + "]: " + s);" + s);
}}
return return;; }}
34 34
Polimorfismo Polimorfismo
Esempio Esempio
1.1. Persona r; Persona r;
2.2.
3.3. r = r =
new Studente("Lino", "Torvaldi", 987654);
new Studente("Lino", "Torvaldi", 987654);
4.4.
5.5. System.out.println(r.toString()); System.out.println(r.toString());
6.6. // Lino Torvaldi, matr. 987654. // Lino Torvaldi, matr. 987654.
7.7. // E NON Lino Torvaldi. // E NON Lino Torvaldi.
9.9. System.out.println(r.getMatricola()); System.out.println(r.getMatricola());
10.10. // NO, ERRORE (IN COMPILAZIONE)! // NO, ERRORE (IN COMPILAZIONE)!
35 35
Late Binding Late Binding
public class L public class L {{
// L():
// L(): costruttore predefinitocostruttore predefinito public L()
public L() {{ }}
// f():
// f(): facilitatorefacilitatore public void f()
public void f() {{
System.out.println("Uso f() di L");
System.out.println("Uso f() di L");
g();g();
}}
// g():
// g(): facilitatorefacilitatore public void g()
public void g() {{
System.out.println("Uso g() di L");
System.out.println("Uso g() di L");
}} }}
36 36
Late Binding Late Binding
public class M extends L public class M extends L {{
// M():
// M(): costruttore predefinitocostruttore predefinito public M()
public M() { { // nessun corpo necessario// nessun corpo necessario }}
// g():
// g(): facilitatorefacilitatore public void g()
public void g() {{
System.out.println("Uso g() di M");
System.out.println("Uso g() di M");
}}
public static void main(String[] args) public static void main(String[] args) {{
L l = new L();
L l = new L();
M m = new M();
M m = new M();
l.f();
l.f();
m.f();
m.f();
return;
return;
}}
Output Output
Uso f() di L Uso f() di L Uso g() di L Uso g() di L Uso Uso f() di Lf() di L
37 37
Cast Cast
1.1. Persona p; Persona p;
2.2. Studente s; Studente s;
3.3.
4.4. p = new Studente("Letizia", p = new Studente("Letizia",
"Arnaboldi", 000000);
"Arnaboldi", 000000);
5.5.
6.6. s = (Studente)p; s = (Studente)p;
7.
7. System.out.println("matr." + s.getMatricola()); System.out.println("matr." + s.getMatricola());
8.8. // matr. 000000 // matr. 000000
38 38
Classe
Classe Object Object
Ogni classe implicitamente o esplicitamenteOgni classe implicitamente o esplicitamente estende la classe più estende la classe più generica
generica ObjectObject,, definita nel package definita nel package java.langjava.lang Metodi
Metodi
toString()toString()
equals()equals()
clone()clone()
getClass()getClass()
finalize()finalize()
hashCode() hashCode()
wait(), wait(long), wait(long,int) wait(), wait(long), wait(long,int)
come si vedrà, i metodi possono essere ridefiniti nelle classi derivatecome si vedrà, i metodi possono essere ridefiniti nelle classi derivate
39 39
Metodo
Metodo equals equals
Esempio Esempio
1.1. int x,y; // coordinateint x,y; // coordinate
2.2.
3.3. public boolean equals(Punto p) { public boolean equals(Punto p) {
4.4. // pre: p!=null// pre: p!=null
5.
5. return (this.x == p.x) && (this.y == p.y); return (this.x == p.x) && (this.y == p.y);
6.6. } }
7.7.
8.8. public boolean equals(Object p) { public boolean equals(Object p) {
9.9. // pre: p!=null // pre: p!=null
10.10. boolean uguali; boolean uguali;
11.11. if (p instanceof Punto) if (p instanceof Punto)
12.
12. uguali = this.equals((Punto) p); uguali = this.equals((Punto) p);
13.13. else else
14.14. uguali = false; uguali = false;
40 40
Classi:
Classi:
Ereditarietà e Progettazione Ereditarietà e Progettazione
L’ereditarietà (in generale) è una tecnica L’ereditarietà (in generale) è una tecnica che va tenuta in considerazione nella
che va tenuta in considerazione nella progettazione delle classi
progettazione delle classi
prima prima si progetta la gerarchia delle classi si progetta la gerarchia delle classi
criteri per decidere se una classe può essere definita criteri per decidere se una classe può essere definita
come estensione di una classe come estensione di una classe
poi poi vengono implementate le classi vengono implementate le classi
41 41
Classi Astratte Classi Astratte
Una Una classe astratta classe astratta è una classe implementata è una classe implementata in modo
in modo parziale parziale
metodi astratti:metodi astratti: viene specificata la loro viene specificata la loro intestazione ma non il loro corpo
intestazione ma non il loro corpo
una classe astratta una classe astratta nonnon può essere istanziata può essere istanziata
Utilità delle classi astratte Utilità delle classi astratte
definire un comportamento comune le classi derivatedefinire un comportamento comune le classi derivate
dichiarare le funzionalità che devono essere dichiarare le funzionalità che devono essere
implementate da tutte le classi che la estendono implementate da tutte le classi che la estendono
una classeuna classe senza metodi astratti è detta senza metodi astratti è detta concretaconcreta
42 42
Classi Astratte Classi Astratte
Esempio Esempio
Si supponga di voler creare una classe Si supponga di voler creare una classe GeometricObject
GeometricObject
Metodi concreti ragionevoli comprendonoMetodi concreti ragionevoli comprendono
getPosition() getPosition() setPosition() setPosition()
getColor() getColor() setColor() setColor()
paint() paint()
Per tutti tranne Per tutti tranne paint()paint(), è possibile creare , è possibile creare implementazioni.
implementazioni.
Per Per paint()paint(), occorre conoscere il tipo di oggetto da , occorre conoscere il tipo di oggetto da disegnare: è un quadrato, un triangolo ecc.
disegnare: è un quadrato, un triangolo ecc.
Il metodo Il metodo paint()paint() dovrebbe essere un metodo astratto dovrebbe essere un metodo astratto
43 43
Classi Astratte Classi Astratte
Esempio Esempio
import java.awt.*;
import java.awt.*;
abstract public class GeometricObject abstract public class GeometricObject {{
Point position;
Point position;
Color color;
Color color;
public Point getPosition() public Point getPosition() {{
return position;
return position;
}}
public void setPosition(Point p) public void setPosition(Point p) {{
position = p;
position = p;
}}
public Color getColor() public Color getColor() {{
return color;
return color;
}}
public void setColor(Color c) public void setColor(Color c) {{
color = c;
color = c;
}}
44 44
Classe Astratta
Classe Astratta Forma Forma
1.1. abstract class Forma { abstract class Forma {
2.2. protected String colore; protected String colore;
3.3.
4.4. public Forma(String colore) { public Forma(String colore) {
5.5. this.colore = colore; this.colore = colore;
6.
6. } }
7.7.
8.8. public String colore() { public String colore() {
9.
9. return colore; return colore;
10.10. } }
11.11.
12.12. // Ogni forma deve saper calcolare la sua area// Ogni forma deve saper calcolare la sua area
13.13. public abstract double area(); public abstract double area();
14.14.
15.
15. } }
45 45
Classe Concreta
Classe Concreta Quadrato Quadrato
1.1. class Quadrato extends Forma { class Quadrato extends Forma {
2.2. protected double lato; protected double lato;
3.3.
4.4. public Quadrato(double lato, String colore) { public Quadrato(double lato, String colore) {
5.5. super(colore); super(colore);
6.
6. this.lato = lato; this.lato = lato;
7.7. } }
8.8.
9.
9. public double lato() { public double lato() {
10.10. return lato; return lato;
11.11. } }
12.12.
13.13. // Restituisce l'area di questo Quadrato // Restituisce l'area di questo Quadrato
14.14. public double area() { public double area() {
15.
15. return lato*lato; return lato*lato;
46 46
Classe Concreta
Classe Concreta Cerchio Cerchio
1.1. class Cerchio extends Forma { class Cerchio extends Forma {
2.2. protected double raggio; protected double raggio;
3.3.
4.4. public Cerchio(double raggio, String colore) { public Cerchio(double raggio, String colore) {
5.5. super(colore); super(colore);
6.6. this.raggio = raggio; this.raggio = raggio;
7.7. } }
8.8.
9.9. public double raggio() { public double raggio() {
10.
10. return raggio; return raggio;
11.11. } }
12.12.
13.
13. // Restituisce l'area di questo Cerchio // Restituisce l'area di questo Cerchio
14.14. public double area() { public double area() {
15.15. return raggio*raggio*Math.PI; return raggio*raggio*Math.PI;
47 47
Esempio Esempio
Uso delle Classi Astratte/Concrete Uso delle Classi Astratte/Concrete
1.1. Quadrato q; Quadrato q; // un quadrato // un quadrato
2.2. Forma fq; Forma fq; // un altro quadrato// un altro quadrato
4.4. q = new Quadrato(5, "bianco"); q = new Quadrato(5, "bianco");
5.5. fq = new Quadrato(10, "rosso"); fq = new Quadrato(10, "rosso");
6.6.
7.7. System.out.println(q.area()); System.out.println(q.area()); // 25.0 // 25.0
8.8. System.out.println(q.colore()); System.out.println(q.colore()); // bianco// bianco
9.9. System.out.println(q.lato()); System.out.println(q.lato()); // 5.0 // 5.0
10.
10.
11.11.System.out.println(fq.area()); System.out.println(fq.area()); // 100.0 // 100.0
12.12.System.out.println(fq.colore()); System.out.println(fq.colore()); // rosso // rosso
13.
13.
14.14.System.out.println(fq.lato());System.out.println(fq.lato());
15.15. // NO, errore di compilazione! // NO, errore di compilazione!
48 48
Interfacce Interfacce
Una Una interfaccia interfaccia ( ( interface interface ) descrive un ) descrive un insieme di comportamenti
insieme di comportamenti
consiste nella dichiarazione di un certo numero consiste nella dichiarazione di un certo numero di metodi d’istanza e pubblici
di metodi d’istanza e pubblici
i metodi sono considerati implicitamente astratti i metodi sono considerati implicitamente astratti
le variabili sono considerate le variabili sono considerate public public , , final final e e static
static
una classe una classe implementa implementa ( ( implements implements ) una ) una
interfaccia se implementa tutti i metodi d’istanza interfaccia se implementa tutti i metodi d’istanza
dichiarati dall’interfaccia
dichiarati dall’interfaccia
49 49
Interfacce Interfacce
Un'interfaccia è un modello che specifica Un'interfaccia è un modello che specifica che cosa deve essere presente in una classe che cosa deve essere presente in una classe
che implementa l'interfaccia che implementa l'interfaccia
Un'interfaccia non può specificare nessuna Un'interfaccia non può specificare nessuna implementazione dei metodi
implementazione dei metodi
Tutti i metodi di un'interfaccia sono pubblici Tutti i metodi di un'interfaccia sono pubblici
Tutte le variabili definite in un'interfaccia sono Tutte le variabili definite in un'interfaccia sono public
public , , final final e e static static
50 50
Interfacce Interfacce
Un'interfaccia per un oggetto colorabile Un'interfaccia per un oggetto colorabile
public
public interfaceinterface Colorable Colorable {{ public Color getColor();
public Color getColor();
public void setColor(Color c);
public void setColor(Color c);
}}
Ora l'interfaccia può essere utilizzata per creare Ora l'interfaccia può essere utilizzata per creare classi che implementano l'interfaccia
classi che implementano l'interfaccia
51 51
Interfacce Interfacce
import java.awt.*;
import java.awt.*;
public class ColorablePoint public class ColorablePoint
extends Point extends Point implements
implements Colorable Colorable {{ Color color;
Color color;
public ColorablePoint() public ColorablePoint() {{
super();
super();
setColor(Color.blue);
setColor(Color.blue);
}} . . . . . .