programowanieProgramista Java

Opowiedz, jakie podstawowe zasady OOP są stosowane w Javie i jak są one realizowane w praktyce?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

W Javie zaimplementowane są wszystkie cztery kluczowe zasady programowania obiektowego (OOP): enkapsulacja, dziedziczenie, polimorfizm i abstrakcja.

  • Enkapsulacja pozwala ukrywać wewnętrzną implementację klasy i udostępniać dostęp do danych tylko przez metody. Java wykorzystuje modyfikatory dostępności (private, protected, public) oraz gettery/settery dla osiągnięcia enkapsulacji.
public class Account { private double balance; public double getBalance() { return balance; } public void deposit(double amount) { this.balance += amount; } }
  • Dziedziczenie pozwala na tworzenie nowej klasy na podstawie istniejącej za pomocą słowa kluczowego extends. Sprzyja to ponownemu wykorzystaniu kodu.
public class Animal {} public class Dog extends Animal {}
  • Polimorfizm przejawia się w możliwości jednego interfejsu służącego wielu typom. W Javie osiąga się to poprzez nadpisywanie metod i interfejsy.
Animal animal = new Dog(); animal.makeSound(); // wywoła implementację w Dog
  • Abstrakcja osiągana jest poprzez deklarację klas abstrakcyjnych i interfejsów, co upraszcza złożone systemy.
public interface Drawable { void draw(); }

Pytanie na czasie.

Co się dzieje, jeśli w Javie klasa dziedziczy interfejs i klasę abstrakcyjną, które mają metody o tych samych sygnaturach? Jakie zachowanie demonstruje klasa dziedzicząca?

Odpowiedź: Jeśli zarówno klasa abstrakcyjna, jak i interfejs definiują tę samą sygnaturę metody, wystarczy zaimplementować tę metodę raz w klasie pochodnej. Jednak jeśli klasa abstrakcyjna zrealizowała tę metodę, to Java wykorzysta tę implementację. Domyślne metody interfejsu są nadpisywane tylko w razie potrzeby.

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() wyświetli "B"

Przykłady rzeczywistych błędów wynikających z braku znajomości niuansów tematu.


Historia

W projekcie dla banku programista ustawił wszystkie pola jako public i odnosił się do nich bezpośrednio. Doprowadziło to do niekontrolowanej zmiany stanu obiektów i trudności w znajdowaniu błędów. W późniejszym czasie cały kod musiał zostać przepisany na użycie pól private i metod dostępu.


Historia

Jeden z nowych pracowników próbował nadpisać prywatną metodę klasy bazowej, sądząc, że wspiera to polimorfizm. W rzeczywistości tworzono nową metodę w klasie potomnej, a wywołania z klasy bazowej wywoływały oryginalną wersję, co prowadziło do nieoczekiwanego zachowania.


Historia

Użycie interfejsów z domyślnymi metodami z kilku źródeł doprowadziło do błędu "class X inherits unrelated defaults for Y() from types A and B" — pracownik nie wiedział, że takie konflikty muszą być ręcznie rozstrzygane w klasie potomnej.