Niech ktoś mi wytłumaczy jak to jest z tymi inerfejsami w JAVIE

0

Cześć
mam problem ze zrozumieniem sensu istnienia interfejsów w JAVIE. Wiem, że są to niejako klasy czysto abstrakcyjne, które posiadają jedynie deklarację metod i pól.
Klasy, które implementują dany interfejs są niejako zmuszone do utworzenia metod jakie są zadeklarowane w interfejsie.

Czytam teraz o wielowątkowości i jeśli chcemy ją zastosować w klasie, która już dziedziczy od innej, musimy uciec się do interfejsów (nie ma wielodziedziczenia).

Implementujemy w naszej klasie interfejs Runnable, tworzymy, nadpisujemy właściwie metodę run() i ... o dziwo, nasza klasa już wie, że nowy wątek rozpoczyna działanie właśnie w tej metodzie. Potrafi jeszcze wiele innych rzeczy. Pytanie tylko skąd ona to wie, skoro interfejs runnable zawierał tylko deklaracje metod? W zasadzie było to klika linijek kodu, bez implementacji żadnych metod i mechanizmów.

2

Mieszasz pojęcia, masz błędne wyobrażenie o interfejsach i - poniekąd słusznie - komentujesz bezsens tego.

Interfejs to NIE obiekt, obiekt to NIE interfejs. Interfejs określa, co z obiektem można zrobić.

W tym konkretnym przypadku zakładam, że sprawa wygląda tak:

public class MyClass implements Runnable {
    // ...
    public void run(){
        // do something
    }

    public static void main(String[] args){
        MyClass mClass = new MyClass();
        Thread t = new Thread(mClass);
        t.start();
    }
}

o dziwo, nasza klasa już wie, że nowy wątek rozpoczyna działanie właśnie w tej metodzie

Jest dokładnie na odwrót. Nasza klasa NIE wie, że nowy wątek ma rozpoczynać działanie właśnie w tej metodzie. Ale za to obiekt Thread t wie, że ma stworzyć nowy wątek i wie też, którą metodę odpalić.

Skąd wie? Stąd, że tworzysz go poprzez "new Thread(Runnable)". Obiektu Thread nie obchodzi, jakiej klasy jest dostarczony obiekt, ale czy jest on Runnable.

To tak jak z kuchnią chińską w Polsce - nie ważne, czy coś szczeka, miauczy czy kwili - jak się da to usmażyć, to i tak skończy jako kurczak w cieście.

Pytanie tylko skąd ona to wie, skoro interfejs runnable zawierał tylko deklaracje metod?

Jeszcze raz: interfejs to nie jest obiekt. Przekazujesz obiekty, które inny obiekt widzi jako interfejsy.

0

OK, dzięki. A teraz napiszę jak ja to zrozumiałem i powiesz mi, czy w miarę dobrze.

To obiekt t klasy Thread wie co i jak zrobić, żeby uruchomić wielowątkowość. Ma tylko jeden warunek. Może to zrobić z obiektem, którego klasa implementuje interfejs Runnable. To z kolei powoduje, że mamy pewność, że klasa ta na 100% będzie posiadała metodę run() (interfejs to na niej wymusił).

Czy tak jest?

1

Tak.

0

Thanx :)

0
lorak75 napisał(a):

Czy tak jest?

Tak, ale ;) Od Javy 8 w przypadku interfejsów z jedną metodą, możesz przekazać do takiego obiektu thread referencję do zupełnie innej metody a i tak wszystko zadziała. Dla uproszczenia, możemy założyć, że dla Thread prócz tego, że umie uruchomić coś co jet Runnable umie również uruchomić coś o takiej samej sygnaturze - w tym przypadku metodę nieprzyjmującą żadnych argumentów i zwracającą voida.

1

@olek1
W Javie 8 można przekazać referencję do metody, tzn.

public class MyMain {
    public static void notRun(){
        // do something
    }

    public static void main(String[] args){
        Thread t1 = new Thread(MyMain::notRun);
        t1.start();
    }
}
1

@olek1 chodzi własnie o to, że od jdk8 da się ;)
Przykładowo mając taką klasę:

class R {
    public void runUnThread(){}
}

Można ją przekazać do wątku w taki sposób:

R r = new R();
new Thread(r::runUnThread).start();

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0