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

Java tworzenie obiektów za pomocą interfejsu

VPS Starter Arubacloud
0 głosów
3,092 wizyt
pytanie zadane 20 września 2017 w Java przez Dethavel Początkujący (280 p.)

Do tej pory nauczyłem się tworzyć obiekty klas, jednak kiedy do gry wchodzą interfejsy, których niestety nie do końca rozumiem i tworzymy obiekty w ten sposób: 

InterfaceA x = new ImplementingClassB();

Nie jestem pewien co ten zapis oznacza i po co jest ten interfejs na początku jeżeli to klasa ImplementingClassB może go implementować? 

Byłbym wdzięczny gdyby ktoś mógł podać jakieś porównanie do czegoś rzeczywistego ;-)

3 odpowiedzi

0 głosów
odpowiedź 20 września 2017 przez Mateusz51 Nałogowiec (28,180 p.)
wybrane 20 września 2017 przez Dethavel
 
Najlepsza

Podam Ci wytłumaczenie na podstawie świata javy. W Javie mamy kolekcji jednymi z typów jest Lista ( List) Jest to interfejs który definiuje kilka metod. I teraz interfejs ten implementują np ArrayList i LinkedList przez to nic nie stoi nam na przeszkodzie aby zrobić

List list = new ArrayList();

Czyli przypisać do zmiennej list która jest referencja na obiekt implementujący interfejs List.

A dalej w kodzie nie przejmować się tym zę jest to ArrayList i używać metod takich jak get() albo iterator(). A jak kiedyś stwierdzimy że jednak ArrayList jest nie wydajny w tym przypadku i zmienimy na LinkedList to cały dalszy kod nie ulegnie zmianie.

komentarz 20 września 2017 przez Dethavel Początkujący (280 p.)
Dzięki, powoli wszystko staje się jasne ale muszę z tym trochę popracować :-)
komentarz 20 września 2017 przez Wiciorny Ekspert (269,120 p.)

 Lista ( List) Jest to interfejs który definiuje kilka metod

 interfejs nie definiuje... interfejs to szkielet....  tam są tylko deklaracje 

2
komentarz 20 września 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 20 września 2017 przez plkpiotr

@Wiciorny: Jeżeli chcemy być małostkowi, to od Javy 8 interfejsy mogą zawierać domyślne metody, które definiują zachowanie, a których nie trzeba implementować w klasie, choć można. Aby metoda była domyślna należy poprzedzić ją słowem default.

Można również korzystać z domyślnych metod statycznych w interfejsach, które mogą być wywoływane niezależnie od tworzonych obiektów. Te jednak nie są dziedziczone ani przez implementujące je klasy, ani "podinterfejsy".

Jednak jakby nie patrzeć interfejsy powinny mówić: co klasa ma robić, ale nie(koniecznie) w jaki sposób ;)

komentarz 20 września 2017 przez Mateusz51 Nałogowiec (28,180 p.)
@Wiciorny: przyznaje się do błedu. Masz 100% racje:)
+1 głos
odpowiedź 20 września 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 20 września 2017 przez plkpiotr

Jest to zmienna referencyjna do interfejsu. Takiej zmiennej można przypisać egzemplarz dowolnej klasy implementującej zadeklarowany interfejs. Wywołanie metody dla takiej zmiennej spowoduje wywołanie odpowiedniej wersji metody należącej do właściwego egzemplarza klasy, bo zauważ, że wiele klas może implementować ten sam interfejs. Odbywa się to w sposób dynamiczny (analogia do polimorfizmu w C++), czyli w trakcie działania programu, a nie podczas kompilacji, wiąże się to jednak ze zmniejszeniem wydajności.

Prosty przykład: interfejs mógłby zawierać zachowania (metody) pracownika, a klasy go implementujące np. szef, menadżer projektu, developer mogłyby mieć przepis jak te zachowania (metody) wykonać w właściwy dla siebie sposób. Tej samej zmiennej referencyjnej (pracownika) w trakcie działania programu moglibyśmy na początku przypisać egzemplarz klasy developera, a później szefa. Metoda wywołana na rzecz jednego i drugiego będzie wykonana w inny sposób mimo tego, że odnosi się do tej samej zmiennej referencyjnej.

komentarz 20 września 2017 przez Dethavel Początkujący (280 p.)
Zmniejszeniem wydajności ? Dlaczego, możesz rozwinąć myśl?
1
komentarz 20 września 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 20 września 2017 przez plkpiotr

Cytując Java Kompendium Programisty, wydanie IX:
Ponieważ dynamiczne wyszukiwanie metody do wykonania wiąże się ze znacznymi kosztami w porównaniu z tradycyjnymi wywołaniami metody w Javie, należy unikać stosowania interfejsów w kodzie, który ma zapewniać przede wszystkim wysoką wydajność.

Napisałem to w swojej odpowiedzi, abyś wiedział że dynamiczne linkowanie wiąże się ze zmniejszeniem wydajności, jednak przy pisaniu programów dla siebie nie powinieneś dostrzec żadnej różnicy. Gdybyś operował na bardzo wielu zmiennych, o bardzo złożonych obiektach przy używaniu jakichś algorytmów np. sortowania to dopiero wtedy różnica mogłaby być widoczna. Z całej mojej odpowiedzi jest to jednak najmniej istotny element.

1
komentarz 20 września 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Jeśli chodzi o spadek wydajności z powodu odwoływania się do zmiennej przez interfejs jest to raczej marginalny problem. W dobie kompilatorów JIT i optymalizacji robionej przez wirtualną maszyne Javy, spadek wydajności jest rzędu max kilku procent. Co w większości zastosowaniach nie ma żadnego zauważalnego znaczenia.
komentarz 20 września 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 20 września 2017 przez plkpiotr

@Mateusz51: Dzięki, za rzeczowe dokończenie wątku i wyjaśnienie na przykładzie : )

komentarz 20 września 2017 przez mbabane Szeryf (79,280 p.)
edycja 20 września 2017 przez mbabane

Pozwolę tylko dodać żeby nikogo to nie wprowadzało w błąd.

 (analogia do polimorfizmu w C++)

Polimorfizm to nie jest mechanizm, który dotyczy tylko języka Cpp. Polimorfizm dotyczy ogólnie języków programowania, w których można pisać programy obiektowo.

komentarz 20 września 2017 przez plkpiotr Stary wyjadacz (12,420 p.)

Zgadza się, tutaj po prostu mi się przypomniał C++. Może dlatego, że to był pierwszy język w którym uczyłem się o wczesnymi i późnym wiązaniu, stąd może mi to zapadło w pamięć...

–1 głos
odpowiedź 20 września 2017 przez Wiciorny Ekspert (269,120 p.)

Nie możesz utworzyć  "INSTANCJI" obiektu  klasy która jest interfejsem....  Chyba, że wcześniej implementujesz ten interfejs w innej klasie. Bo nie możesz zwracać typu "interfejsu " więc taki zapis jest niepoprawny. 

komentarz 20 września 2017 przez Dethavel Początkujący (280 p.)
Czemu jest niepoprawny jeżeli np:

List list = new ArrayList();

Czy List to nie interfejs a ArrayList to nie klasa która do implementuje ?
komentarz 20 września 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Jeśli ja miałbym się ja czepną słownictwa to klasa nie może być interfejsem :)

A i możesz zwracać zmienną typu interfejsu i bardzo często się to robi.
komentarz 20 września 2017 przez Wiciorny Ekspert (269,120 p.)

a kto powiedział, że klasa może być interfejsem?Ogarnij definicje interfejsu czym jest... to tylko szkielet, żeby użyć interfejsu musisz go zaimplementować stąd klauzula choćby implements

druga sprawa  Listy są to uporządkowane kolekcje elementów. Listy dostarczane w ramach biblioteki standardowej języka Java to klasy implementujące interfejs java.util.List<E> (java.util.List w Javie sprzed wersji 1.5). 

więc tworzysz tutaj nie obiekt interfejsu, ale klasy która ten interfejs implementuje.  

Pokaż mi przypadek gdzie zwracasz zmienne TYPU INTERFEJSU :) 

komentarz 20 września 2017 przez Mateusz51 Nałogowiec (28,180 p.)

 "INSTANCJI" obiektu  klasy która jest interfejsem.... 

Napisałeś wyraźnie dlatego w charakterze pstryczka w nos napisałem ten komentarz.

A co do typów. Klasy i Interfejsy można nazwać w skrócie Typami. I choć masz pełną racje że musisz zwrócić obiekt klasy implementującej interfejs nie jest błędnym powiedzenie że zwraca się właśnie np "List"

komentarz 20 września 2017 przez Wiciorny Ekspert (269,120 p.)
no napisałem, nie można utworzyc instancji czyli obiektu klasy która jest interfejsem, nie można...
komentarz 20 września 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Tylko chodzi mi o to że klasa nie może być interfejsem, klasa to klasa a interfejs to interfejs.
komentarz 20 września 2017 przez Wiciorny Ekspert (269,120 p.)

człowieku ale gdzie ja napisałem "że klasa jest interfejsem" ? ... implementujesz ten interfejs w innej klasie

Słowo klasa  nie użyłem jako klasa ' zbiór programowania' tylko jako " abstrakcyjny model reprezentacji" a takie coś może być nazwane, tak samo jak jest klasa w szkole :) jako grupa... 

Podobne pytania

0 głosów
3 odpowiedzi 136 wizyt
pytanie zadane 28 stycznia 2017 w Java przez 0xf Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 181 wizyt
pytanie zadane 13 sierpnia 2020 w Java przez amtrax Dyskutant (9,630 p.)
0 głosów
1 odpowiedź 300 wizyt
pytanie zadane 11 stycznia 2021 w Java przez Lulex Użytkownik (820 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...