W Javie zaimplementowane są wszystkie cztery kluczowe zasady programowania obiektowego (OOP): enkapsulacja, dziedziczenie, polimorfizm i abstrakcja.
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; } }
extends. Sprzyja to ponownemu wykorzystaniu kodu.public class Animal {} public class Dog extends Animal {}
Animal animal = new Dog(); animal.makeSound(); // wywoła implementację w Dog
public interface Drawable { void draw(); }
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"
Historia
W projekcie dla banku programista ustawił wszystkie pola jako
publici 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.