Fala, pessoal. Hoje vamos falar um pouco sobre herança de classe em Java.

Primeiramente, vamos a definição: herança em Java é um mecanismo no qual um objeto adquire propriedades e comportamentos de um objeto pai.

A ideia por trás da herança de classes em Java, é que você pode criar novas classes construídas sobre classes já existentes. Portanto, ao herdar de uma classe existente, você pode reutilizar métodos e atributos da classe pai, não sendo eles privados. Além disso, você também pode adicionar novos métodos e campos em sua classe atual.

Agora temos que entender alguns conceitos:

Subclasse/classe filha: subclasse é uma classe que herda a outra classe. Ela também é chamada de classe derivada, ou seja, ela é uma classe estendida de uma classe pai.

Superclasse /classe pai: superclasse é a classe de onde uma subclasse herda os recursos, e também pode ser chamada de classe base ou classe pai, ou seja, uma classe filha estende a classe pai.

Tipos de Herança

A seguir, alguns tipos de Herança que veremos nesse artigo:

A sintaxe usada para declarar que uma classe estende de outra, é feita na própria declaração da classe começando com uma palavra reservada chamada extends depois do nome da classe, e logo após o nome da classe que será estendida.

Vamos ver um exemplo a seguir:

class (nome da classe) extends (nome da classe que irá ser a classe pai){}

class Cachorro extends Animal{}

Herança simples

Primeiramente, vamos começar por uma demonstração básica sobre a Herança simples.

Na imagem a seguir, nós temos uma classe Animal que tem um atributo peso, e um método chamado dormir.

Em seguida, criamos a classe Gato e estendemos Animal usando o extends na hora da criação da classe, ou seja, declarando que a classe Gato está recebendo por herança (está estendendo da classe Animal) e recebendo seus métodos e atributos por meio disso.

Portanto, na nossa classe de teste dentro do método Main, estamos instanciando um Gato e fizemos os testes pra ver se ele realmente recebeu as Heranças.

Veja um exemplo a seguir:

Como podemos ver, o gato consegue chamar o método getPeso e dormir() e ter acesso ao atributo que recebeu por herança de Animal, que se torna sua superclasse/Classe pai.

Herança Multinível

Agora, partiremos para um exemplo de Herança Multinível:

Aqui temos uma classe Gato e ela extends de Animal e logo após isso a classe GatoFilhote extendsde Gato. Nesse caso, Gato vai herdar de Animal e o GatoFilhote vai herdar de Gato. Todos os comportamentos e atributos que Gato recebeu por herança, ele também vai passar como herança para o seu filhote.

Um exemplo mais familiar é considerar as classes Animal (Avô) Gato (Pai) GatoFilhote(Filho).

Herança Hierárquica

Nesse momento vamos para outro ambiente, onde será mais complexo e será utilizada também herança.

Uma classe Animal tem atributos que animais possuem em comum como cor, peso, tamanho, e se é herbívoro ou carnívoro. Isso são características de todos animais, e essa classe também tem métodos que são (ações dos animais em comum), exemplificando comer e dormir.

Então, nesse caso Animal agora possui duas classes filhas: Cachorro e Cavalo, ou seja, estão estendendo de Animal. Portanto, como Cavalo e Cachorro são filhos de Animal, também terão as mesmas características herdadas como: cor, peso, tamanho, e se é herbívoro ou carnívoro, por exemplo, e também suas ações, comer e dormir. E assim será se outra classe também estender-se de Animal.

Agora, vamos verificar como isso fica no código. Logo abaixo estão as classes feitas com seus devidos atributos e métodos onde iremos usar herança.

Note que a classe Cavalo está estendendo de Animal e Cachorro . Então, vamos usar isso como exemplo de que os atributos e métodos são realmente recebidos por herança.

Nessas classes, cada uma tem seus métodos e seus atributos. Por causa da herança, toda vez que eles forem instanciadas, a instância terá esses atributos e métodos da própria classe instanciada. Porém, quem extends uma classe pai, irá receber os atributos e métodos dessa classe também.

Classes declaradas que vamos usar

Observe a seguir:

Agora, o exemplo herança hierárquica usando as classes a que mencionamos acima:

Nesse exemplo, nós temos instâncias de Cavalo e Cachorro.

Então vamos relembrar: o Cavalo está estendendo de Animal, ou seja, os atributos de animal e seus métodos virão nessa instância criada. Como podemos ver na demonstração, os métodos e atributos de Animal estão sendo chamados pela instância de cavalo normalmente, já a instância de Cachorro não consegue ter acesso a isso porque o mesmo não extends de Animal.

Também temos uma classe Gato para demonstração de como uma classe sem absolutamente nada, porém estendendo (extends) de uma classe pai, irá receber seus atributos e métodos como herança, como exemplo, a instância gato chamando métodos de Animal.

Conclusão

Em síntese, nós vimos as principais formas de herança de classes com Java e como utilizá-las. Também entendemos como funcionam de uma forma simples, rápida e com exemplos em códigos, e (claro) com um dos princípios mais aceitos por toda a comunidade: a reutilização de código.