JavaRush /Java блог /Архив info.javarush /Классы и интерфейсы. Попытка понять
varbandim
9 уровень
Тверь

Классы и интерфейсы. Попытка понять

Статья из группы Архив info.javarush
Интерфейсы vs. классы — обзор на Хабре Интерфейсы в ООП (Java), по-простому? — на стэке Классы и интерфейсы. Попытка понять - 1Всё равно пока не понятно. Интерфейс — это тоже класс, только описывающий дополнительные методы для какого-либо класса? Если да, то методы начального класса просто не видны, или ими можно пользоваться? Или их необходимо переопределять? А если интерфейс не класс, тогда это просто список методов, объединённых под одним названием, которые можно использовать в любом классе, просто определив, для какого класса их используют? Или это группа методов, которые применимы к определённому классу? Тогда в программе переменная класса с определённым интерфейсом может использовать и методы класса, и методы интерфейса? Или только методы интерфейса? Допустим, есть класс человек, у которого описан булев метод движение. Мы можем применить к нему набор методов "ноги", "колёса" с разными видами движения? При этом будет ли булев метод класса человек виден через интерфейс "ноги" или "колеса"? Или всё же это будут другие классы, которые мы определяем для переменной: Человек Сэм = новый ЧеловекСНогами?И тогда у нас должен быть описан класс ЧеловекСНогами? Или же это просто набор методов?
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
sergentum Уровень 36
12 июля 2016
как я понимаю (не гуру). интерфейс — это набор правил, которым должен удовлетворять класс который будет его имплементировать. поскольку в интерфейсе реализации нет, а только список методов которые должны быть реализованы в классе — можно понять, что это просто список правил\свойств\методов, которые должны работать. это все нужно для нормальной и удобной работы в среде ява ооп.

Вот хороший пример выше про Лист. Ты можешь написать свой Лист, но он будет корявый если в нем не будут работать общие для всех списков методы типа add или get. То есть это делается для стандартизации\унификации. Ты пишешь свою реализацию Листа, которая может быть в каких случая будет быстрее работать\искать\перебирать или что то еще, но при этом ява, ты и другие разработчики могут этот класс использовать как и родные листы.
Sant9Iga Уровень 41
11 июля 2016
У машины есть руль, педали, коробка передач. Все это интерфейс под именем Машина. Интерфейс — это возможности какого то предмета. Все машины реализуют интерфейс машины. А это значит, что я с уверенностью 99.9%(оставим чуть-чуть на наши автомобили) могу сказать, что если тойота каролла импелементит интерфейс машины, то там будет руль, педали и коробка передач, и самое главное, я знаю что если нажму на педаль газа — машина будет ехать быстрее, если я поверну руль — повернет и машина, если дерну коробку передач — переключится передача. И мне глубоко наплевать что там внутри. Мне все равно как это работает. Я беру какую то хрень с интерфейсом машина — и еду. И мне практически все равно что там действительно за объект машины. главное оно поддерживает интерфейс машины.
То же самое и тут. У тебя есть Интерфейс List. И ты знаешь что в нем есть методы add() и get(). Все. Тебе все равно там у тебя ArrayList или LinkedList. Интерфейсы нужны для того что бы ты мог обобщить какие то сущности, и работать с ними как с одной.
Joysi Уровень 41
11 июля 2016
Как пример использования
Class АрмияБудущего {
  ArrayList<Подвижный> рота;
  АрмияБудущего() {
    рота.add(new Терминатор(Т1000));
    ...
    рота.add(new Человек("John Connor");
    ...
  }
  void УпастьИ_Отжаться() {
    for(int i=0; i<40; i+++) 
      for(s: рота) {
        s.Прыгать();
        s.Приседать();
      }
  }
Joysi Уровень 41
11 июля 2016
Как я думаю:
Интерфейс — это сущность, описывающее действия присущие ему как свойству — именно свойству, причастию (в английском языке -able окончание) — Подвижный, Запускаемый, Вычисляемый, а не предметы-существительные (колеса, ноги и т.п.).

Например,
interface Подвижный { void Прыгать(), void Идти(), void Приседать()}

Любой класс, который реализует свойство Подвижный, может и должен Прыгать, Идти, Приседать (другой вопрос насколько качественно). Причем каждый отдельный класс с данным интерфейсом (то есть обладает этими свойствами) может делать это по разному. И не каждый класс может реализовать данный интерфейс.

Класс — это обладатель этих свойств
Человек implements Подвижный {
  void Прыгать() {
   Высота_delta = func(СилаИкроножныхМышц);
   Координата_Z = Координата_Z+ Высота; 
   ...
  }
  void Приседать() {
   Координата_Z = Координата_Z * 0.4; 
   ...
  }
  ...
}


ТерминаторT1000 implements Подвижный {
  void Прыгать() {
   Высота_delta = func2(Заряд батареи);
   Координата_Z = Координата_Z+ Высота; 
   ...
  }
  void Приседать() {
   Координата_Z = 0.002 ; 
   ...
  }
  ...
}

А, например, файлу нельзя приписать интерфейс Подвижный.