CLASS DESIGN & DESIGN PATTERN
- Le classi astratte possono avere campi e metodi statici
- Da questo deriva che il main, essendo un metodo statico, può anche stare all’interno di una classe astratta
- Una classe astratta può estendere una classe concreta
- Una variabile definita come final non può essere riassegnata
- Nel caso di variabili di tipo oggetto, esse NON possono essere riassegnate neanche se il valore assegnato referenzia in realtà lo stesso oggetto; si ottiene comunque un errore di compilazione.
- Nei metodi statici non si può utilizzare la keyword this
- Un metodo static non può essere abstract
- Non si può fare l’override dei metodi statici. Essi sono metodi di classe e vengono risolti a tempo di compilazione, in base alla reference della classe.
- Una variabile definita sia final che static DEVE essere inizializzata durante la sua dichiarazione.
- Una variabile di istanza definita come final può non essere inizializzata durante la sua dichiarazione, ma in questo caso DEVE essere inizializzata in TUTTI i suoi costruttori.
- Una variabile definita come static esiste anche se non vengono create istanze della classe in cui è definita.
- Un metodo final non può MAI essere ridefinito nella sottoclasse, indipendentemente dal fatto che sia static o meno.
- Le variabili locali di un metodo NON possono avere il modificatore di visibilità
- Una classe può estendere un’altra classe ed implementare un’interfaccia che possiedono entrambe un campo con lo stesso nome. Questo non crea problemi in fase di dichiarazione della classe ma, quando si va ad accedere a tale variabile di istanza, si ottiene un ERRORE di COMPILAZIONE perché tale accesso è ambiguo.
- Nel pattern DAO viene identificato come TransferObject l’oggetto che deve essere storicizzato in modo persistente e che rappresenta il tipo su cui si basa la logica di business (es: Customer, Product)
- Per poter utilizzare gli oggetti di una classe in un enhanced loop, la classe deve implementare l’interfaccia Iterable
- L’interfaccia Iterable
dichiara un solo metodo: Iterator iterator() ; - La risoluzione di metodo di overload matcha con quella più specifica disponibile.
- Se passo come parametro null matcho una classe che eredita da Object se c’è, altrimenti matcho Object.
- Non ci devono però essere 2 classi che ereditano da Object ma non sono legate da una relazione di ereditarietà tra loro, altrimenti l’invocazione del metodo diventa ambigua ed ottengo un errore di compilazione.
- Attenzione ai metodi della classe base con visibilità private. Questi non sono ereditati, per cui un metodo con la stessa signature nella classe derivata non è un metodo override.
- In questo caso, se la reference è del tipo padre e l’oggetto vero e proprio è del tipo figlio, viene eseguito il metodo della classe della reference (padre).
- java.lang.Cloneable è un’interfaccia marker, cioè che non dichiara nessun metodo.
- Le classi che la implementano, per convenzione fanno l’override del metodo clone()
della classe Object - Il valore null può essere usato come input per l’operatore instanceof ma restituisce sempre false. Non vengono però generati ne errori di compilazione ne eccezioni.
if (null instanceof Object)
compila e restituisce false.