1. Mas isso não é tudo.
Suponha que a Cow
classe tenha um printAll()
método que chama dois outros métodos. Então o código funcionará assim:
Código | Descrição |
---|---|
|
|
|
A saída da tela será:
|
Observe que quando o printAll()
método da Cow
classe é chamado em um Whale
objeto, o printName
método daWhale
classe é usado, não o do Cow
método.
O principal não é a classe em que o método é escrito, mas sim o tipo (classe) do objeto no qual o método é chamado.
Somente métodos não estáticos podem ser herdados e substituídos. Os métodos estáticos não são herdados e, portanto, não podem ser substituídos.
Aqui está a Whale
aparência da classe depois de aplicar a herança e a substituição do método:
|
Aqui está a Whale aparência da classe após a aplicação da herança e substituição de método: Não conhecemos nenhum printName método antigo. |
2. Datilografia
Há um ponto ainda mais interessante aqui. Como uma classe herda todos os métodos e dados de sua classe pai, uma referência a um objeto da classe filha pode ser armazenada em (atribuída a) variáveis cujo tipo é o mesmo da classe pai (e do pai do pai, etc. — todo o caminho até a Object
aula). Exemplo:
Código | Descrição |
---|---|
|
A saída da tela será:
|
|
A saída da tela será:
|
|
A saída da tela será:
O toString() método é herdado da Object classe |
Esta é uma propriedade muito valiosa: um pouco mais tarde você entenderá como usá-la na prática.
3. Chamando um método em um objeto
Quando um método é chamado em uma variável, o método é realmente chamado em um objeto. Esse mecanismo é chamado de envio de método dinâmico.
Veja como fica:
Código | Descrição |
---|---|
|
A saída da tela será:
|
|
A saída da tela será:
|
Observe que a implementação específica do printName()
método que é chamado — o da classe Cow
ou o da Whale
classe — não é determinado pelo tipo da variável, mas pelo tipo do objeto ao qual a variável se refere.
A Cow
variável armazena uma referência a um Whale
objeto, e o printName()
método definido na Whale
classe é o que é chamado.
Isso não é muito óbvio. Lembre-se da regra principal:
O conjunto de métodos disponíveis para serem chamados em uma variável é determinado pelo tipo da variável. E a implementação do método específico que é chamado é determinada pelo tipo/classe do objeto referido pela variável.
Você vai encontrar isso o tempo todo, então quanto mais cedo você se lembrar disso, melhor.
GO TO FULL VERSION