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

Instancja obiektu typu interfejsowego

VPS Starter Arubacloud
0 głosów
397 wizyt
pytanie zadane 14 marca 2017 w Java przez itcloud Gaduła (3,380 p.)
Chyba jestem na dobrej drodze zrozumienia, o co chodzi z tymi interfejsami, ale jednak nie potrafię rozkminić poniższych zapisów:

TypInterfejsowy zmienna = new KonstruktorKlasy();

Jestem na razie teoretykiem i przyzwyczaiłem się do myślenia, że jak tworzę obiekt klasy, to typ zmiennej referencyjnej jest po lewej stronie, a po prawej oczywiście tworzony obiekt (nazwa konstruktora, tej samej klasy co typ powstającej referencji).

Wiem, ze dzięki polimorfizmowi, typ może być bardziej ogólny (gdy tworzę obiekt klasy która dziedziczy po innej, tej bardziej ogólnej).

Ale o co chodzi z tym, gdy jako typ jest interfejs i przeważnie takie zapisy widzę w listingach u zawodowych programistów ? Będę wdzięczny za wytłumaczenie.

ps. co to jest interfejs wiem :)

1 odpowiedź

0 głosów
odpowiedź 14 marca 2017 przez KubenQPL Maniak (62,820 p.)
Jeśli jako typ masz interfejs to zdefiniować możesz każdą klasę implementującą ten interfejs, ale możesz używać tylko metod ktore są w tym interfejsie.
komentarz 14 marca 2017 przez itcloud Gaduła (3,380 p.)
rozumiem. Czyli mogę zdefiniować zmienną będącą referencją do obiektu np.:

A zmienna = new B();

I ta zmienna będzie mieć od razu zaimplementowane metody (metody z ciałem), ale tylko te będą dostępne, które były zdefiniowane w interfejsie A ? Ogólnie jest to z tego co widzę pokłosie polimorfizmu, tak? Czyli jak z kolei tym razem DZIEDZICZĘ np.

class B extends A...

to mogę tworzyć obiekt typu:

A zmienna2 = new B();

czyli tak naprawdę zmienna2 ma dostęp do metod, ale tylko tych które są w tej nadklasie, klasie bazowej A?

Jaki cel jest stosowania tych interfejsów to nie do końca rozumiem.
1
komentarz 14 marca 2017 przez KubenQPL Maniak (62,820 p.)
Z dziedziczeniem - tak, możesz używać metod klasy B jeśli rzutujesz ((B) zmienna2).metodaKlasyB();

Na początku też nie widziałem sensu ale jak bedziesz tego potrzebował to zrozumiesz. Ale tak po krótce Callbacki, Listenery itd. są interfejsami.
komentarz 14 marca 2017 przez KubenQPL Maniak (62,820 p.)
Albo inaczej, jakaś metoda jako argument ma interfejs A, i ta metoda wykonuje jakies operacje i na ukończenie tej operacji wywołuje metodę interfejsu A.onSucces(); interfejs instancjujesz gdzie indziej i tam piszesz ciało metody onSuccess() jakie chcesz czyli to co ma sie wykonać po ukończeniu tamtej operacji.
komentarz 14 marca 2017 przez itcloud Gaduła (3,380 p.)
>Z dziedziczeniem - tak, możesz używać metod klasy B jeśli rzutujesz

((B) zmienna2).metodaKlasyB();

Aha, czyli ze względu na to, że zmienna referencyjna jest typu A, to mogę korzystać normalnie jedynie z tych metod, które są w klasie A jak i w klasie B?

zmienna2.metodaKlasyA() ? Tu nie muszę stosować rzutowania? Czy mogę tę analogię z klasami stosować do typów interfejsowych? Czyli to o czym pisałem w pierwszym poście ?

> Albo inaczej, jakaś metoda jako argument ma interfejs A, i ta metoda wykonuje jakies >operacje i na ukończenie tej operacji wywołuje metodę interfejsu A.onSucces();

czyli masz na myśli coś takiego:

public metoda(A zmienna)

gdzie A to typ interfejsowy? Bo nie ogarniam.
komentarz 14 marca 2017 przez KubenQPL Maniak (62,820 p.)
Wrócę do domu to pokażę na przykładzie kodu.
1
komentarz 14 marca 2017 przez KubenQPL Maniak (62,820 p.)
public class HelloWorld
{
  static B zmB;
  public static void main(String[] args)
  {
    zmB = new B();
    obliczCos(zmB);
  }
  
  public static void obliczCos(A interfejsA){
   	//coś tam liczy i gdy skończy wywołuje onSuccess, ale metodaB() jest nie dostępna, są dostępne tylko metody interfejsu którego typu jest ten obiekt czyli A
    int i = 2 + 2;
    interfejsA.onSuccess();
    //Tutaj poniżej metodaB() jest dostępna ponieważ interfejsA został "przekonwertowany" (rzutowany) na klasę B.
    ((B)interfejsA).metodaB();
  }
  
	public interface A{
 		void onSuccess(); 
	}
  
 	static class B implements A{
   		@Override
    	public void onSuccess(){
     	 //wykonaj jakieś operacje
      	// ta metoda jest dostępna dla każdego obiektu typu A
      	System.out.println("koniecc");
  	}
    
    public void metodaB(){
     //ta metoda jest dostępna tylko dla obiektów B
      System.out.println("metodaB");
    }
  }
}

 

komentarz 14 marca 2017 przez itcloud Gaduła (3,380 p.)
Mam pytania odnośnie kodu:

1. static B zmB;

Gdy klasa jest statyczna to rozumiem, że można wywoływać ją bezpośrednio bez tworzenia instancji klasy. Co, jeśli zmienna jest statyczna? Znaczy to, że można z niej korzystać w każdym miejscu kodu?

2.

public void metodaB(){

     //ta metoda jest dostępna tylko dla obiektów B

możesz wyjaśnić, dlaczego? Znowu nie wiem, czemu tą klasę oznaczyłeś jako statyczną, czegoś najwyraźniej nie rozumiem. I czy jeśli tam byłoby zamiast implements extends, był to by analogiczny przypadek?
1
komentarz 14 marca 2017 przez KubenQPL Maniak (62,820 p.)
Klasa jest statyczna ponieważ statyczna metoda (main) może korzystać tylko ze statycznych zmiennych, obiektów i metod (chyba że zmienne były deklarowane już w ciele tej metody).

2. metodaB() jest dostępna tylko w obiekcie B ponieważ interfejs A nie ma takiej metody, więc jeśli zdefiniujesz zmienną A instancją klasy B będą dostępne tylko metody które zawiera A. Jeśli rozszerzałbyś (extends) inną klasę (nie interfejs) to też dostępne byłyby tylko metody klasy która jest typem zmiennej,

Podobne pytania

0 głosów
1 odpowiedź 193 wizyt
pytanie zadane 30 kwietnia 2016 w Java przez Ehlert Ekspert (212,630 p.)
+1 głos
1 odpowiedź 112 wizyt
pytanie zadane 29 czerwca 2021 w Java przez Lulex Użytkownik (820 p.)
0 głosów
0 odpowiedzi 425 wizyt
pytanie zadane 5 października 2017 w Java przez rubesom Obywatel (1,690 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 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!

...