9/12/2004Laboratorio di Programmazione - Luca Tesei1 Ereditarietà

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Classi ed Oggetti in JAVA
© 2007 SEI-Società Editrice Internazionale, Apogeo Unit à B2 Gli oggetti: concetti avanzati.
Costruttori e Distruttori
Recupero debito quarto anno Primo incontro
Recupero debito quarto anno Secondo incontro
Informatica Recupero debito quarto anno Terzo incontro.
If a cascata, switch, operatori logici
2/11/2004Laboratorio di Programmazione - Luca Tesei1 Progettazione Fase di progettazione di unapplicazione Fase di implementazione.
Linguaggi Regolari e Linguaggi Liberi
12/11/2004Laboratorio di Programmazione - Luca Tesei1 Caratteri – Input da Console Il tipo char Input dallo standard input.
26/10/2004Laboratorio di Programmazione - Luca Tesei1 Variabili e Oggetti Lo spazio di memoria di Java Le API di Java.
3/12/2004Laboratorio di Programmazione - Luca Tesei1 Sequenze di lunghezza variabile ArrayList Operazioni Ricerche.
5/11/2004Laboratorio di Programmazione - Luca Tesei1 Esercizi Su Progettazione e Implementazione di classi.
29/10/2004Laboratorio di Programmazione - Luca Tesei1 Metodi e variabili istanza Definizione e chiamata di metodi Uso delle variabili istanza Documentazione.
9/11/2004Laboratorio di Programmazione - Luca Tesei1 Tipi numerici di base - Costanti Interi e decimali Definizione di costanti.
22/10/2004Programmazione e Laboratorio di Programmazione – Luca Tesei1 Laboratorio – Primo Impatto Scrivere un semplice programma I primi concetti.
Programmazione e Laboratorio di Programmazione – Luca Tesei1 La Programmazione Cosè la programmazione? Concetti preliminari.
29/11/2004Laboratorio di Programmazione - Luca Tesei1 Ancora sulla progettazione/Pacchetti Concetti di coesione/accoppiamento/coerenza Uso dei package.
26/11/2004Laboratorio di Programmazione - Luca Tesei1 Input/Output Redirecting, scomposizione dellinput, uso di file.
2/11/2004Laboratorio di Programmazione - Luca Tesei1 Punto della situazione Da dove veniamo, dove andiamo.
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
Le gerarchie di tipi.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
SISSIS MODULO DI JAVA PER LA CLASSE IV DELL’ITI
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Derivazione tra classi
Gerarchia di classi Java
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
Ereditarietà. Concetti principali Ereditarietà e (overriding) di metodi Dynamic dispatch e polimorfismo Ereditarietà e costruttori Livelli di accesso.
Ereditarietà. Concetti principali Ereditarietà e (overriding) di metodi Dynamic dispatch e polimorfismo Ereditarietà e costruttori Livelli di accesso.
Capitolo 10 Ereditarietà
Java base IV: Java e la programmazione O.O.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Programmazione in Java (8)
AlgoLab - Ereditarieta' Ereditarietà e polimorfismo in Java Laboratorio di Algoritmi 02/03 Prof. Ugo de Liguoro.
Introduzione alla programmazione Object Oriented
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
11/11/2004Laboratorio di Programmazione - Luca Tesei1 Operazioni numeriche - Input Espressioni, funzioni matematiche, classi involucro, Acquisizione di.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
15/11/2004Laboratorio di Programmazione - Luca Tesei1 Costrutto condizionale Scelte, blocchi.
30/11/2004Laboratorio di Programmazione - Luca Tesei1 Interfacce e Polimorfismo.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Fondamenti di Informatica II Ingegneria Informatica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Cose nuove di Java (prima a chiacchiera, poi formalmente)
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
Classi ed Oggetti in Java (Cenni). Richiami Cenni sull’ Implementazione, Macchine Astratte, Compilatore, Interprete Ruolo delle Classi in Java Oggetti.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
28/12/2001package 1 Package Pacchetti e interfacce.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

9/12/2004Laboratorio di Programmazione - Luca Tesei1 Ereditarietà

9/12/2004Laboratorio di Programmazione - Luca Tesei2 Ereditarietà È un meccanismo per potenziare classi esistenti e funzionanti Quando vogliamo implementare una nuova classe ed è già disponibile una classe che rappresenta un concetto più generale, allora la nuova classe può ereditare da quella esistente

9/12/2004Laboratorio di Programmazione - Luca Tesei3 Ereditarietà Supponiamo, ad esempio, di voler definire una nuova classe SavingsAccount che rappresenta un conto bancario che garantisce un tasso di interesse fisso sui depositi Abbiamo già la classe BankAccount e un conto di risparmio è un caso speciale di conto bancario Utilizziamo lereditarietà per definire la nuova classe SavingsAccount

9/12/2004Laboratorio di Programmazione - Luca Tesei4 Ereditarietà: sintassi class SavingsAccount extends BankAccount { nuovi metodi nuove variabili istanza } Tutti i metodi e le variabili istanza di BankAccount sono ereditati automaticamente dalla classe SavingsAccount

9/12/2004Laboratorio di Programmazione - Luca Tesei5 Ereditarietà: esempi Ad esempio possiamo usare il metodo deposit della classe BankAccount su un oggetto della classe SavingsAccount : // Crea un conto di risparmio con // tasso di interesse fisso del 10%: SavingsAccount collegeFund = new SavingsAccount(10); // utilizzo il metodo deposit ereditato // da BankAccount: collegeFund.deposit(100);

9/12/2004Laboratorio di Programmazione - Luca Tesei6 Ereditarietà: terminologia La classe più generica da cui si eredita viene detta superclasse La classe che eredita viene detta sottoclasse Nel nostro esempio quindi BankAccount è la superclasse e SavingsAccount è la sottoclasse

9/12/2004Laboratorio di Programmazione - Luca Tesei7 Ereditarietà: la classe Object In Java una classe che non estende esplicitamente unaltra classe è una sottoclasse della classe Object Ad esempio BankAccount è automaticamente una sottoclasse della classe Object La classe Object ha un numero limitato di metodi (vedere API) che vanno bene per tutti gli oggetti: toString, equals, clone,...

9/12/2004Laboratorio di Programmazione - Luca Tesei8 Diagramma di classi UML Object BankAccount SavingsAccount Tipo di freccia che indica lereditarietà

9/12/2004Laboratorio di Programmazione - Luca Tesei9 Ereditarietà vs implementazione di interfaccia Sono due concetti differenti Uninterfaccia non è una classe: –Non ha uno stato –Non ha un comportamento –Indica solamente un certo numero di metodi che bisogna implementare Una superclasse ha uno stato e un comportamento che vengono ereditati dalla sottoclasse

9/12/2004Laboratorio di Programmazione - Luca Tesei10 Vantaggi dellereditarietà Permette di modellare alcune situazioni in maniera più precisa Permette di riutilizzare il codice Non siamo costretti a rifare il lavoro di progettazione e messa a punto della nuova classe che già è stato fatto nella superclasse: –In SavingsAccount possiamo riutilizzare i metodi deposit withdraw e getBalance di BankAccount senza nemmeno toccarli

9/12/2004Laboratorio di Programmazione - Luca Tesei11 Contenuto della sottoclasse La sottoclasse può contenere: –Nuovi metodi –Nuove variabili istanza –Metodi della superclasse sovrascritti Nellesempio abbiamo che in SavingsAccount dobbiamo aggiungere una variabile istanza per memorizzare il tasso di interesse e un nuovo metodo che aggiunge gli interessi maturati

9/12/2004Laboratorio di Programmazione - Luca Tesei12 SavingsAccount public class SavingsAccount extends BankAccount { public SavingsAccount(double rate) { implementazione del costruttore } public void addInterest() { implementazione del metodo } private double interestRate; }

9/12/2004Laboratorio di Programmazione - Luca Tesei13 Rappresentaz. di un oggetto SavingsAccount SavingsAccount balance interestRate 10.0 Porzione di BankAccount Porzione di SavingsAccount

9/12/2004Laboratorio di Programmazione - Luca Tesei14 SavingsAccount: implementazione public class SavingsAccount extends BankAccount { public SavingsAccount(double rate) { interestRate = rate; } public void addInterest() { double interest = getBalance() * interestRate / 100; deposit(interest); } private double interestRate; } Implicito this.getBalance() Implicito this.deposit(interest)

9/12/2004Laboratorio di Programmazione - Luca Tesei15 Giustificazione del nome Perché viene detta sottoclasse quella che eredita? La terminologia si riferisce a una interpretazione insiemistica: –I conti di risparmio sono particolari conti bancari, quindi linsieme di tutti i possibili conti di risparmio è un sottoinsieme di tutti i possibili conti bancari –Il nome viene quindi dal fatto che la sottoclasse rappresenta un sottoinsieme degli oggetti possibili della superclasse

9/12/2004Laboratorio di Programmazione - Luca Tesei16 Gerarchie di ereditarietà Nel mondo reale spesso i concetti si classificano in gerarchie La stessa cosa si può fare in Java creando una gerarchia di classi (una classe = un concetto) I concetti più generali si trovano in alto nella gerarchia I concetti più specifici sono sottoclassi di classi più in alto nella gerarchia

9/12/2004Laboratorio di Programmazione - Luca Tesei17 Esempio: gerarchia di oggetti grafici Swing JComponent JTextComponent JPanel AbstractButton JLabel JTextFieldJTextArea JToggleButton JButton JCheckBoxJRadioButton

9/12/2004Laboratorio di Programmazione - Luca Tesei18 Un esempio semplice di gerarchia Un conto corrente è un conto bancario che non offre interessi, supporta un numero limitato di operazioni mensili gratuite ed addebita una commissione per tutte le altre Anche un conto corrente ( CheckingAccount ) può essere visto come unestensione di BankAccount Otteniamo quindi la seguente gerarchia:

9/12/2004Laboratorio di Programmazione - Luca Tesei19 Un esempio semplice di gerarchia BankAccount SavingsAccountCheckingAccount

9/12/2004Laboratorio di Programmazione - Luca Tesei20 Un esempio semplice di gerarchia Un CheckingAccount ha bisogno di un metodo deductFees che ogni mese addebita le commissioni e azzera un contatore delle operazioni I metodi deposit e withdraw vanno modificati per incrementare il contatore di operazioni Come facciamo?

9/12/2004Laboratorio di Programmazione - Luca Tesei21 Metodi delle sottoclassi 1.Possiamo riscrivere (ridefinire) un metodo della superclasse: il metodo deve avere lo stesso tipo di ritorno, lo stesso nome e la stessa sequenza di tipi di parametri (la cosiddetta segnatura o firma) Quando il metodo ridefinito viene chiamato su un oggetto della sottoclasse il codice effettivamente eseguito è quello ridefinito Questo accade anche se ci si riferisce alloggetto della sottoclasse attraverso una variabile del tipo della superclasse (selezione posticipata)

9/12/2004Laboratorio di Programmazione - Luca Tesei22 Metodi delle sottoclassi 2.Possiamo ereditare metodi della superclasse: basta non riscriverli e sono ereditati automaticamente Possono essere chiamati su oggetti della sottoclasse Il codice eseguito è quello specificato nella superclasse

9/12/2004Laboratorio di Programmazione - Luca Tesei23 Metodi delle sottoclassi 3.Possiamo scrivere nuovi metodi: questi possono essere chiamati solo su oggetti della sottoclasse

9/12/2004Laboratorio di Programmazione - Luca Tesei24 Variabili istanza delle sottoclassi Le variabili istanza, a differenza dei metodi, non si possono sovrascrivere Possiamo: –Ereditare tutte le variabili istanza della superclasse (automatico) –Definire nuove variabili istanza che compariranno solo nello stato degli oggetti della sottoclasse

9/12/2004Laboratorio di Programmazione - Luca Tesei25 Variabili istanza delle sottoclassi Se ridefiniamo una variabile istanza (usando lo stesso nome e lo stesso tipo) allora –Gli oggetti avranno due variabili istanza con lo stesso nome e lo stesso tipo –La variabile della superclasse viene messa in ombra da quella della sottoclasse –I metodi della sottoclasse possono accedere solo alla variabile istanza della sottoclasse Pratica sconsigliata perché fonte di errori

9/12/2004Laboratorio di Programmazione - Luca Tesei26 Implementiamo CheckingAccount Dobbiamo aggiungere una variabile istanza intera transactionCount per contare il numero di operazioni e calcolare così il totale delle commissioni mensili Dobbiamo aggiungere un metodo deductFees che azzera il contatore, calcola le commissioni e le deduce dal saldo Dobbiamo sovrascrivere i metodi deposit e withdraw per far loro incrementare il contatore

9/12/2004Laboratorio di Programmazione - Luca Tesei27 Implementazione di CheckingAccount Problema: Le variabili istanza private della superclasse, essendo private, non possono essere accedute dai metodi della sottoclasse! Come possiamo fare? Nei metodi della sottoclasse è possibile usare la parola riservata super per chiamare metodi della superclasse sulloggetto su cui si sta eseguendo il metodo

9/12/2004Laboratorio di Programmazione - Luca Tesei28 Riscrittura di deposit public class CheckingAccount extends BankAccount {... public void deposit(double amount) { transactionCount++; // chiamo il metodo della superclasse super.deposit(amount); }...

9/12/2004Laboratorio di Programmazione - Luca Tesei29 Errore comune Cosa sarebbe successo se non avvessimo specificato super.deposit(amount), ma solo deposit(amount) ? Il significato sarebbe stato, come da regola, quello di chiamare il metodo this.deposit(amount) Il metodo deposit da eseguire, poiché loggetto chiamato è della classe CheckingAccount, sarebbe stato quindi lo stesso! Sarebbe iniziata un sequenza infinita di chiamate allo stesso metodo che sarebbe terminata solo con un errore OutOfMemory dovuto al superamento della disponibilità di memoria per appilare le attivazioni relative alle chiamate!!!

9/12/2004Laboratorio di Programmazione - Luca Tesei30 Errore comune A volte si può essere tentati di ridefinire una variabile istanza perché vorremmo accedervi da un metodo ridefinito nella sottoclasse e, in questi casi, il compilatore non lo permette perché è una variabile privata della superclasse: In SavingsAccount : public void deposit(double amount) { transactionCount++; balance = balance + amount; // Errore }

9/12/2004Laboratorio di Programmazione - Luca Tesei31 Errore comune Se si risolve lerrore ridichiarando balance si avrà che il metodo deposit farà riferimento alla nuova balance ridefinita nella sottoclasse (la variabile della superclasse viene messa in ombra) Tuttavia il metodo getBalance, che non viene ridefinito, restituirà il valore della variabile istanza balance della superclasse!!!

9/12/2004Laboratorio di Programmazione - Luca Tesei32 Costruttori della sottoclasse Così come tutte le classi anche le sottoclassi possono avere metodi costruttori Si hanno gli stessi problemi in caso di variabili private della superclasse: come fare per inizializzarle? Si ricorre allo stesso meccanismo: il costruttore della sottoclasse può chiamare un costruttore della superclasse tramite la chiamata super (parametri) Questa chiamata deve obbligatoriamente essere la prima riga di codice del costruttore

9/12/2004Laboratorio di Programmazione - Luca Tesei33 Costruttori della sottoclasse... public SavingsAccount(double amount, double rate) { super(amount); // Inizializza il saldo interestRate = rate; }...

9/12/2004Laboratorio di Programmazione - Luca Tesei34 Costruttori ridefiniti Un costruttore della sottoclasse può anche ridefinirne uno della superclasse Il costruttore ridefinito avrà nome diverso (quello della sottoclasse), ma lo stesso tipo di parametri Anche in questo caso il corrispondente costruttore della superclasse può essere invocato nella prima riga di codice del nuovo costruttore

9/12/2004Laboratorio di Programmazione - Luca Tesei35 Costruttori ridefiniti public class CheckingAccount extends BankAccount { public CheckingAccount(double initialBalance) { // Costruisce la superclasse super(initialBalance); // Inizializza il contatore di // operazioni transactionCount = 0; }...

9/12/2004Laboratorio di Programmazione - Luca Tesei36 Conversione da sottoclasse a superclasse Abbiamo già visto questo meccanismo con le interfacce Un oggetto di una sottoclasse può essere sempre visto come un oggetto della superclasse SavingsAccount collegeFund = new SavingsAccount(10); BankAccount anAccount = collegeFund; Object anObject = collegeFund;

9/12/2004Laboratorio di Programmazione - Luca Tesei37 Conversione da sottoclasse a superclasse... collegeFund anAccount anObject... SavingsAccount balance 0.0 interestRate 10.0

9/12/2004Laboratorio di Programmazione - Luca Tesei38 Chiamate di metodi Attraverso il riferimento collegeFund si possono chiamare tutti i metodi della classe SavingsAccount (inclusi ovviamente quelli ereditati) Attraverso il riferimento anAccount, invece, si possono chiamare solo i metodi di BankAccount Infine, attraverso anObject, possono essere chiamati solo i metodi della classe Object

9/12/2004Laboratorio di Programmazione - Luca Tesei39 Quando usare la conversione È molto utile usare la conversione di tipo da sottoclasse a superclasse perché ciò permette di riutilizzare codice già scritto Ad esempio, supponiamo di aver scritto, per BankAccount un metodo transfer: public void transfer (double amount, BanckAccount other){ this.withdraw(amount); other.deposit(amount); }

9/12/2004Laboratorio di Programmazione - Luca Tesei40 Quando usare la conversione Possiamo utilizzare lo stesso metodo transfer anche per fare trasferimenti tra conti di SavingsAccount e di CheckingAccount SavingsAccount momsSavings = new SavingsAccount(10000); CheckingAccount harrysAccount = new CheckingAccount(100); momsSavings.transfer(1000, harrysAccount);

9/12/2004Laboratorio di Programmazione - Luca Tesei41 Selezione posticipata e polimorfismo Abbiamo già visto che i metodi effettivamente eseguiti nelle chiamate sono quelli della classe reale a cui loggetto che viene chiamato appartiene Questo è il meccanismo della selezione posticipata Naturalmente se il metodo chiamato è ereditato dalla superclasse allora verrà eseguito comunque il metodo della superclasse (differenza con le interfacce, che non hanno implementazioni di metodi!) Il polimorfismo è invece la capacità di variabili o parametri, ad esempio other, di riferire oggetti di tipi diversi comportandosi in maniera diversa a seconda dei casi

9/12/2004Laboratorio di Programmazione - Luca Tesei42 Classi astratte Con il meccanismo dellereditarietà una sottoclasse può ereditare alcuni metodi della superclasse e può ridefinirne altri Esiste un meccanismo per obbligare le sottoclassi a ridefinire un metodo Può essere utile quando non esiste una buona impostazione predefinita per la superclasse Si possono dichiarare uno o più metodi della classe come astratti

9/12/2004Laboratorio di Programmazione - Luca Tesei43 Classi astratte Ad esempio supponiamo che la direzione di una banca con molte filiali decida che ogni conto debba avere delle deduzioni mensili per vari tipi di commissioni public class BankAccount { public void deductFees() { // ?? }... }

9/12/2004Laboratorio di Programmazione - Luca Tesei44 Classi astratte Naturalmente ogni filiale della banca potrà decidere la portata di queste deduzioni a seconda del proprio rapporto con i clienti Quindi cosa va scritto nellimplementazione del metodo? Sarebbe comodo poter delegare limplementazione del proprio metodo ad ogni filiale Potrebbe essere un errore implementarlo con una deduzione pari a zero: se poi una filiale si dimentica di ridefinirlo?

9/12/2004Laboratorio di Programmazione - Luca Tesei45 Classi astratte Diciamo esplicitamente che il metodo nella classe non ha unimplementazione e che quindi, se si vuole creare un oggetto, si deve estendere la classe e fornire un implementazione per il metodo: public abstract class BankAccount { public abstract void deductFees();... }

9/12/2004Laboratorio di Programmazione - Luca Tesei46 Classi astratte Una classe che ha almeno un metodo abstract deve essere dichiarata abstract Non si possono creare oggetti di una classe astratta! Per farlo bisogna estendere la classe e implementare almeno tutti i metodi astratti Le classi astratte differiscono dalle interfacce: possono avere sia variabili istanza sia alcuni metodi implementati (detti anche concreti)

9/12/2004Laboratorio di Programmazione - Luca Tesei47 Classi non estensibili In alcuni casi invece di obbligare i programmatori delle sottoclassi a implementare certi metodi si può volere proprio il contrario: cioè si vuole impedire che una certa classe possa essere estesa Per ottenere ciò basta aggiungere alla definizione della classe la parola riservata final : public final class MyFinalClass {... }

9/12/2004Laboratorio di Programmazione - Luca Tesei48 Classi non estensibili Ad esempio la classe String è dichiarata final La parola final può essere abbinata anche solo a certi metodi di una classe La classe potrà essere estesa, ma i metodi final non potranno essere ridefiniti public class AccessoRemoto {... public final boolean checkPassword(String password) {... }

9/12/2004Laboratorio di Programmazione - Luca Tesei49 Acesso protected Oltre a public e private esiste in Java anche un altro specificatore di accesso: protected Una variabile istanza o un metodo protected ha possibilità di accesso che sono a metà strada tra public (accesso a tutti) e private (accesso solo ai metodi della classe: accesso negato perfino alle sottoclassi!) Una variabile istanza o un metodo protected possono essere acceduti dalle sottoclassi e da tutte le classi nello stesso pacchetto

9/12/2004Laboratorio di Programmazione - Luca Tesei50 Accesso protected Luso dellaccesso protected risolverebbe il problema dellaccesso alle variabili private della superclasse da parte della sottoclasse Ma la possibilità di accesso a tutte le classi dello stesso pacchetto apre falle troppo grandi nella sicurezza perché chiunque può aggiungere una sua classe ad un pacchetto ed ottenere così laccesso alle variabili istanza e ai metodi protected!

9/12/2004Laboratorio di Programmazione - Luca Tesei51 Accesso non specificato Se non si specifica nessuno specificatore di accesso per classi, variabili istanza e metodi il compilatore Java assegna di default laccesso di pacchetto: tutte le classi dello stesso pacchetto possono accedere È una scelta giusta per le classi, ma per gli stessi motivi visti riguardo laccesso protected, non è una buona idea per variabili istanza e metodi

9/12/2004Laboratorio di Programmazione - Luca Tesei52 In linea generale Quindi il tipo di accesso da preferire sempre per le variabili istanza è il privato Nel caso dei metodi invece si può considerare anche il caso di definirli protected per limitare il loro uso solo alle classi del pacchetto e alle sottoclassi Ogni volta che si esce da questo schema è opportuno riflettere adeguatamente sulla scelta fatta.