• 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?

Object Storage Arubacloud
+1 głos
1,057 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,280 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,280 p.)

a wszystkie metody sa publiczne.

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

komentarz 4 listopada 2018 przez Wiciorny Ekspert (270,150 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,280 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 (270,150 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 (270,150 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,532 wizyt
0 głosów
2 odpowiedzi 327 wizyt
pytanie zadane 2 grudnia 2018 w Java przez itcloud Gaduła (3,380 p.)
0 głosów
1 odpowiedź 542 wizyt
pytanie zadane 15 września 2016 w C i C++ przez Tadeusz Jasińska Nowicjusz (190 p.)

92,573 zapytań

141,423 odpowiedzi

319,647 komentarzy

61,959 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...