YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Russian subtitles

← Inheriting Behavior

Get Embed Code
13 Languages

Showing Revision 2 created 10/15/2015 by Darren Bridenbeck (Amara Staff).

  1. Давайте вернемся к приложению JustJava.
  2. Обратите внимание на класс MainActivity,
    метод displayMessage.
  3. Теперь все становится немного понятнее.
  4. Мы уже установили, что создаем переменную
    под названием orderSummaryTextView,
  5. а тип данных для этой переменной
    называется TextView.
  6. Однако мы пока не разобрались
    с этой частью.
  7. На следующей строке мы вызываем метод для
    этого объекта text view.
  8. Мы используем то же название
    переменной, что и здесь:
  9. так, мы вызываем
    orderSummaryTextView точка setText.
  10. Затем следует строка
    со входными данными для метода.
  11. Сообщение в этой строке изначально служило
    входным параметром
  12. метода displayMessage.
  13. А теперь давайте разберем эту часть кода,
    которая для нас пока непонятна.
  14. Судя по всему, findViewById —
    это все-таки вызов метода:
  15. он располагается перед частью в скобках,
    которая похожа на входной аргумент.
  16. Однако очень странно, что этот метод
    нигде не определен в данном классе.
  17. Если дважды кликнуть это название,
    а затем нажать command F или
  18. control F, если у вас Windows,
    то можно выполнить поиск по этому файлу.
  19. Нашлось только два совпадения
    с findViewById.
  20. В обоих случаях
    они используются одинаково.
  21. Однако я не вижу ни одного метода
    под названием findViewById.
  22. К слову, ранее в классе MainActivity
  23. можно увидеть вызов setContentView,
    и если выполнить аналогичный поиск
  24. в файле, метод также не будет
    определен в MainActivity.
  25. Так где же определены эти методы?
  26. Вообще, MainActivity —
    довольно маленький файл:
  27. в нем всего 90 строк, но на самом деле
  28. он длиннее, чем видно с первого взгляда.
  29. В коде написано расширение
    AppCompatActivity,
  30. это значит, что MainActivity —
    это расширение
  31. функциональности класса AppCompatActivity.
  32. Если на вашем компьютере вы
    видите ActionBarActivity,
  33. ничего страшного —
    это всего лишь более старая версия.
  34. В последней версии, что вы используете,
    метод называется AppCompatActivity.
  35. AppCompatActivity обеспечивает
    обратную совместимость
  36. с более старыми устройствами Android.
  37. AppCompatActivity — это часть
    библиотек Android Support.
  38. Она позволяет использовать
    последние функции UI на Android
  39. и одновременно поддерживает
    более старые устройства Android.
  40. За счет расширения
    класса AppCompatActivity
  41. мы бесплатно получаем всю функциональность
    состояний и методов отсюда.
  42. Внутри класса MainActivity
  43. не нужно копировать
    и вставлять код отсюда.
  44. Можно просто расширить этот класс.
  45. Если вам интересно,
  46. можно найти больше информации об
    AppCompatActivity в Google.
  47. Вот поисковый массив для этого класса
    класса AppCompatActivity
  48. Поскольку у меня установлено
    расширение Chrome,
  49. я также могу видеть исходный код.
  50. А вот часть кода, где определен класс
    AppCompatActivity.
  51. Вы видите, что здесь множество
    функциональности, но самое главное:
  52. вам не нужно понимать,
    как она реализована.
  53. Все, что вам нужно знать: когда вы
    расширяете класс AppCompatActivity,
  54. вы получаете всю эту функциональность
    бесплатно.
  55. На высоком уровне
    это можно визуализировать так.
  56. Это определение класса для Main Activity.
  57. А методы определены вот здесь.
  58. При расширении AppCompatActivity мы
    получаем доступ к состояниям
  59. и методам AppCompatActivity.
  60. Сейчас они физически не добавлены
    к классу MainActivity,
  61. но понятно, что они там находятся,
  62. поскольку вы можете сослаться
    на состояние и методы тоже.
  63. А вот так код может ссылаться
    на такие методы, как setContentView
  64. или findViewById,
  65. потому что мы унаследовали эти методы.
    Мы не определяли их в MainActivity.
  66. Класс MainActivity показан
    как экран на устройстве,
  67. но мы и этот код не прописывали
    в MainActivity. Мы его тоже унаследовали.
  68. У нас в классе нет состояний и методов
    напрямую из AppCompatActivity,
  69. однако теперь мы знаем, что они тут,
    и можем на них ссылаться.
  70. При использовании наследования
    есть плюсы и минусы.
  71. Иногда хочется унаследовать поведение,
  72. но в ряде случаев может потребоваться
    слегка его изменить.
  73. Если вы хотите изменить
    поведение из унаследованного класса,
  74. вы можете переопределить нужные методы.
  75. Добавьте текст @override над методом,
    чтобы компьютер понимал,
  76. что вам не нужна версия метода
    из AppCompatActivity,
  77. а нужна данная версия, которую
    вы определили вот здесь.
  78. Это сложная тема, которая требует
    практики,
  79. тем не менее мы уже видели пример
    переопределения метода
  80. из класса AppCompatActivity,
  81. и это метод onСreate.
  82. Используя переопределение
    метода onСreate в MainActivity,
  83. мы указываем собственную реализацию того,
    что должно произойти по вызову метода.
  84. Не беспокойтесь, если вы
    сразу всего не понимаете.
  85. Я просто даю вам краткий обзор
    некоторых понятий
  86. объектно-ориентированного
    программирования.
  87. Совершенно понятно,
    что у вас останутся вопросы и
  88. вам потребуется больше информации
    по этим темам
  89. для полного понимания.
  90. Другой способ показать
    взаимосвязь между классами
  91. MainActivity и AppCompatActivity —
    построить диаграмму иерархии классов.
  92. Она отличается от диаграммы иерархии
    видов view, так как диаграмма иерархии
  93. видов view показывает дерево видов
    view, которые отображаются на экране.
  94. Диаграмма иерархии классов
    показывает взаимоотношение
  95. между разными Java-классами.
  96. AppCompatActivity — это суперкласс,
  97. Начинается с AppCompatActivity
    из AppCompactActivity.
  98. и называется подклассом.
  99. Итак, когда вы видите определение
    этого класса, то, что вы расширяете,
  100. называется суперклассом,
  101. а вот это будет подклассом.
  102. Так, если вы создадите другой класс
    под названием DetailActivity
  103. и расширите AppCompatActivity,
    это будет подклассом,
  104. а это суперклассом.
  105. А вот еще один пример
    унаследования Java-класса.
  106. Если подумать, и TextView, и ImageView,
  107. и ButtonView обладают общими свойствами.
  108. У них всех есть ширина и высота на экране.
  109. Мы еще об этом не говорили, но
    у них также есть состояние видимости,
  110. Их можно сделать невидимыми или видимыми.
  111. Есть еще ряд других свойств,
    общих для них всех.
  112. Вместо того чтобы писать код
    для этих свойств в TextView,
  113. а затем копировать его в ImageView
    и класс Button,
  114. можно сделать кое-что поумнее.
  115. Можно создать класс View,
    экспортировать общие свойства
  116. для всех видов views, а затем
    поместить их внутрь этого класса View.
  117. Таким образом,
    код нужно будет написать всего один раз.
  118. Но теперь как нам соединить TextView
  119. и класс View?
  120. Если вы подумали о наследовании, вы правы.
  121. В java-файле TextView мы определим класс,
  122. так мы унаследуем все состояния
    и методы из класса View,
  123. и нам не потребуется писать
    много кода для класса TextView,
  124. так как часть их функциональности
    уже обозначена в классе View.
  125. То же самое применимо к классам ImageView
    и button.
  126. Нам не нужно писать много кода,
  127. в этих файлах потребуется
    лишь указать разницу
  128. в ImageView по сравнению с классом View.
  129. Я определяю это как обозначение различий.
    Итак, в классе ImageView нужно
  130. указать только то, что отличается
    от ImageView по сравнению с классом View.
  131. Если вы не хотите наследовать
    определенное поведение из класса View,
  132. можно просто указать новое
    поведение внутри класса ImageView
  133. или в любом из этих классов.
  134. Возвращаясь к терминологии,
    в данном примере
  135. TextView будет подклассом,
    а View — суперклассом.
  136. Если снова обратиться к документации по
  137. классу TextView,
    теперь нам понятна эта часть.
  138. В ней говорится,
    что TextView расширяет View.
  139. Теперь мы знаем, что это означает:
    мы наследуем состояние
  140. и методы из класса View,
  141. а ниже диаграмма иерархии классов,
  142. которая показывает, что класс TextView
    наследует класс View.
  143. А класс View в свою очередь
    наследует класс Object.
  144. Если изучить код,
    можно найти другие классы,
  145. например класс EditText, который
    фактически расширяет класс TextView.
  146. Он берет поведение из класса TextView
  147. и добавляет к нему
    специфичную функциональность.
  148. Так, EditText расширяет TextView,
  149. TextView расширяет View,
    а View расширяет Object.
  150. А вот здесь
    показана диаграмма иерархии классов.
  151. Деталей очень много,
    и можно разбираться в них часами,
  152. но я хочу показать вам одну вещь
    на странице документации TextView.
  153. Я хочу познакомить вас с методом
    SetVisibility.
  154. Вот Java-метод для установки
    видимости внутри класса TextView,
  155. эта часть меняется в зависимости
    от того, видим view или нет.
  156. Если кликнуть на этот метод,
    я перейду к классу view,
  157. а затем идет описание того,
    что этот метод делает.
  158. Вы видите, что у TextView object есть
    метод SetVisibility,
  159. но по сути он был унаследован
    из класса View.
  160. Так мы получили функциональность
    бесплатно из класса View.
  161. Хорошо, мы только что ознакомились
    с множеством новых понятий.
  162. Обычно изучение данного материала занимает
    целый семестр курса компьютерных наук.
  163. Давайте теперь немного попрактикуемся, и,
  164. я надеюсь, вы сможете
    составить для себя полную картину.
  165. Но учтите, что потребуется
    гораздо больше времени и
  166. практики, прежде чем вы полностью
    разберетесь в этих понятиях.
  167. Так, в этом упражнении вы должны
    будете создать новое приложение Android,
  168. потому что мы не хотим
    испортить приложение JustJava.
  169. Сначала создайте проект,
    потом запустите приложение.
  170. Когда вы создадите приложение, вы увидите
    файл MainActivity.
  171. Этот файл MainActivity будет унаследован
    из AppCompactActivity.
  172. Если в вашей версии Android Studio
    вместо этого MainActivity
  173. наследуется из ActionBarActivity,
    все нормально:
  174. это просто более старая версия
    AppCompactActivity.
  175. Удалив этот метод переопределения,
    мы вернемся к тому,
  176. как метод onСreate появился
    в классе AppCompactActivity.
  177. Наличие этого метода говорит о том,
    что нам нужно
  178. другое поведение в MainActivity
    для метода onCreate.
  179. То есть его удаление приводит
    к восстановлению исходного поведения
  180. класса AppCompatActivity.
  181. После запуска приложения
    обратите внимание на то, что изменилось
  182. по сравнению с первым запуском приложения.
  183. Запишите свой ответ в тетради.