ProgrammazioneSviluppatore Java

Parla dei principi fondamentali della OOP utilizzati in Java e come vengono implementati nella pratica?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

In Java sono implementati tutti e quattro i principi chiave della programmazione orientata agli oggetti (OOP): incapsulamento, ereditarietà, polimorfismo e astrazione.

  • Incapsulamento permette di nascondere l'implementazione interna di una classe e fornire accesso ai dati solo attraverso i metodi. Java utilizza modificatori di accesso (private, protected, public) e getter/setter per raggiungere l'incapsulamento.
public class Account { private double balance; public double getBalance() { return balance; } public void deposit(double amount) { this.balance += amount; } }
  • Ereditarietà consente di creare una nuova classe basata su una esistente utilizzando la parola chiave extends. Questo favorisce il riutilizzo del codice.
public class Animal {} public class Dog extends Animal {}
  • Polimorfismo si manifesta nella possibilità che un'interfaccia serva a diversi tipi. In Java si ottiene tramite l'override dei metodi e delle interfacce.
Animal animal = new Dog(); animal.makeSound(); // chiamerà l'implementazione in Dog
  • Astrattibilità si ottiene dichiarando classi astratte e interfacce, semplificando sistemi complessi.
public interface Drawable { void draw(); }

Domanda trabocchetto.

Cosa succede se in Java una classe eredita un'interfaccia e una classe astratta che hanno metodi con la stessa firma? Quale comportamento dimostrerà la classe ereditata?

Risposta: Se sia la classe astratta che l'interfaccia definiscono la stessa firma del metodo, è sufficiente implementare quel metodo una sola volta nella classe derivata. Tuttavia, se la classe astratta ha implementato quel metodo, Java utilizza la sua implementazione. I metodi di default dell'interfaccia vengono sovrascritti solo se necessario.

interface A { default void foo() { System.out.println("A"); }} abstract class B { void foo() { System.out.println("B"); }} class C extends B implements A {} // new C().foo() stamperà "B"

Esempi di errori reali causati da una mancanza di conoscenza delle sottigliezze dell'argomento.


Storia

In un progetto per una banca, uno sviluppatore ha reso tutti i campi public e li ha utilizzati direttamente. Questo ha portato a cambiamenti incontrollati nello stato degli oggetti e a frustrazioni nella ricerca degli errori. Successivamente, tutto il codice è stato riscritto per utilizzare campi e metodi di accesso privati.


Storia

Uno dei nuovi dipendenti ha cercato di sovrascrivere un metodo private della classe base, pensando che supportasse il polimorfismo. Ma in realtà si stava creando un nuovo metodo nella classe derivata, e le chiamate dalla classe base invocavano la versione originale, il che portava a comportamenti inaspettati.


Storia

L'uso di interfacce con metodi di default da più fonti ha portato all'errore "class X inherits unrelated defaults for Y() from types A and B" — il dipendente non sapeva che tali conflitti devono essere risolti manualmente nella classe derivata.