Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
Corso JAVA 7
Lezione 4
Questo corso, basato sull’ultima versione del linguaggio Java, con nome in
codice Dolphin, cerca di fornire ai lettori le informazioni necessarie per iniziare a
programmare con Java. In questa lezione verranno descritti alcuni paradigmi
della programmazione orientata agli oggetti quali l’astrazione, il riuso del
codice, l’incapsulamento e l’ereditarietà.
LEZIONE 4 ................................................................................................................................1
1.1 Paradigmi della programmazione ad oggetti.................................................................2
1.2 Astrazione ....................................................................................................................2
1.3 Riuso del codice ...........................................................................................................3
1.4 Incapsulamento.............................................................................................................3
1.4.1 Concetto ........................................................................................................4
1.4.2 Esempio pratico ..............................................................................................5
1.4.3 Incapsulamento funzionale ..............................................................................8
1.4.4 Reference THIS ...............................................................................................9
1.5 Ereditarietà .................................................................................................................10
1.5.1 Concetto ...................................................................................................... 11
1.5.2 Relazione “is a”............................................................................................. 11
1.5.3 Generalizzazione e specializzazione ............................................................... 12
1.5.4 Rapporto ereditarietà – incapsulamento ......................................................... 12
1.5.5 Esempio pratico ............................................................................................ 13
1.5.6 Conclusioni .................................................................................................. 14
1
LEZIONE 4
extends.
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
2
Esistono svariati paradigmi relativi alla programmazione orientata agli oggetti, alcuni dei
quali non sono propriamente specifici per questo tipo di programmazione, come l’astrazione
polimorfismo.
essenziale una certa cosa. Se questo elemento viene combinato con altri elementi quali
della programmazione ad oggetti, cioè il riuso del codice per lo sviluppo di altro software.
Oggi, ogni software house esistente sfrutta proprio la proprietà del riuso del codice per
la base del codice sarà la prima versione e quelle successive saranno solo ed esclusivamente
intelligenza, sarà possibile aggiungere funzionalità senza andare a modificare il codice scritto
precedentemente.
1.2 Astrazione
L’astrazione è il concetto che indica “l’abilità di concentrarsi solo sulle cose essenziali nella
programma.
Esistono tre livelli di astrazione per quanto riguarda la sua implementazione nella
programmazione ad oggetti:
- astrazione funzionale, che viene adoperata ogni volta che si implementa un metodo;
- astrazione dei dati, che viene adoperata ogni volta che definiamo una classe; infatti,
essenziali degli oggetti che essa deve definire nel contesto in cui ci si trova
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
3
- astrazione del sistema, che viene adoperata ogni volta che definiamo un’applicazione
nei termini delle classi essenziali che devono soddisfare agli scopi dell’applicazione
stessa
Inoltre, è possibile affermare che l’astrazione del sistema “contiene” l’estrazione dei dati che,
Consideriamo una classe Animale, che incapsuli al suo interno tutte le caratteristiche (metodi
e attributi) che sono comuni a tutti gli animali. Ad esempio, si potranno definire i metodi
mangia() e respira() e gli attributi altezza e peso (solo per citarne alcuni). Ma, riflettendoci un
attimo, appare chiaro che creare un’istanza di un oggetto Animale ha poco senso visto che è
certamente più consono definire le istanze di oggetti specifici come Cavallo, Cane, Gatto, ecc.
rappresenta un dato astratto ed è denominata, in OOP, classe astratta, ovvero una classe che
rappresenta, fondamentalmente, un modello per ottenere delle classi derivate più specifiche
e più dettagliate.
Esso consente un risparmio notevole nei tempi di scrittura di un programma da parte del
codice divenuto più corto e sintetico, ed è per questo presente in quasi tutti i linguaggi di
1.4 Incapsulamento
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
4
1.4.1 Concetto
Grazie al concetto di incapsulamento, il codice di una classe risulta essere più robusto, cioè
Inoltre, la manutenzione del codice della classe stessa risulterà essere più semplice al
programmatore, per cui risulterà essere più semplice effettuare modifiche o introdurre
nuove migliorie.
controllato ai dati mediante metodi che possono prevenirne l’usura e non correttezza.
In questo modo, ad esempio, tali metodi potrebbero essere utilizzati per effettuare dei
controlli sui valori che potranno assumere i dati prima di accedere ai dati stessi.
In definitiva, l’incapsulamento si raggiunge rendendo gli attributi delle classi privati, cioè
non modificabili dall’esterno e creando dei metodi pubblici da utilizzare per l’accesso ai dati.
(dal punto di vista dell’utente non occorre modificare nulla in quanto l’utente
modifiche apportate)
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
5
Supponiamo di voler scrivere un’applicazione che utilizza la seguente classe Anagrafica che
...
Anagrafica persona = new Anagrafica();
persona.nome = “Giuseppe Liccardo”;
persona.giorno = 16;
persona.mese = 11;
persona.anno = 1987;
...
In questo modo, però, potrebbero nascere dei problemi in quanto non sono effettuati dei
controlli sui possibili valori che possono essere assunti dalle variabili. Per risolvere questo
tipo di problemi si potrebbe modificare il codice dove si istanzia il nuovo oggetto. In questo
Prima di tutto occorre rendere gli attributi della classe in modo tale che non siano
direttamente accessibili dall’esterno. Ciò si ottiene dichiarando privati gli attributi della
- i mutator methods (o metodi “set”) che servono per accedere ai dati in scrittura
- gli accessor methods (o metodi “get”) che servono per accedere ai dati in lettura
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
6
Con questo codice si va a bloccare l’accesso diretto ai dati dall’esterno, infatti nel caso in cui
usando l’operatore “dot”, riceveremmo un errore dal compilatore in cui ci avverte che le
Adesso non ci resta che creare un interfaccia pubblica, costituita da metodi pubblici, da usare
per poter accedere ai dati. Estendiamo, quindi, il codice della classe Anagrafica.
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
7
Abbiamo dunque creato due interfacce pubbliche per ogni attributo della classe: uno per
System.out.print(persona.getNome());
System.out.print(persona.getGiorno());
System.out.print(persona.getMese());
System.out.print(persona.getAnno());
}
}
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
8
Per poter sfruttare i dati della classe Anagrafica saremo ora costretti ad utilizzare l’interfaccia
pubblica costituita dai metodi “set” e “get” che si trovano all’interno della classe stessa e
Inoltre, i controlli realizzati per ciascun dato risolvono eventuali problemi di inserimento dei
valori. I controlli inseriti non sono completi, per cui se volessimo inserire la data 31-02-2000 il
si dichiaravano privati gli attributi della classe. Usando, però, il modificatore private ad un
essere invocato solo da un metodo definito nella stessa classe, che potrebbe a sua volta essere
dichiarato pubblico.
Ciò favorirebbe il riuso di codice in quanto, introducendo nuovi metodi, questi potrebbero
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
9
oggetti di questa classe, ci potremmo chiedere: se giorno è una variabile d’istanza, a quale
istanza appartiene?
metodo getGiorno().
Java introduce una parola chiave, this, che non è altro che un riferimento all’oggetto sul
disponibile la variabile predefinita this che denota l’oggetto che sta eseguendo il metodo (o
il costruttore).
Questo reference, quindi, non fa altro che puntare all’oggetto a cui appartiene risolvendo
possibili problemi di ambiguità. Esso viene implicitamente aggiunto nel bytecode compilato
Nell’esempio (ma anche negli esempi precedenti) abbiamo distinto le variabili d’istanza dalle
nome, l’identificatore num per inizializzare numeroDiTelefono e ind per inizializzare indirizzo.
La diversità tra i due concetti di variabile d’istanza e variabile locale è tale che il compilatore
ci permette di dichiarare una variabile locale e una variabile d’istanza, aventi lo stesso
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
10
identificatore, nella stessa classe. Infatti la Java Virtual Machine alloca le variabili locali e le
variabili d’istanza in differenti aree di memoria, le prima nello stack, le seconde nell’heap.
conseguenza la variabile non referenziata sarà il parametro del metodo, senza che vi sia
ambiguità.
1.5 Ereditarietà
Utilizzando questo strumento avremo la possibilità di ereditare codice già scritto (e magari
già testato) in una classe ed ampliarlo, ottenendo così un’estensione della classe dalla quale
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
11
1.5.1 Concetto
L’idea dell’ereditarietà è semplice ma potente: quando si desidera creare una nuova classe e
c’è già una classe che include una parte del codice che si desidera implementare, è possibile
derivare la nuova classe dalla classe esistente. In questo modo, è possibile riutilizzare i campi
Infatti, in Java, le classi possono essere ereditate da altre classi, in modo da ereditare campi e
metodi di quest’ultime.
Una classe che deriva da un’altra classe si chiama sottoclasse, la classe da cui è derivata la
Ad esclusione della classe Object, che non ha superclassi, ogni classe può avere una ed una
sola superclasse diretta (ereditarietà singola). In assenza di una qualsiasi superclasse, ogni
La classe Object è una classe che astrae il concetto di “oggetto generico” ed è di fatto la
In Java non esiste la cosiddetta ereditarietà multipla, per cui non è possibile estendere una
classe a partire da più classi. Questa funzionalità non è stata implementata in Java in quanto
Quando si parla di ereditarietà si è spesso convinti che per implementarla basti avere un paio
di classi che dichiarino campi in comune. In realtà ciò non è vero! Per determinare se una
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
12
classe può essere ereditata a partire da un’altra classe è necessario che sia effettuato la
In pratica la domanda da porsi sarà: un oggetto della candidata sottoclasse “è un” oggetto
utilizzare.
dell’ereditarietà.
Si parla di specializzazione se, partendo da una classe, si definiscono una o più sottoclassi
Abbiamo già detto che estendere una classe significa ereditarne i membri non privati. Per
questo motivo, quando estendiamo una classe non vengono ereditati tutti gli attributi e i
Quindi, utilizzando l'incapsulamento degli attributi della classe dichiarandoli come privati,
quest'ultimi non verranno direttamente ereditati. Però, negli esempi precedenti, i metodi che
si occupano della manipolazioni degli attributi (i metodi “get” e “set”) sono stati dichiarati
metodi che gestiscono gli attributi, avremo modo di accedere agli attributi stessi e quindi
Morale della favola: anche se la sottoclasse non possiede esplicitamente le variabili private
della sua superclasse, può comunque accedervi mediante l’incapsulamento, quindi è come se
le possedesse virtualmente.
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
13
// variabili
public int cilindrata;
public int velocita;
// costruttore
public Automobile(int cil, int vel) {
cilindrata = cil;
velocita = vel;
}
// metodi
public void setCilindrata(int cilindrata) {
this.cilindrata = cilindrata;
}
della velocità
Definiamo ora una sottoclasse della classe Automobile che ne eredita quindi tutti i membri. Il
nome di questa classe è Utilitaria e andrà ad aggiungere ulteriori campi a quelli ereditati
dalla superclasse.
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”
14
// variabili
public int numeroPorte;
// costruttore
public Utilitaria(int nPorte, int cil, int vel) {
numeroPorte = nPorte;
super(cil, vel);
}
// metodi
public void setNumeroPorte(int numeroPorte) {
this.numeroPorte = numeroPorte;
}
La classe Utilitaria eredita tutti i campi e metodi della sua superclasse e aggiunge il campo
Fatta eccezione per il costruttore, è come se avessimo scritto una nuova classe Utilitaria
interamente da zero, con tre campi e quattro metodi. Tuttavia, non è stato necessario fare
tutto questo lavoro in quanto è stato riutilizzato il codice presente nella classe Automobile.
1.5.6 Conclusioni
concetto di ereditarietà ci ha aperto una strada con tante diramazioni: la strada della
concetti come il polimorfismo, nuove potenti parole chiave come super e ci saranno nuove
Dalla prossima lezione in poi, quindi, ci caleremo nel supporto che Java offre alla
Corso Java 7 – Dott. Giuseppe Liccardo – Università degli Studi di Napoli “Parthenope”