In Java si possono importare anche metodi e attributi
static di una classe. Questo permette di accedere ai
membri static di una classe senza dover ripetere ogni
volta il nome delle classi.
Incapsulamento controllare la visibilità
Attraverso l’uso di modificatori di visibilità,
l’incapsulamento protegge gli attributi di un oggetto
impedendo l’accesso diretto da codice esterno alla
classe.
Come funziona l’incapsulamento:
1) Attributi privati, gli attributi di una classe sono
dichiarati come private per evitare accessi e
modifiche dirette non controllate;
2) Interfaccia pubblica, permettono di eseguire
operazioni sugli attributi privati in modo sicuro e
controllato (come i metodi getter e setter).
Ereditarietà
E’ un meccanismo fondamentale che consente a una
nuova classe di acquisire proprietà (attributi) e
comportamenti (metodi) da un’altra classe (classe base
o genitore). La classe risultante (classe derivata o figlia)
può riutilizzare il codice della classe genitore e
aggiungere nuove funzionalità o modificare il
comportamento esistente.
Vantaggi dell’ereditarietà:
1) Riutilizzo del codice, permette di non riscrivere il
codice che è già stato definito nella classe genitore;
2) Estendibilità, si possono aggiungere nuove
funzionalità alla classe derivata senza modificare il
codice esistente della classe genitore;
3) Organizzazione, favorisce la strutturazione logica
del codice.
L’ereditarietà si indica con la parola chiave extends (si
sta creando una nuova classe derivata da una classe già
esistente). La classe esistente prende il nome di
superclasse mentre la classe derivata prende il nome di
subclass.
In genere, le operazioni più generali fanno parte delle
superclassi mentre le operazioni più specifiche fanno
parte delle sottoclassi.
I metodi e gli attributi vengono ereditati
automaticamente dalla sottoclasse, tuttavia, la
sottoclasse non può accedere direttamente agli
attributi privati della superclasse (si utilizza protected).
Per accedere alle informazioni della superclasse si
utilizza la keyword super.
Viene impiegata principalmente per due scopi:
1) Chiamare il costruttore della classe genitore,
quando una classe derivata viene istanziata, il
costruttore della superclasse può essere
richiamato usando super. Se non viene
esplicitamente dichiarato viene invocato il
costruttore di default della classe genitore;
2) Accedere a metodi e attributi della classe
genitore, se un metodo o un attributo della classe
genitore è stato sovrascritto nella classe derivata,
super permette di accedere alla versione originale
del metodo o dell’attributo (definito nella classe
genitore).
Se la superclasse non ha un costruttore di default e il
costruttore della subclass non invoca un altro
costruttore esplicitamente si ha un errore.
Super e this
This:
1) Indica una referenza ad un parametro implicito;
2) Invoca un altro costruttore della stessa classe.
Super:
1) Invoca metodi di una superclasse;
2) Invoca il costruttore di una superclasse.
Gerarchie di classi
Una classe può ereditare da una classe che a sua volta
eredita da un'altra classe. Questo fenomeno è noto
come gerarchia di ereditarietà. Il percorso da una classe
alla superclasse è chiamato catena gerarchica.
Ereditarietà e final
In Java il modificatore final viene utilizzato per prevenire
modifiche a variabili, metodi e classe. Quando una
classe o un metodo è dichiarato final non può essere
ereditato.
1) Uso di final con le classi, una classe final non può
essere estesa;
2) Uso di final con i metodi, non può essere
sovrascritto da una subclass. In questo modo non si
può modificare il comportamento di un metodo in
una classe derivata.
Se una classe è dichiarata come final automaticamente
tutti i suoi metodi sono considerati come final.
Quindi final dovrebbe essere utilizzato quando si sa che
una classe o un metodo non dovrebbe essere
modificato.
Polimorfismo
E’ un principio fondamentale che permette agli oggetti
di essere trattati come istanze di diverse classi
attraverso una singola interfaccia. Consente di definire
metodi che possono comportarsi in modo diverso a
seconda dell’oggetto sui cui vengono chiamati.
Vantaggi del polimorfismo:
1) Flessibilità, consente di usare lo stesso metodo su
oggetti di classi diverse;
2) Estendibilità, facilita l’aggiunta di nuovi
comportamenti senza modificare il codice
esistente;
3) Riutilizzabilità, migliora il riuso del codice e
l’organizzazione gerarchica delle classi.
Il polimorfismo si divide in:
1) Polimorfismo statico (overloading), avviene nel
compile-time e si verifica quando si hanno più
metodi con lo stesso nome ma con parametri
diversi (definiti nella stessa classe);
2) Polimorfismo dinamico (overriding), avviene a
runtime e si verifica quando una classe derivata
sovrascrive un metodo della classe genitore per
fornire una nuova implementazione.
Overloading del costruttore
L’overloading del costruttore è la possibilità di definire
più di un costruttore all’interno di una classe ognuno
con una diversa firma (diverso numero o tipo di
parametri).
L’overloading permette maggiore flessibilità nella
creazione di oggetti fornendo più opzioni per
inizializzare un oggetto.
-
Programmazione JAVA
-
Programmazione ad oggetti e Java (5)
-
Appunti di Programmazione ad oggetti - Java
-
Programmazione ad oggetti e Java (1)