eredità e polimorfismo in java - diee.unica.itarmano/lpo1/pdf/lezione040428.pdf · lin java...

51
Eredità e Polimorfismo in Java Corso di Linguaggi di Programmazione ad Oggetti 1 A.A. 2003/04 A cura di Eloisa Vargiu

Upload: duongthien

Post on 24-May-2018

223 views

Category:

Documents


2 download

TRANSCRIPT

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