Texto de: Geraldo Daros
Introdução
A herança em Java é um mecanismo no qual um objeto adquire propriedades e comportamentos de um objeto pai. A ideia por trás a herança de classes em Java, é que você possa criar novas classes construídas sobre classes que já existem. Portanto, ao herdar de uma classe existente, você pode reutilizar métodos e atributos que não sejam privados da classe pai. Além disso, você também pode adicionar novos métodos e campos em sua classe atual.
Antes de irmos mais a fundo na herança, existem alguns termos que precisamos ter em mente:
Subclasse/classe filha: subclasse é uma classe que herda de 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:
Nós temos 3 tipos de herança em Java: herança simples, herança multinível e herança hierárquica. Veremos todos esses tipos de herança com mais detalhes ao longo desse artigo.
Sintaxe
Para declarar que uma classe estende de outra, adicionamos a palavra reservada extends
seguida do nome da classe que será estendida logo após o nome da classe que realizará a extensão, na própria definição da classe.
Definição normal de uma classe:
public class Gato {
}
Faremos então uma classe chamada Animal para fazer Gato estender de Animal. Para isso acontecer temos que adicionar o texto extends [nome da classe]
ou seja, extends Animal
na definição da classe Gato. Da seguinte forma:
public class Gato extends Animal{
}
Essa é a forma da sintaxe para o uso da herança.
Herança simples
Vamos começar por uma demonstração básica sobre a Herança simples.
Primeiro, criaremos uma classe Animal que tem um atributo peso, e um método chamado dormir.
class Animal {
private Double peso;
public void dormir(){}
public Double getPeso(){return peso;};
}
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 uma herança (está estendendo da classe Animal) e recebendo os métodos e atributos da superclasse por meio disso.
public class Gato extends Animal{
}
Agora, na nossa classe de teste dentro do método Main, estamos instanciando um Gato e fizemos os testes para ver se ele recebeu realmente as Heranças.
Nessa imagem acima, temos a classe Gato declarada sem absolutamente nenhum atributo, mas fizemos ela estender de Animal, que por sua vez, possui atributos e funcionalidades.
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:
public class Teste {
public static void main(String[] args){
GatoFilhote gatoFilhote = new GatoFilhote();
gatoFilhote.comer();
gatoFilhote.miar();
}
}
class Gato extends Animal {
public void miar(){}
}
class GatoFilhote extends Gato {}
class Animal {
public void comer(){}
}
Aqui temos uma classe Gato e ela estende Animal e logo depois temos a classe GatoFilhote que estende Gato. Nesse caso, Gato vai herdar de Animal e 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 as suas classes filhas. Então uma instância de GatoFilhote tem acesso aos atributos e comportamentos de Gato e Animal, como visto no exemplo o acesso ao método miar() de Gato e comer() de Animal. Um exemplo mais familiar é considerar as classes Animal como avô, Gato como pai e GatoFilhote como filho.
Herança Hierárquica
A hierarquia de herança é um conceito em que uma classe "pai" contém mais de uma classe "filha". Um exemplo ilustrativo seria a classe Animal em um sistema que gerencia diversas espécies animais. Embora todos os animais pertençam à categoria geral de animais, como gatos, papagaios, cachorros, etc., na modelagem do sistema, podemos criar uma classe que atua como a "classe pai" para todos os tipos de animais.
Dessa forma, a classe Animal serviria como a base comum, fornecendo atributos e comportamentos compartilhados por todos os animais, tais como espécie, peso, cor, data de nascimento, habitat natural, alimentação, entre outros. Todos os animais, por sua vez, estenderiam a classe Animal, herdados esses atributos essenciais. Isso elimina a necessidade de replicar manualmente essas características em cada uma das inúmeras espécies de animais no sistema.
Para ilustrar esse conceito, vejamos um exemplo prático no código-fonte:
public class Teste {
public static void main (String[] args){
Gato gato = new Gato();
Jacare jacare = new Jacare();
Cobra cobra = new Cobra();
Sucuri sucuri = new Sucuri();
}
}
class Gato extends Animal{}
class jacare extends Animal {}
class Cobra extends Animal {}
class sucuri extends Cobra {}
class Animal {
private String especie;
private Double peso;
private String cor;
private Date dataNascimento;
private String habitatNatural;
private String alimentacao;
// Contrutores, getters e setters omitidos para simplificar o exemplo
}
Nesse código nós podemos observar que, temos 3 classes estendendo a classe Animal, isso significa que estamos fazendo o uso da herança hierárquica. Também usamos a herança multinível, no momento em que temos Cobra estendendo a classe Animal e Sucuri estendendo Cobra.
Conclusão
Nesse artigo nós vimos as principais formas de herança de classes com Java e como utilizá-las, de forma bem simples para que você possa utilizar e fazer seus próprios exemplos. Saber utilizar herança traz vários benefícios para nosso código como: reutilização, organização e estruturação, manutenção e compreensão do código.