A herança é um dos conceitos fundamentais da programação orientada a objetos (POO) e Java é uma linguagem que incorpora completamente esses conceitos. A herança permite que uma classe adquira propriedades e comportamentos de outra classe, promovendo a reutilização de código e a criação de uma hierarquia de classes. No Java, a sintaxe e os conceitos relacionados à herança são centrais para a criação de aplicações eficientes e bem estruturadas.

Conceito de Herança

Em Java, a herança é usada para estabelecer uma relação de tipo "é-um" entre classes. Se uma classe B é derivada de uma classe A, dizemos que B é um tipo especializado de A. Por exemplo, se temos uma classe "Veículo" e uma classe "Carro", podemos dizer que "Carro" é um "Veículo", portanto, "Carro" herda de "Veículo".

Isso significa que "Carro" herda todas as propriedades e métodos públicos e protegidos da classe "Veículo", a menos que "Carro" os substitua (um conceito conhecido como sobrescrita ou overriding). Além disso, "Carro" pode adicionar seus próprios métodos e propriedades específicos.

Sintaxe de Herança em Java

Para implementar a herança em Java, usamos a palavra-chave extends. Aqui está um exemplo simples de como a herança pode ser expressa:

class Veiculo {
    // Propriedades e métodos da classe Veiculo
}

class Carro extends Veiculo {
    // Propriedades e métodos adicionais da classe Carro
}

No exemplo acima, "Carro" herda de "Veículo". Isso significa que "Carro" tem acesso a todos os métodos e propriedades de "Veículo" (exceto os privados), e pode também ter seus próprios métodos e propriedades.

Utilizando o Construtor da Superclasse

Quando uma classe herda de outra, o construtor da superclasse (a classe da qual está herdando) não é herdado. Para chamar o construtor da superclasse, usamos a palavra-chave super. Isso é geralmente feito na primeira linha do construtor da subclasse:

class Veiculo {
    Veiculo() {
        // Construtor da superclasse
    }
}

class Carro extends Veiculo {
    Carro() {
        super(); // Chama o construtor da classe Veiculo
        // Código adicional para o construtor de Carro
    }
}

O uso do super é essencial quando a superclasse não tem um construtor padrão (sem parâmetros) ou quando queremos chamar um construtor específico da superclasse.

Sobrescrita de Métodos

Em Java, uma subclasse pode sobrescrever os métodos da superclasse. Isso é feito declarando um método na subclasse com a mesma assinatura que o método na superclasse. A sobrescrita permite que a subclasse forneça uma implementação específica de um método que já existe na superclasse.

class Veiculo {
    void mover() {
        System.out.println("Veículo está se movendo");
    }
}

class Carro extends Veiculo {
    @Override // Anotação opcional que indica sobrescrita de método
    void mover() {
        System.out.println("Carro está se movendo");
    }
}

No exemplo acima, o método mover() na classe "Carro" sobrescreve o método mover() na classe "Veiculo". A anotação @Override é opcional, mas é uma boa prática usá-la, pois ela ajuda a identificar erros em tempo de compilação se o método não corresponder corretamente a um método na superclasse.

Polimorfismo com Herança

Herança e polimorfismo andam de mãos dadas em Java. Polimorfismo é a capacidade de tratar objetos de diferentes subclasses de uma mesma superclasse como se fossem do mesmo tipo. Isso permite que métodos possam ser escritos de maneira mais genérica, lidando com a superclasse, mas funcionando corretamente com qualquer subclasse.

Veiculo meuVeiculo = new Carro();
meuVeiculo.mover(); // Chama o método mover() de Carro

No exemplo acima, mesmo que meuVeiculo seja do tipo "Veículo", o método mover() que é chamado é o da classe "Carro", porque o objeto real é uma instância de "Carro".

Acesso aos Membros da Superclasse

Quando uma subclasse sobrescreve um membro da superclasse, às vezes é necessário acessar o membro da superclasse. Isso é feito usando a palavra-chave super.

class Carro extends Veiculo {
    @Override
    void mover() {
        super.mover(); // Chama o método mover() da superclasse Veiculo
        // Código adicional específico para Carro
    }
}

No exemplo acima, super.mover() é usado para chamar o método mover() da superclasse "Veiculo" antes de executar o código adicional da subclasse "Carro".

Restrições da Herança

Embora a herança seja poderosa, há algumas restrições em Java:

  • Uma classe só pode herdar de uma única superclasse (Java não suporta herança múltipla diretamente).
  • Classes marcadas como final não podem ser herdadas.
  • Métodos marcados como final não podem ser sobrescritos.

Conclusão

A herança é um pilar da POO e fornece uma maneira poderosa de organizar e reutilizar código. A sintaxe de herança em Java é direta, mas é importante entender os detalhes e as melhores práticas para usar a herança de maneira eficaz. Ao criar uma hierarquia de classes com herança, podemos construir aplicações mais modulares e fáceis de manter.

Agora responda o exercício sobre o conteúdo:

_Qual das seguintes afirmações sobre herança em Java é correta?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

Imagem do artigo Sintaxe básica de Java: Polimorfismo

Próxima página do Ebook Gratuito:

15Sintaxe básica de Java: Polimorfismo

5 minutos

Ganhe seu Certificado deste Curso Gratuitamente! ao baixar o aplicativo Cursa e ler o ebook por lá. Disponível na Google Play ou App Store!

Disponível no Google Play Disponível no App Store

+ de 6,5 milhões
de alunos

Certificado Gratuito e
Válido em todo o Brasil

48 mil exercícios
gratuitos

4,8/5 classificação
nas lojas de apps

Cursos gratuitos em
vídeo, áudio e texto