Eredità e Polimorfismo in Java Corso di Linguaggi di Programmazione ad Oggetti 1 A.A. 2003/04 A cura di Eloisa Vargiu
1
Eredità e Polimorfismo
in Java
Corso di Linguaggi diProgrammazione ad Oggetti 1
A.A. 2003/04
A cura diEloisa Vargiu
2
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Definizione di Classe
l Java è un linguaggio object-oriented per cui ilcostrutto fondamentale è quello di classe:public class MyClass {
// definizione di dati membro:// slot e metodi
}
l La definizione dei dati membro (slot e metodi) va fatta dentro la definizione diclasse
3
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
L’oggetto this
l Per accedere ai dati membro di una classeagendo sull’oggetto corrente di una classe siusa la parola chiave thispublic class MyClass {
private int var;public void myMethod(int var) {
this.var = var ;}
}
4
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Classi e Tipi Primitivi
l Oltre al costrutto di classe, in Java sono statidefiniti 8 tipi primitivi suddivisi nelle seguenticategorie:l Logicil Numeri interil Numeri in virgola mobilel Caratteri
5
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Tipi Primitivi
l Logicil boolean
l Numeri interil bytel shortl intl long
l Numeri in virgolamobilel floatl double
l Caratteril char
6
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Tipi Primitivi: Esempio
public static void main(String args[]){int i = 10 ;char c ;
if (i > 0) {c = 'M' ;
}else c = 'm' ;
}
7
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Tipi Primitivi e Classi Wrapper
l I tipi primitivi Java non godono delle stesseproprietà delle classe:l NON hanno slot e metodi associatil NON hanno costruttoril …
l Per poter gestire i tipi primitivi come oggetti, sono state definite e implementate apposite classi: le classi Wrapper (del package java.lang)
8
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Classi Wrapper
l Esiste una classe Wrapper per ogni tipoprimitivo:l boolean → Booleanl byte → Bytel short → Shortl int → Integerl long → Long
l float → Float
l double → Double
l char → Character
9
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Classi Wrapper: Esempio
l class Integerl public Integer(int value)
Integer i = new Integer(10) ;
l public int intValue()int j = i.intValue() ;
l public int compareTo(Integer anotherInteger) Integer k = new Integer(15) ;i.compareTo(k) ;
10
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Classi e Interfacce
l Oltre al costrutto di classe, Java introduce ilcostrutto di Interfaccia
l Le interfacce Java (interface) contengonodefinizioni di costanti e metodi astrattil Le costanti devono necessariamente essere
inizializzatel I metodi sono tutti astratti
11
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Classi e Interfacce
l Per indicare che una classe incorpora ilcomportamento di una data interfaccia si usala parola chiave implements
l Le classi possono implementare una o piùinterfacce
12
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Classi e Interfacce: Esempio
public interface MyInterface {int maxDim = 100 ;boolean isFull() ;
}
public class MyClass implements MyInterface {private int dim ;public boolean isFull() {return dim = maxDim ;
}}
13
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Classi e Interfacce
l Un caso particolare di interfacce sono le Marker Interfacel Tali interfacce non dichiarano al proprio interno
nessun metodo (sono vuote)l Il loro scopo è quello di “marcare” le classi che le
implementano
14
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Classi e Interfacce: Esempio
l public interface Cloneablel Una classe implementa l’interfaccia Cloneable per
indicare che è possibile “clonare” tale oggetto, ovvero che si può sovrascrivere il metodo clone() della classe Object.
15
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Convenzione sui Nomi
l In Java, per omogeneità verso le classistandard e verso il codice scritto da altri, è consigliabile usare la seguente convenzionesull’iniziale dei nomi e sulle parole composte:
Iniziale minuscola
Iniziale minuscolaIniziale minuscolaIniziale maiuscola
Iniziale maiuscola
anIntTipi primitivi
anObjectOggetti
aSlot – aMethod()Dati membro
MyInterfaceInterfacce
MyClassClassi
16
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Nota sui Nomi delleInterfacce
l Anche se non esiste una convenzioneesplicita, solitamente i nomi delle interfacceterminano con il post-fisso able
l Tale post-fisso sta ad indicare chel’interfaccia, di fatto, definisce una proprietà
17
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Costruttori
l Analogamente al C++, anche in Java esistono i costruttori
l Analogamente al C++, anche in Java i costruttori hanno lo stesso nome della classe
l Per creare una nuova istanza di un oggettobisogna obbligatoriamente invocare una new:
obj = new MyClass() ;
18
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Costruttori: Esempio
public class MyClass {public MyClass() {
// costruttore senza parametri}public MyClass(Object anObject) {
// costruttore con parametri}
}
19
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Distruttori
l In Java non esistono distruttoril E’ compito del Garbage Collector distruggere
gli oggetti non più referenziatil E’ possibile forzare il Garbage Collector
invocando il metodo finalize( ) della classeObject
20
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Catene di eredità
l In Java tutte le classi derivano, in manieradiretta o indiretta, da una classe comune: Object
21
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Catene di eredità: EsempioObject||---Number
||---Double|---Integer
||---Boolean|---Character||…
22
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Eredità singola: Classi
l In Java l’eredità è singolal Ogni classe può ereditare solamente da
un’altra classel Per indicare che una classe eredita da
un’altra classe si usa la parola chiaveextends
23
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Eredità singola: Esempio
public class Derived extends Base {// corpo della classe Derived
}
La seguente istruzione è implicita e può essereomessa:public class MyClass extends Object {// corpo della classe MyClass
}
24
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Eredità multipla: Interfacce
l Per le interfacce l’eredità è multiplal Un’interfaccia può ereditare il comportamento
di una o più interfaccel Per indicare che un’interfaccia eredita da
un’altra interfaccia si usa la parola chiaveextends
25
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Eredità Multipla: Esempio
public interface Derivable extendsIBase1, IBase2 {// definizione dell’interfaccia// Derivable
}
26
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Nota sull’Eredità
l Una classe può ereditare da una solasuperclasse ma può implementare piùinterfacce così facendo Java sta in qualchemodo rendendo possibile una forma dieredità multipla.
27
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Eredità: Esempio
public class Derived extends Baseimplements IBase1, IBase2 {// implementazione della classe
}
28
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Eredità
l L’eredità in Java è sempre pubblical Non è infatti possibile, come ad esempio in
C++, stabilire metodi più sofisticati di eredità
29
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
L’oggetto super
l Per accedere ai dati membro di una superclasse, siusa la parola chiave superpublic class Base {public Object obj ;…
}public class Derived extends Base{public Object obj ;public void myMethod(…) {super.obj = … ;
}…
}
30
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Eredità: Costruttori
l Nella catena di eredità vengono ereditatianche i costruttori.
l Nel caso in cui il costruttore venga ridefinitonella classe derivata, è comunque possibileaccedere al costruttore della classe madreusando il costrutto super(...) con gli eventualiparametri.
31
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Eredità: Costruttori
l La prima istruzione che viene eseguitaimplicitamente quando viene invocato un costruttore è l’istruzione super( ), ovvero ilcostruttore senza parametri della classebase.
l Il richiamo esplicito di un costruttore dellaclasse base con il costrutto super( ) (con o senza parametri) deve essere fatto come prima istruzione del costruttore.
32
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Eredità: Esempio
public class Base {public Base() { … }public Base(int var) { … }
}public class Derived extends Base {
public Derived() { super() ;…
}}
33
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Eredità: Esempio
public class Base {public Base() { … }public Base(int var) { … }
}public class Derived extends Base {
public Derived(int var) { super(var) ;…
}}
34
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Modificatori di Accesso
l I dati membro possono avere uno di quattro livelli di accesso:l private l protectedl publicl default
l Va indicato nella dichiarazione della variabile o del metodo
l Se non è esplicitamente indicato si intende il livello di default
35
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Modificatori di Accesso: Esempio
public class Base {private String privateSlot ;protected void protectedMethod() { ... }
}public class Derived extends Base {public void publicMethod() { this.privateSlot ; // NO!!!this.protectedMethod() ; // YES!!!
}}
36
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Modificatori di Accesso: Esempiopublic class AClass {private String privateSlot ;public void publicMethod() { … }
}public class AnotherClass {public void publicMethod() { AClass obj = new AClass() ;obj.privateSlot ; // NO!!!obj.publicMethod() ; // YES!!!
}}
37
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Eredità e Modificatori diAccesso
l In Java l’ereditarietà è sempre pubblical Nell’overriding dei metodi è comunque
possibile modificare il modificatore di accessol La modifica è possibile solamente nella direzione
di un aumento della visibilità.l Non è invece consentito l’occultamento del dato
38
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Overriding: Esempio
public class Base {protected protectedMethod() {…}public publicMethod() {…}
}public class Derived {
public protectedMethod(){…}// YES!!!private publicMethod(){…} // NO!!!
}
39
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Polimorfismo
ad-hoc
universal
parametric
inclusion
coercion
overloading
polymorphism
40
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Polimorfismo Universale: per Inclusione
l Gli oggetti possono manifestare un comportamento polimorfo risalendo la catena di eredità
l Per creare il metodo più generico possibilebasterà passare come parametro un oggettodi classe Object
l Se si vuole che un metodo restituisca un oggetto il più generico possibile basteràrestituire un oggetto di classe Object
41
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Polimorfismo per Inclusione: Esempio
public class Stack {public Object[] buffer ;public void push(Object obj) { … }public Object top() { …}…
}
42
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Polimorfismo Universale: per Genericità
l Nella versione 1.5.0-beta sono stati introdottii Generics
l Dedicheremo un’intera lezione all’argomento(20 Maggio 2004)
43
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Polimorfismo Ad-Hoc: Overloading
l Un metodo può essere “sovraccaricato” per manifestare diversi comportamenti
l I metodi di cui si fa l’overlaoding devonoessere distinguibili per numero e/o tipi diparametri passati in ingresso
l NON è possibile che due metodi differiscanosolamente per il tipo restituito
44
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Overloading: Esempio
public class MyClass {public void myMethod()
{ … }public void myMethod(Obj obj)
{ … }public void myMethod(Obj obj, int v){ … }
}
45
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Polimorfismo Ad-Hoc: Overloading
l Anche i costruttori possono essere“sovraccaricati”
l Per richiamare un costruttore dentro un altrocostruttore si usa il costrutto this( ) con i relativi parametri
l Questo meccanismo può ovviare allamancanza dei parametri di default
46
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Overloading: Esempio
public class MyClass {public void MyClass(int a, int b)
{ … }public void MyClass () {
this(0,0) ; }
}
47
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Polimorfismo Ad-Hoc: Overloading
l In Java non è possibile fare l’overloadingdegli operatori
l Fa eccezione la ridefinizione dell’operatore +nella classe String che permette la concatenazione di stringhe di caratteri
48
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Polimorfismo Ad-Hoc: Coercion
l Sui tipi primitivi si ha la coercion implicita :
double y ;int x ;System.out.println(x+y) ;
>> 42.0
49
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Polimorfismo Ad-Hoc: Coercion
l Per quanto riguarda gli oggetti si ha:l up-casting implicitol down-casting esplicito
50
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Coercion: Esempio
l Upcasting implicito:
public class MyClass {public void push(Object o) { … }[…]
}[…]Integer anInteger = new Integer(10);MyClass mc = new MyClass() ;mc.push(anInteger) ;
51
Corso di Linguaggi di Programmazione ad Oggetti 1
Eloisa Vargiu
Coercion: Esempio
l Downcasting esplicito:public class MyClass {public void push(Integer i) { … }[…]
}[…]Object anObject = new Object();Integer anInteger = new Integer(10);anObject = anInteger ;MyClass mc = new MyClass() ;mc.push((Integer) anObject) ;