YouTube

Got a YouTube account?

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

Portuguese, Brazilian subtitles

← Herança de Comportamento

Conceitos sobre o princípio de herança de comportamento no contexto da linguagem de programação em Java.

Get Embed Code
13 Languages

Showing Revision 29 created 09/30/2015 by Thais Barros.

  1. Vamos voltar à aplicação Just Java
    por um momento.
  2. Vejamos a classe MainActivity >
    método displayMessage.
  3. As coisas começam a fazer
    um pouco mais de sentido aqui.
  4. Já percebemos que estamos
    tentando criar uma variável
  5. chamada
    orderSummaryTextView.
  6. E o tipo de informação
    desta variável é TextView.
  7. Mas ainda não havíamos
    entendido essa parte.
  8. Na linha seguinte, ordenamos
    um método a este objeto TextView.
  9. Usamos o mesmo nome da variável
    que foi declarada aqui em cima.
  10. Para podermos chamá-la
    orderSummaryTextView.setText.
  11. Depois passamos um string
    como entrada para o método.
  12. Esta mensagem de string
    chegou originalmente
  13. com um parâmetro de entrada
    do método displayMessage.
  14. Vamos passar para esta parte
    do código que ainda não entendemos.
  15. Parece que findViewById
    é uma ordem de método,
  16. porque precede estes parêntesis
    com o que parece ser
  17. um argumento de entrada.
  18. Mas o que é estranho
    é que este método
  19. não se encontra definido
    em parte nenhuma da classe.
  20. Se eu clicar duas vezes neste nome,
    carregando em Command+F,
  21. ou Control+F
    se estiver em Windows,
  22. podemos tentar fazer
    uma procura neste arquivo.
  23. Vejo apenas duas ocorrências
    de findViewByID
  24. e são usadas
    de modos semelhantes.
  25. Mas não vejo um método
    que se chame findViewById.
  26. A propósito, anteriormente,
    na classe MainActivity,
  27. viamos uma ordem para
    setContentView.
  28. Mas se a procurarmos no arquivo
    também não se encontra
  29. definida na MainActivity.
  30. Então, onde estão definidos
    estes métodos?
  31. Na verdade, o MainActivity
    é um arquivo bem pequeno.
  32. Tem apenas cerca de 90 linhas.
    Mas esta classe tem mais do que aparenta.
  33. O código diz
    extends.AppCompatActivity.
  34. Isso significa que MainActivity
  35. é uma extensão da funcionalidade
    na classe AppCompatActivity.
  36. No seu computador, se ao invés
    aparece ActionBarActivity aqui,
  37. não há problema pois trata-se
    de uma versão mais antiga disto.
  38. A versão mais recente que deve usar
    é a AppCompatActivity.
  39. Esta oferece suporte de compatibilidade
    com versões anteriores
  40. em aparelhos Android mais antigos.
  41. A atividade AppCompatActivity faz parte
    da biblioteca de suporte Android.
  42. Permite-nos usar os mais recentes
    atributos de UI da Android,
  43. enquanto ainda trabalhamos
    em aparelhos Android mais antigos.
  44. Ao extender a classe
    AppCompatActivity
  45. obtemos todas as funcionalidades,
    estados e métodos daqui,
  46. de dentro da MainActivity,
    gratuitamente.
  47. Não temos de copiar/colar
    qualquer código daqui.
  48. Podemos apenas
    extender essa classe.
  49. Se desejar, pode encontrar mais informação
    sobre AppCompatActivity no Google.
  50. Aqui está o documento de referência
    da lição sobre AppCompatActivity.
  51. Visto que eu tenho a extensão do Chrome
    instalada, posso ver a fonte também.
  52. E este é o código segundo o qual
    a lição sobre AppCompatActivity
  53. se encontra definida.
  54. Podemos ver que tem
    muitas funcionalidades aqui.
  55. Mas a mensagem principal
    é que você não tem de saber
  56. como elas são implementadas.
  57. Tudo o que precisa saber
    é que quando você
  58. usa extend AppCompatActivity
    obtém todas esta funcionalidade de graça.
  59. Num nível superior,
    pode visualizá-la do seguinte modo:
  60. Esta é uma definição de classe
    da MainActivity
  61. e suponhamos que tem
    alguns métodos definidos aqui.
  62. Quando extendemos AppCompatActivity,
    podemos acessar o estado e os métodos
  63. da AppCompatActivity.
  64. Eles não se encontram
    fisicamente adicionados
  65. à classe da MainAcitvity,
    mas pode imaginar que eles estão lá,
  66. porque ainda pode referenciar
    o estado assim como os métodos.
  67. E esta torre de código
    pode referir-se a coisas como
  68. ContentView ou findViewByID
    porque herdamos esses métodos.
  69. Não os definimos na MainActivity.
  70. A MainActivity é exibida
    como uma tela no aparelho.
  71. Mas nós não escrevemos o código
    para isso na MainActivity.
  72. Também o herdamos.
  73. Não temos o estado nem os métodos
    da AppCompatActivity
  74. diretamente na classe, mas agora
    sabemos que estão lá
  75. e podemos referenciá-los.
  76. Falando em herdar,
    há vantagens e desvantagens.
  77. Podemos desejar herdar o comportamento
    mas, por vezes, podemos querer
  78. modificá-lo um pouco.
  79. Se quiser modificar parte
    do comportamento desta classe herdada,
  80. pode sobrepor
    alguns dos métodos.
  81. Pode adicionar este @override
    em cima de um método
  82. para que o computador saiba
    que você não quer a versão
  83. do método de AppCompatActivity
    e que quer antes a versão
  84. que definiu aqui.
  85. Este ponto é complicado
    e requer muita prática.
  86. Mas já vimos um exemplo
    de sobreposição de um método
  87. da classe AppCompatActivity.
  88. e esse método é o onCreate.
    Ao substituir o onCreate na MainActivity,
  89. especificamos nossa própria implementação
    para o que vai acontecer quando o método
  90. for ordenado.
  91. Não se preocupe se não entender logo.
  92. Estou apenas dando um breve resumo
    de várias noções de programação por objetos.
  93. É perfeitamente normal
    que ainda tenha perguntas
  94. e necessite de ler mais um pouco
    antes de os entender na totalidade.
  95. Uma outra maneira de visualizar
    a relação entre MainActivity
  96. e as classes AppCompatActivity,
    é desenhando um diagrama
  97. com a hierarquia das classes.
  98. É diferente de um diagrama
    de hierarquia de views
  99. porque esse mostra
    uma árvore de views
  100. que são mostradas na tela.
  101. O diagrama de classes mostra a relação
    entre as diferentes classes de Java.
  102. Temos a AppCompatActivity
    como uma superclasse.
  103. Uma vez que a MainActivity estende
    a partir da superclasse AppCompatActivity,
  104. se denomina como subclasse.
  105. Por isso, sempre que vir
    esta definição de classe,
  106. o que quer que você estenda
    é conhecido como superclasse.
  107. E esta seria a subclasse.
  108. Assim, se criar outra atividade,
    tal como a DetailActivity,
  109. e estender a AppCompatActivity,
  110. esta seria a subclasse
    e esta a superclasse.
  111. Vejamos outro exemplo
    de herança de classes em Java.
  112. Se pensar nisso, TextView,
    ImageView e ButtonView,
  113. todas contêm aspetos comuns.
  114. Todas elas têm
    uma largura e altura na tela.
  115. Ainda não aprendemos isso,
    mas também têm um estado de visibilidade.
  116. De modo a poderem ser definidas
    como visíveis ou invisíveis.
  117. Existem outras propriedades também,
    comuns entre elas.
  118. Em vez de escrever o código
    para estas propriedades
  119. na classe TextView e depois
    copiá-lo para as classes
  120. ImageView e ButtonView,
    podemos fazer algo mais inteligente.
  121. Podemos criar uma classe View.
  122. Podemos extrair as propriedades comuns
    de todas estas vistas,
  123. e depois colocá-las
    dentro desta classe View.
  124. Assim, o código
    só tem de ser escrito uma vez.
  125. Mas como fazemos a ligação
    entre a classe TextView e a classe View?
  126. Se está pensando em herança,
    então você está certo.
  127. No arquivo Java TextView
    vamos definir uma classe TextView.
  128. Assim, herdaremos o estado
    e os métodos da classe View.
  129. E assim, não teremos tanto código
    na classe TextView
  130. porque parte da funcionalidade
    já se encontra escrita na classe View.
  131. O mesmo se aplica para as classes
    ImageView e ButtonView.
  132. Não temos de escrever
    todo esse código.
  133. Nesses arquivos, só temos de escrever
    o que é diferente na ImageView
  134. quando comparada
    com a classe View.
  135. Eu vejo isto com especificar um Delta.
  136. Assim, a classe ImageView
    só tem de especificar
  137. o que tem de diferente quando comparada
    com a classe View.
  138. Se não quisermos herdar alguns
    dos comportamentos da classe View,
  139. podemos simplesmente especificar
    o novo comportamento da classe ImageView
  140. ou de qualquer outra dessas classes.
  141. E relembrando a terminologia,
    aqui a TextView seria a subclasse
  142. e View seria a superclasse.
  143. Se voltarmos ao documento
    relativo à lição sobre TextView,
  144. já entenderemos esta parte.
  145. Diz, TextView extends View.
  146. Agora sabemos que significa que estamos
    herdando estado e métodos da classe View.
  147. E aqui temos um diagrama
    com a hierarquia de classes.
  148. Mostra que a classe TextView
    está herdando da classe View.
  149. E, por sua vez, a classe View
    está herdando da classe Objeto.
  150. Se continuar explorando,
    encontrará outras classes.
  151. Tal como a classe EditText,
    que estende da classe TextView.
  152. Por isso, herda o comportamento
    da classe TextView, para além
  153. de adicionar-lhe
    outras funcionalidades.
  154. Assim, EditText estende de TextView
    e TextView estende de View
  155. e View estende de Objet. E este
    é o diagrama de hierarquia de classes.
  156. Pode continuar a explorar
    durante horas, mas primeiro
  157. vou mostar algo da página
    da documentação sobre o TextView.
  158. Quero mostrar o método
    para definir a visibilidade.
  159. Aqui está o método Java para definir
    visibilidade na classe TextView.
  160. Isto permite alterar se a vista
    fica visível ou não.
  161. Se eu clicar nesse método,
    ele me leva até à classe View.
  162. E depois descreve
    o que o método faz.
  163. Pode ver que um objeto TextView
    tem um método para definir a visibilidade
  164. mas este foi herdado da classe View.
    Por isso, obtemos esta funcionalidade
  165. gratuitamente a partir da classe View.
  166. Acabamos de ver uma série
    de conceitos novos.
  167. Geralmente, estes estariam distribuídos
    ao longo de um semestre
  168. de um curso de Ciências da Computação.
  169. Vamos praticar um pouco
    e eu espero que as coisas
  170. comecem a ficar
    mais claras para você.
  171. Mas saiba que levará mais tempo
    e prática até conseguir dominar
  172. todos estes conceitos.
  173. No primeiro exercício,
    quero que você crie
  174. um novo aplicativo para Android,
    porque não queremos estragar
  175. o aplicativo Just Java.
  176. Depois de criar o projeto,
    rode o aplicativo.
  177. Depois de criar o aplicativo,
    verá um arquivo MainActivity.
  178. O arquivo MainActivity estenderá
    a partir de AppCompatActivity.
  179. Se na sua versão do Android Studio,
    MainActivity estende de ActionBarActivity,
  180. não há problema pois trata-se
    apenas de uma versão mais antiga.
  181. Ao remover este método Override,
    vamos voltar para o modo
  182. como o método OnCreate aparecia
    na classe AppCompatActivity.
  183. A presença deste método indica
    que queremos um comportamento diferente
  184. na MainActivity+ para o método Oncreate.
    Por isso, ao removê-lo,
  185. voltamos ao comportamento original
    da classe AppCompatActivity.
  186. Quando correr a aplicação,
    quais as diferenças em comparação
  187. com a primeira vez
    em que correu a aplicação?
  188. Escreva sua resposta nesta caixa.