@valomi

Как реализуются интерфеинтерфесы в Java?

Я понимаю зачем нужны интерфейсы и все такое. Но у меня вопрос: когда мы имплементим, к примеру, Runnable, то просто вкладываем свой код в метод run(). Это все понятно. Типа мы его переопределяем. Но как Java понимает что данный метод надо пустить в поток? Например, если я создам свой интерфейс:
interface MyRunnable{
void run(); }
будет ли это то же самое что я заимлименчку Runnable. Сомневаюсь что мой код сработает. Значит Java стандарная библиотка работает по другому? Тот интерфейс "делает работу", а мой только заставляет переопределять пустой метод. Т.е. Мой интерфейс не сообразит пустить метод в новый поток. Я предполагаю что JRE имеет дополнительные механизмы которые обрабатывает свои интерфейсы по другому. Runnable это только пример, можно привести любой другой пример интерфейса из стандартной библиотеки.
Еще раз: я имплименчу метод из интерфеса, вкладываю в него свой код и интерфейс уже обрабатывает его: пускает в поток, создает кнопку и т.д. Вот как это происходит? Это уже заложено в самой Java и особо не париться над этим?
  • Вопрос задан
  • 240 просмотров
Решения вопроса 1
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
Видимо не достаточно понимаете =)
Когда вы имплементируете интерфейс, к примеру Runnable, то вы реализуете метод run(). Вы его не переопределяете а реализуете, это не одно и тоже с переопределением. В JAVA есть класс Thread в котором объявлено что он знает интерфейс Runnable(вполне конкретный) и что в нем совершенно точно есть реализация метода run(), других методов которые не объявлены в интерфейсе не знает.
Например если вы создатите свой интерфейс:
interface MyRunnable{
      void run(); 
}

То класс Thread никак не будет знать что это и что с ним делать и пошлет вас в веселую пешую прогулку.
Даже если вы создатите "однофамильца":
interface Runnable{
      void run(); 
}

То класс Thread никак не будет знать что это и что с ним делать и пошлет вас в веселую пешую прогулку. Потому что это не реализация java.lang.runnable.
Зато такой момент сработает:
interface MyRunnable extends Runnable{
      void some(); //Обратите внимание что тут уже run нельзя объявить т.к. он объявлен в  Runnable
}

и при реализации этого интерфейса вас заставят реализовывать уже 2 метода
class CoolRunnable implements MyRunnable{
      void some(){System.out.print("some from MyRunnable")} 
      void run(){System.out.print("run from Runnable")} 
}

И в этом случае класс Thread увидит что класс CoolRunnable реализует интерфейс Runnable в котором есть метод run() о котором он знает и который ему нужен. Метод some() он не увидит. При запуске соответственно он выведет только "run from Runnable".

Если попробовать на пальцах объяснить так сказать по аналогии с чемто. Скажем вы класс который может нажимать на левую кнопку мыши. Ничего другого вам не объясняли. Т.е. вам дали описание что это называется мышь и на котором есть кнопка слева и которую нужно нажать. Теперь любой производитель берет это описание и реализует мышь с левой кнопкой. Каждый свою, из разного материала, с разными механизмами кнопки и принципами работы, разной формы, и даже с кучей других кнопок. Все они попадают к вам, вы смотрите что конкретный экземпляр мыши реализован по описание которое вы знаете, кроме того это именно то описание что у вас а не одноименное. На основе этого вы признаете что эта вещь вам подходит и начинаете нажимать левую кнопку мыши на любой такой мышке которую вам дадут. Если же приходит другой предмет то вы ломаете палец, потом руку и умираете от потери крови с криками что это не по описанию что у вас есть.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы