w , ,

Wielodziedziczenie Java

Wraz z nadejściem Java 8 pojawiła się nowa koncepcja implementacji Interfejsów. Teraz programista będzie miał możliwość zaimplementowania domyślnej obsługi metody w każdej metodzie interfejsu.

Pierwsza myśl jaka się nasuwa to powrót do korzeni języków obiektowych, które wspierają Multiple inheritance.

Jednak w Javie zostało to rozwiązane w bardzo przejrzysty sposób. W przypadku kiedy klasa implementuje dwa interfejsy, które mają metodę o tej samej sygnaturze, to kompilator zwróci nam wyjątek:

error: class ClassImplementer inherits unrelated defaults for boo() from types ClassA and ClassB

Dość intuicyjne jest, aby w takim przypadku wskazać kompilatorowi, która metoda, ma zostać domyślną.

Poniżej demonstracja kilku użytecznych przypadków:

public interface ClassA {
 default void boo() {
 System.out.println("this is ClassA");
 }
}
public interface ClassB{
 default void boo() {
 System.out.println("this is ClassB");
 }
}
public class ClassImplementer implements ClassA, ClassB {

@Override
 public void boo() {
 ClassA.super.boo(); 
 }
}

Metoda boo() z ClassA jest ustawiona jako domyślna brak takiej deklaracji spowoduje rzucenie wyjątku widocznego powyżej.

public class ClassTest {

public static void main(String[] args) {

ClassA classA = new ClassImplementer();
classA.boo();

ClassB classB = new ClassB() {
@Override
public void boo() {
System.out.println("this is Override ClassB");
}
};
classB.boo();

ClassImplementer classImplementer = new ClassImplementer();
classImplementer.boo();
}
}

Output:
this is ClassA
this is Override ClassB
this is ClassA

Napisane przez Przemysław Bykowski

Aktywny programista i energiczny trener. Specjalizuje się w Spring Boot i uczę go w ramach AkademiaSpring.pl. Po godzinach udzielam się na YouTubach. Więcej o mnie.

Dodaj komentarz

Wyrażenie lambda w Java

Sikuli – zgrabne narzędzie dla automatyzacji zadań