ISTANCEOF
Quando si effettua un cast verso il basso è buona
norma verificare la validità del cast utilizzando
l’operatore istanceof. Questo previene eccezioni a
runtime come la ClassCastException (si verifica quando
il cast non è valido).
Il compilatore non permette di fare un cast se non esiste
alcuna possibilità che esso sia valido (si può effettuare
solo all’interno di una gerarchia di classi e solo se è
logicamente valido).
Array di riferimenti e casting
In Java, si può convertire un array di subclass in un array
di superclass senza bisogno di un cast esplicito.
Tuttavia, è da tenere a mente che gli array in Java
conservano l’informazione del tipo di oggetto con cui
sono stati creati e monitorano l’inserimento di tipi
differenti.
La superclass OBJECT
In Java, la classe object è la superclasse di tutte le
classi. Ogni classe (anche se non specificato
esplicitamente) estende la classe object. Si possono
usare variabili di tipo object per riferirsi a qualsiasi tipo
di oggetto (solo i tipi primitivi non estendono object).
Il metodo equals
Il metodo equals di object permette di confrontare due
riferimenti per verificare se puntano allo stesso oggetto.
Proprietà del metodo equals:
1) Riflessiva, x.equals(x) deve restituire sempre true;
2) Simmetrica, x.equals(y) deve restituire true se e
solo se y.equals(x) restituisce true;
3) Transitiva, se x.equals(y) e y.equals(z) allora
x.equals(z) deve restituire true;
4) Consistente, se gli oggetti non cambiano, chiamate
ripetute a equals() devono restituire lo stesso
risultato;
5) Confronto con null, qualsiasi confronto con null
deve restituire false.
Il metodo tostring
Il metodo toString restituisce una rappresentazione
testuale dell’oggetto. Di default, Object.toString()
stampa il nome della classe e l’hash code dell’oggetto.
Utilizzando metodi accessori (get) il metodo toString
può essere reso più flessibile e funzionare per le
sottoclassi.
Altri metodi di object sono:
1) getClass(), che restituisce un oggetto Class che
contiene informazioni sulla classe dell’oggetto;
2) hashCode(), che restituisce un valore hash
del’oggetto.
Classi astratte
Una classe astratta è una classe che non può essere
istanziata direttamente ma serve come base per altre
classi. Viene utilizzata per rappresentare concetti
generali che verranno specializzati nelle subclass.
Utilizzo delle classi astratte:
1) In una gerarchia di classi, alcune classi diventano
così generali da non avere un’implementazione
completa. Queste classi esistono solo per essere
estese da classi più specifiche.
2) Le classi astratte sono utili per condividere attributi
e metodi comuni tra classi senza creare istanze
della classe astratta.
Metodi astratti
Un metodo astratto è un metodo che non ha
un’implementazione nella classe astratta e deve essere
implementato dalle subclass. Per dichiarare un metodo
o una classe come astratti si usa la keyword abstract.
Una classe astratta può avere sia metodi astratti che
metodi concreti (con implementazione) e attributi.
Inoltre, le classi astratte non possono essere istanziate
direttamente, cioè non si possono creare oggetti di quel
tipo.
Classi astratte ed ereditarietà
Una subclass concreta che eredita da una classe
astratta deve implementare tutti i metodi astratti della
classe genitore altrimenti deve essere definita come
astratta.
Classi astratte e polimorfismo
Le classi astratte facilitano l’uso del polimorfismo
perché permettono di trattare oggetti di subclass
concrete come se fossero del tipo astratto.
Generics
Generalmente, le classi ordinarie ed i metodi sono
vincolati a lavorare con tipi specifici (tipi primitivi o
classi come string) e quando si vuole scrivere codice
che può funzionare con più tipi di dati questo diventa un
problema. Una soluzione è il polimorfismo, per rendere
il codice più generico:
1) Si definisce un metodo che accetta un parametro di
tipo classe base o derivata;
2) Questo permette di usare il metodo con tutte le
classi derivate (limitato alla gerarchia di classi).
Programmazione generica
La programmazione generica permette di scrivere
codice che può essere riutilizzato per oggetti di diversi
tipi. I generics introducono il concetto di tipo
parametrizzato, permettendo di generalizzare il codice
per più tipi senza perdere sicurezza.
Vantaggi del generics:
1) Type safety, errori di tipo vengono rilevati a tempo
di compilazione;
2) Riutilizzabilità, le classi e i metodi generi possono
essere riutilizzati per diversi tipi di dati (si riduce la
duplicazione del codice).
Prima di generics si poteva utilizzare la classe pair
(tuttavia accetta solo le stringhe).
Con i generics si può scrivere una classe che acceetta
un tipo qualsiasi (si specificherà quando si crea
l’oggetto). La sintassi è public class Pair<T> (dove t è un
tipo generico). Così, la classe Pair può essere utilizzare
per qualsiasi tipo di dati, rendendola più flessibile e
riutilizzabile.
Parametri di tipo multiplo
E’ possibile definire una classe con più parametri di tipo
(ad esempio public class Pair<T, U>). Con due parametri
di tipo (T e U) si possono rappresentare una coppia di
oggetti di tipi diversi.
Vantaggi principali dei generics:
1) Flessibilità, si possono creare classi e metodi che
funzionano con qualsiasi tipo di dato;
2) Sicurezza, gli errori di tipo vengono rivelati a tempo
di compilazione;
-
Programmazione JAVA
-
Appunti di Programmazione ad oggetti - Java
-
Programmazione ad oggetti e Java (1)
-
Appunti Programmazione ad oggetti e Java