Parola chiave extends



Documenti analoghi
Esempio: il conto bancario

Modulo 4: Ereditarietà, interfacce e clonazione

Programmazione a Oggetti Lezione 10. Ereditarieta

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Esercizio 6 Realizzare una classe astratta per le Figure piane e due sottoclassi, la sottoclasse Quadrato e la sottoclasse Rettangolo.

DataSet. ... public BankAccount getmaximum() { return x; }... private BankAccount maximum;... } DataSet

Oggetti Lezione 3. aspetti generali e definizione di classi I

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

Esercizi della lezione 5 di Java

Corso di Programmazione ad Oggetti

Definizione di classi con array di oggetti

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Inizializzazione, Assegnamento e Distruzione di Classi

Livelli di astrazione

Java Virtual Machine


Eredità in C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

Classi ed Oggetti in JAVA

Controllo degli accessi

Java: Compilatore e Interprete

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Corso di Informatica

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Introduzione a Classi e Oggetti

Programmazione in Java Parte I: Fondamenti

Esercitazione n 4. Obiettivi

esercizi Esercizi / problemi

Programmazione ad Oggetti: JAVA. Esercitazione

sayhello public private protected return public class Greeter { public String sayhello() { String message = Hello, World! ; return message; } }

Funzioni in C. Violetta Lonati

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

GESTIONE DEI PROCESSI

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Test di unità con JUnit4

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Concetto di Funzione e Procedura METODI in Java

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Main System Monitor Keyboard

Relazioni tra oggetti e classi : Composizione. Relazioni tra oggetti e classi : esempio di Aggregazione. classe contenitore

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Esercitazioni aggiuntive Martedì Laboratorio L-12

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere.

Programmazione Java: Variabili membro, Metodi La parola chiave final

Gestione delle Eccezioni

Visibilità dei Membri di una Classe

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

La struttura dati ad albero binario

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Programmazione ad oggetti

Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1)

Gestione Risorse Umane Web

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Programmazione II. Lezione 4. Daniele Sgandurra 30/09/2011.

Object Oriented Software Design

Java threads (2) Programmazione Concorrente

Object Oriented Programming

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Soluzione dell esercizio del 2 Febbraio 2004

Simulazione traffico urbano

Ereditarietà e classi astratte

Java? Sì, grazie. Scopo del corso

Laboratorio di programmazione

Introduzione alla Programmazione ad Oggetti in C++

CREAZIONE DI UN AZIENDA

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Telematica II 17. Esercitazione/Laboratorio 6

Programmazione a Oggetti Modulo B

13. Chain of Responsibility

Esercitazione di Basi di Dati

Programmazione A.A Programmazione Orientata agli Oggetti: Lavorare con gli oggetti ( Lezione XXVII)

Synchronized (ancora)

Terza Esercitazione. Unix - Esercizio 1. Unix System Call Exec Java Introduzione Thread

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Luglio Soluzione degli Esercizi

1. I FONDAMENTI DELLA PROGRAMMAZIONE AD OGGETTI

!"#$%&&'()#*%+%+!"#$"',,'()#*%+ -")%*&'&'+'$.)+-$$%&&) !"#$%&&'(%)'*+%",#-%"#.'%&'#/0)-+#12"+3,)4+56#7+#.')8'9

Introduzione alla programmazione in C

Protezione. Protezione. Protezione. Obiettivi della protezione

Stampa unione - prof. Enzo Mardegan - 2

Programmazione Orientata agli Oggetti in Linguaggio Java

Realizzazione di una classe con un associazione

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

Transcript:

Il Linguaggio Java Ereditarietà Ereditarietà L'ereditarietà permette di creare nuove classi sulla base di classi esistenti In particolare, permette di riusare il codice (metodi e campi); aggiungere nuovi metodi e nuovi campi; ridefinire metodi e campi esistenti (overriding) TIGA 2

Parola chiave extends class A { //... class B extends A { // Differenze rispetto ad A Classe A: classe base, classe padre o superclasse Classe B:classe derivata, classe figlio, o sottoclasse TIGA 3 Ereditarietà La sottoclasse eredita tutti i membri della superclasse può aggiungere nuovi membri può ridefinire i metodi della superclasse non può accedere ai membri privati della superclasse TIGA 4

Esempio: conti bancari Un SavingsAccount (conto di risparmio) èunbankaccount (conto bancario), che frutta un tasso di interesse fisso sui depositi Rispetto a BankAccount, SavingsAccount ha un campo interestrate che specifica il tasso di interesse ha un metodo addinterestrate che applica il tasso di interesse ha un costruttore che imposta il valore iniziale del tasso di interesse TIGA 5 La classe SavingsAccount class SavingsAccount extends BankAccount { public SavingsAccount(double arate) { //... public void addinterest() { //... private double interestrate; TIGA 6

Oggetto di una sottoclasse SavingsAccount balance porzione ereditata da BankAccount interestrate TIGA 7 Accesso ai metodi della superclasse public void addinterest() { double interest = getbalance() *interestrate / 100; deposit(interest); Le chiamate ai metodi della superclasse (getbalance, deposit) utilizzano il parametro implicito this del metodo addinterest TIGA 8

La classe Object Una classe A che non estende esplicitamente un altra classe costituisce una sottoclasse della classe Object Object BankAccount Principali metodi di Object tostring clone equals SavingsAccount TIGA 9 Conversioni tra tipi riferimento (I) ESTENSIONE DI TIPO RIFERIMENTO S T purché S sia una sottoclasse di T (S è un T) class T {/*... */ class S extends T {/* La conversione da T verso S è una riduzione TIGA 10

Conversioni tra tipi di classi (II) Assegnamento ed invocazione di metodo: sono consentite solo le conversioni identità e per estensione Esempio T t = new T(); S s = new S(); t = s; // S è un T TIGA 11 Conversioni tra tipi di classi (II) Casting consente la conversione identità e le conversioni per estensione e per riduzione Esempio T t = new T(); S s; s = (S)t; // Si forza t ad essere un S. Pericoloso!! TIGA 12

Conversioni tra tipi di classi (III) SavingsAccount mio = new SavingsAccount(10); BankAccount unconto = mio; // OK Object unoggetto = mio; // OK mio.addinterest(); // OK unconto.deposit(20); // OK unconto.addinterest(); // compile-time error unoggetto.deposit(); // compile-time error le tre variabili oggetto mio, unconto ed unoggetto riferiscono lo stesso oggetto ma unconto non sa tutto dell oggetto mio ed unoggetto ne sa ancora meno ma allora a cosa serve??? TIGA 13 Riuso del codice della superclasse SavingsAccount mio = new SavingsAccount(10); BankAccount tuo = new BankAccount(10); tuo.transfer(mio, 5.0); al metodo transfer non serve sapere tutto dell oggetto mio, gli basta sapere che è un BankAccount TIGA 14

Cast tra tipi riferimento SavingsAccount mio = new SavingsAccount(10); Object unoggetto = mio; // mio è un Object SavingsAccount unconto = (savingsaccount)unoggetto; unconto.addinterest(); // OK Se, però, unoggetto non riferisce un oggetto istanza di SavingsAccount, l invocazione del metodo produce un errore a run-time TIGA 15 Parola chiave instanceof Conviene sempre verificare la fattibilità di un cast di tipo riferimento if ( unoggetto instanceof SavingsAccount ) unconto = (SavingsAccount)unOggetto; else unconto = null; TIGA 16

Gerarchie di ereditarietà (I) Il conto corrente (CheckingAccount) è un conto bancario (BankAccount) che non ha interessi, offre un numero limitato di operazioni mensili gratuite ed addebita una commissione per ciascun movimento aggiuntivo Il libretto di risparmio (SavingsAccount) è un conto bancario che frutta interessi mensili TIGA 17 Gerarchie di ereditarietà (II) Il conto vincolato (TimeDepositAccount) è un contodi risparmio(savingsaccount) che impegna a lasciare il denaro nel conto per certonumerodi mesie prevede una penale per un prelievo anticipato TIGA 18

Gerarchie di ereditarietà (III) BankAccount getbalance deposit withdraw CheckingAccount deductfees deposit withdraw SavingsAccount addinterest TimeDepositAccount addinterest withdraw TIGA 19 Metodi nella sottoclasse La sottoclasse può ereditare uno o più membri della superclasse definire nuovi metodi (membri) sovrascrivere (ridefinire) uno o più metodi della superclasse TIGA 20

Metodi nella sottoclasse (I) Ereditare un metodo dalla superclasse Se un metodo della superclasse non viene sovrascritto (ridefinito) allora tale metodo viene ereditato e può essere applicato agli oggetti della sottoclasse Esempio La classe CheckingAccount eredita il metodo BankAccount.getBalance dalla superclasse BankAccount TIGA 21 Metodi nella sottoclasse (II) Definire nuovi metodi nella sottoclasse Se nella sottoclasse si definisce un metodo che non esiste nella superclasse allora tale metodo può essere applicato solo agli oggetti della sottoclasse Esempio Il metodosavingsaccount.addinterest TIGA 22

Metodi nella sottoclasse (III) Sovrascrivere (override) un metodo della superclasse Nella sottoclasse si definisce un metodo m2 con la stessa firma del metodo m1 della superclasse Il metodo m2 sovrascrive m1, cioè quando si applica il metodo ad un oggetto della sottoclasse viene eseguito m2 Esempio CheckingAccount.deposit sovrascrive BankAccount.deposit TIGA 23 La classe CheckingAccount public class CheckingAccount extends BankAccount { public CheckingAccount(int initialbalance) {/* costruttore */ public void deposit(double amount) {/* override */ public void withdraw(double amount) {/* override */ public void deductfees() {/* define */ private int transactioncount; private static final int FREE_TRANSACTIONS = 3; private static final double TRANSACTION_FEE = 3.0; TIGA 24

La classe CheckingAccount public void deposit(double amount) accredita amount su questo conto corrente ed incrementa il numero di transazioni eseguite public void withdraw(double amount) preleva amount da questo conto corrente ed incrementa il numero di transazioni eseguite public void deductfees() addebita la commissione complessiva ottenuta applicando la commissione TRANSACTION_FEE ad ogni transazione in esubero rispetto a FREE_TRANSACTIONS e reimposta a zero il numero di transazioni eseguite TIGA 25 La parola chiave super public class CheckingAccount extends BankAccount { public void deposit(double amount) { transactioncount++; deposit(amount); // Ricorsione infinita!! TIGA 26

La parola chiave super public class CheckingAccount extends BankAccount { public void deposit(double amount) { transactioncount++; super.deposit(amount); // OK!! TIGA 27 La parola chiave super public void deductfees() { if (transactioncount > FREE_TRANSACTIONS) { double fees = TRANSACTION_FEE * (transactioncount FREE_TRANSACTIONS); super.withdraw(fees); transactioncount = 0; TIGA 28

Differenza tra super e this La parola chiave this costituisce un riferimento al parametro implicito; come prima istruzione, permette di invocare un altro costruttore della stessa classe La parola chiave super non costituisce un riferimento ad un oggetto permette di invocare un metodo sovrascritto della superclasse come prima istruzione, permette di invocare un costruttore della superclasse TIGA 29 Costruzione della sottoclasse Problema nel costruttore della sottoclasse si vuole impostare il valore iniziale delle variabili ereditate, ma la sottoclasse non ha accesso alle variabili private della superclasse Soluzione: si invoca il costruttore della superclasse utilizzando la parola chiave super TIGA 30

Costruzione della sottoclasse public CheckingAccount(int initialbalance) { // si costruisce la superclasse super(initialbalance); // si inizializza il contatore delle transazioni transactioncount = 0; TIGA 31 Variabili istanza nella sottoclasse (I) Ereditare una variabile istanza della superclasse Tutte le variabili istanza della superclasse sono ereditate automaticamente Esempio: balance di BankAccount Definire nuove variabili istanza nella sottoclasse Qualunque nuova variabile definita nella sottoclasse esiste solo per gli oggetti istanza della sottoclasse Esempio: transactioncount di CheckingAccount TIGA 32

Variabili istanza nella sottoclasse Mettere in ombra una variabile della superclasse Se nella sottoclasse F si dichiara una variabile istanza v con lo stesso nome N di una variabile istanza w della superclasse P, allora v mette in ombra w, cioè ogni volta che un metodo della sottoclasse utilizza il nome N si riferirà alla variabile v TIGA 33 Variabili in ombra public class CheckingAccount extends BankAccount { public void deposit(double amount) { transactioncount++; balance += amount; // private double balance; CheckingAccount harrys = new CheckingAccount(100); harrys.deposit(1500); System.out.println(harrys.getBalance()); // 100 TIGA 34

Costruzione della superclasse Chiamata esplicita: La chiamata al costruttore della superclasse mediante super deve la prima istruzione del costruttore della sottoclasse Chiamata implicita: Se un costruttore della sottoclasse non chiama esplicitamente un costruttore della superclasse, viene chiamato automaticamente il costruttore di default (senza argomenti) della superclasse se la superclasse non ha costruttore di default, il compilatore dà errore TIGA 35 Gerarchie di ereditarietà BankAccount getbalance deposit withdraw CheckingAccount deductfees deposit withdraw SavingsAccount addinterest TimeDepositAccount addinterest withdraw TIGA 36

Ereditarietà indiretta La classe SavingsAccount è la superclasse diretta della classe TimeDepositAccount La classe BankAccount è una superclasse indiretta di TimeDepositAccount TimeDepositAccount eredita i metodi getbalance e deposit da BankAccount Si possono ereditare metodi da una superclasse indiretta a patto che le superclassi intermedie non li ridefiniscano TIGA 37 Caricamento ed inizializzazione In un linguaggio tradizionale, il formato eseguibile di un programma viene caricato interamente; viene eseguita l inizializzazione della parte statica; infine, il controllo passa al programma TIGA 38

Caricamento ed inizializzazione Nel linguaggio Java la classe (il file.class) viene caricata al momento del suo primo utilizzo (quando è necessario) e cioè al primo accesso di un membro statico; oppure quando viene creato il primo oggetto della classe nel punto di primo utilizzo di una classe avviene l inizializzazione dei suoi membri static TIGA 39 Polimorfismo (I) Un oggetto della sottoclasse è anche un oggetto della superclasse, perciò È sempre possibile usare un oggetto della sottoclasse al posto di uno della superclasse BankAccount mio = new BankAccount(100); CheckingAccount tuo = new CheckingAccount (10); mio.transfer(tuo, 5); Quale metodo deposit viene chiamato? Si vorrebbe CheckingAccount.deposit TIGA 40

Polimorfismo (II) BankAccount BankAccount this balance other amount transfer CheckingAccount balance transactioncount Variabile Tipo della variabile this other Tipo dell oggetto BankAccount BankAccount BankAccount CheckingAccount TIGA 41 Polimorfismo (III) Le chiamate di metodo sono sempre determinate dal tipo dell oggetto effettivo e non dal tipo della variabile riferimento Perció, una stessa chiamata (es., tuo.deposit()) può chiamare metodi diversi; il metodo che viene effettivamente chiamato è determinato a tempo di esecuzione (late binding o dynamic binding) TIGA 42

Chiamata di un metodo Il compilatore risolve x.f( args ), con x di classe X, eseguendo i seguenti passi: determina i metodi con la stessa firma f ed appartenenti alla classe X ed alle sue superclassi; seleziona quello più specifico tra quelli accessibili (Se tale metodo non esiste, il compilatore genera un errore) se il metodo selezionato è private, static o final, oppure se è un costruttore, produce codice per effettuare la chiamata (static/early binding); altrimenti, produce codice per: (1) determinare il metodo da invocare e (2) effettuare la chiamata (dynamic/late binding) TIGA 43 Dynamic or late binding JVM seleziona il metodo da chiamare in base al tipo effettivo dell oggetto. se l oggetto è di classe Y, derivata da X, ed Y ha il metodo f, allora JVM invoca tale metodo; altrimenti, JVM invoca X.f È inefficiente eseguire questa selezione ad ogni chiamata di metodo. Perciò, per ogni classe viene costruita la Tabella dei metodi TIGA 44

La Tabella dei metodi BankAccount this BankAccount other deposit() BankAccount.deposit() withdraw() BankAccount. withdraw () getbalance() BankAccount.getBalance () transfer() BankAccount.transfer() CheckingAccount deposit() CheckingAccount.deposit() withdraw() CheckingAccount. withdraw() getbalance() BankAccount.getBalance () transfer() BankAccount.transfer() TIGA 45