• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java - po co używać klasy abstrakcyjnych, skoro są interfejsy?

VPS Starter Arubacloud
+1 głos
1,075 wizyt
pytanie zadane 3 listopada 2018 w Java przez k222 Nałogowiec (30,150 p.)
Cześć, uczę się Javy i mam pytanie co do pisania kodu - w najnowszej Javie z tego co zdążyłem się dowiedzieć klasy abstrakcyjne i interfejsy nie różnią się niczym (różnica zatarła się po wprowadzeniu metod domyślnych), za to interfejsy mają ogromną zaletę w postaci braku ograniczenia co do dziedziczenia jednokrotnego i tutaj się pojawia moje pytanie:

Czy jest jakakolwiek sytuacja, gdzie używacie klas abstrakcyjnych zamiast interfejsów?

3 odpowiedzi

+2 głosów
odpowiedź 3 listopada 2018 przez RafalS VIP (122,820 p.)
W interfejsie nie zrobisz zmiennych skladowych ani konstruktorów a wszystkie metody sa publiczne.

Dodatkowl mimo wszystko maja sporo roznic niepisanych. Interfejs to kontrakt - zbior metod publicznych ktore klasa ma implementować, a klasa abstrakcyjna to niekompletna klasa.
1
komentarz 3 listopada 2018 przez mbabane Szeryf (79,300 p.)

abstrakcyjna to niekompletna klasa.

Ciekawie to ująłeś. Jakoś nigdy do głowy mi nie przyszło, żeby tak o tym pomyśleć. 

1
komentarz 3 listopada 2018 przez mbabane Szeryf (79,300 p.)

a wszystkie metody sa publiczne.

Od Java 9 można robić w interfejsach metody prywatne.

komentarz 4 listopada 2018 przez Wiciorny Ekspert (274,410 p.)
no tak ale to nie zmienia faktu że pacage-private jest jeszcze , bo w Javie nie określenie zasięgu zmiennej jest takim własnie typem zmiennej. A to nie do końca protected jest, ani private. Takie pomiędzy
+2 głosów
odpowiedź 3 listopada 2018 przez mbabane Szeryf (79,300 p.)

Interfejsy mają pokazywać bardziej zachowanie danego obiektu, natomiast klasa abstrakcyjna daje dodatkową semantykę dla obiektu. Np. Node w JavaFx nie bardzo pasuje pod interfejs bo przechowuje jakiś stan i tworzenie bezpośrednio instancji tego obiektu też było by bez sensu. Zadaniem klasy jest własnie też podtrzymanie jakiegoś stanu, interfejs raczej nie bardzo się do tego nadaje, bo nie można w nim tworzyć pól.

Abstrakcyjna klasa może przydać się np. we wzorcu Metoda szablonowa.

Z bardziej technicznych rzeczy to, w interfejsie nie zablokujesz sobie nadpisania metody:

interface Inter
{
    public default void method()
    {
        System.out.println("default");
    };
}

abstract class AbstClass
{
    public final void method() //mozna uzyc final
    {
        System.out.println("default");
    }
}

class A extends AbstClass
{
    @Override
    public void method(){} //bład, ta metoda jest finalna i nie można jej nadpisać
}

class B implements Inter
{
    @Override
    public void method() //działa
    {

    }
}
0 głosów
odpowiedź 3 listopada 2018 przez Tomasz Rogalski Bywalec (2,800 p.)
Chociażby protected modyfikator. Inne semantyczne użycie jednego a drugiego. Interfejsy nie mają pól instancyjnych.
komentarz 3 listopada 2018 przez Tomasz Rogalski Bywalec (2,800 p.)
Przykład:

Masz Kwadrat, Prostokąt i Figura. Prostokąt i Kwadrat dziedziczą/implementują Figura.

No właśnie co byś wybrał? załóżmy że nam w programie potrzebne są metody obliczPole i obliczObwód oraz pola "pole" i "obwod". Takich pol nie dasz w interfejsie. Przy 20 klasach dziedziczących masz 38 powtórzonych pól (2x40-2)

Interfejsu użyłbym jedynie gdyby mój kwadrat np miał dziedziczyć jeszcze po czymś.

 

Co jeszcze. Interfejs to kontrakt tak jak napisał RafałS. A klasę abstrakcyjną często zobaczysz jak nadklase w JPA albo w DTO dla pól wspólnych. Użyjesz jej jako części wspólnej i tu użyłbym słowa "smietnik" na różne metody utility. Natomiast klasy abstrakcyjnej nie użyj wystawiając api na zewnątrz.
1
komentarz 4 listopada 2018 przez Wiciorny Ekspert (274,410 p.)

obliczPole i obliczObwód oraz pola "pole" i "obwod". Takich pol nie dasz w interfejsi

to fajnie bo w Javie masz coś takiego jak Interfejs Shape... :) 

Bzdura - własnie tutaj przydaje się interfejs, bo sa to pewne "niezmienne"  zachowania dla tych obiektów właśnie :), a różnią się tylko implementacją. 

komentarz 4 listopada 2018 przez Tomasz Rogalski Bywalec (2,800 p.)
I co masz w tym interfejsie Shape pola: "pole" i "obwod" ? <sarkazm>

Gdzie, co bzdura? Można dać interfejs z metodami a pod nią dać klasę abstrakcyjną z polami "pole" i "obwod".
komentarz 4 listopada 2018 przez Wiciorny Ekspert (274,410 p.)
w interfejsie pole i obwód być mogą też :) w obecnej specyfikacji, ja wiem że może to pewną konwencje łamać:  ale funkcjonalności możesz zachowac
komentarz 4 listopada 2018 przez Tomasz Rogalski Bywalec (2,800 p.)
Że niby jak? Nie możesz mieć pól w interfejsie, nawet prywatnych z tego co wiem. Jedynie stałe i pola lokalne.

Podobne pytania

0 głosów
2 odpowiedzi 1,601 wizyt
0 głosów
2 odpowiedzi 389 wizyt
pytanie zadane 2 grudnia 2018 w Java przez itcloud Gaduła (3,380 p.)
0 głosów
1 odpowiedź 548 wizyt
pytanie zadane 15 września 2016 w C i C++ przez Tadeusz Jasińska Nowicjusz (190 p.)

92,782 zapytań

141,712 odpowiedzi

320,600 komentarzy

62,114 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...