Preparare la certificazione Java Programmer OCPJP7: Class design e Design Patterns

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.

  • I modificatori native e strcitfp possono essere applicati solo ai metodi e non alle variabili di istanza.
  • I metodi getClass(), wait() e notify() della classe Object sono metodi final per cui non possono essere ridefiniti.
  • Invece dei metodi finalize() e clone(), sempre della classe Object, si può fare l’override
  • Se una classe abstract implementa un’interfaccia essa non deve necessariamente definire i metodi presenti in quella interfaccia
  • Una sottoclasse concreta della classe astratta deve però ovviamente definire i metodi definiti nell’interfaccia implementata dalla classe astratta.
  • Le risorse dichiarate in uno statement try-with-resources sono final e non possono quindi essere riassegnate all’interno del blocco.
  • L’interfaccia Comparable definisce il metodo: int compareTo( T obj)
  • L’interfaccia Comparator definisce il metodo: int compare(T o1, To2)
This entry was posted in $1$s. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *