Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Herança em Java - o que é, para que serve, exemplos e quando usar

Chegamos em um ponto muito importante em nosso curso de Java no que se refere a Programação Orientada a Objetos.
Herança é uma das maiores características desse tipo tão importante e usado tipo de programação.

Através desse recurso, você irá criar classes de uma maneira bem mais rápida, eficiente e fácil de manter: baseando classes em outras.

O que é herança em Java - Superclasse e subclasse

O que é herança, na vida real?
É quando um pessoa deixa seus bens para outra. No Java também.
Geralmente a herança ocorre dentre membros de uma mesma família. No Java também.

Herança, em Java, nada mais é do que criar classes usando outras classes já existentes.
Obviamente, você vai fazer uma classe herdar as características de outra se estas tiverem uma relação (se forem parecidas).
Outro ponto importante é que, quando fazemos uso da herança, nós podemos adicionar mais atributos a classe.


Exemplo 1: Carros e motos
Imagine que você tem uma revenda de veículos: carros e motos.
Todos são veículos. Ora, crie a classe "Veiculo".

O que esses veículos tem em comum?
Motor, preço, marca, nome do cliente que vai comprar, quantos quilômetros fazem com 1 litro de combustível etc.
Todos os objetos da classe "Veiculo" tem essas características.

Porém, existem algumas características que as motos tem que um carro não tem: capacete, somente duas rodas, cilindrada etc.
Também existem características que os carros tem que as motos não tem: podem ter 4 portos, banco de couro, ar-condicionado etc.

Para resolver esse problema, e deixar a aplicação MUITO MAIS ORGANIZADA, vamos fazer duas classes: "Moto" e "Carro".
Cada uma dessas irá herdar a classe "Veiculo", pois também são um tipo de veículos.

Dizemos que "Veiculo" é a superclasse, "Moto" e "Carro" são subclasses.
Faz sentido, não?


Exemplo 2: Alunos de uma escola

Se for criar uma aplicação para um colégio, muito provavelmente você vai criar uma classe chamada "Aluno".
O que todo aluno tem em comum, para colocarmos nessa classe?
Tem seu nome, cursa uma série, tem seu número de matrícula etc.

Mas um aluno do 2o grau tem matérias como Física, Biologia e Química.
Coisa que aluno do ensino fundamental não tem.
Ou seja, se você tentar criar uma classe e colocar as matérias Física, Química e Biologia para um aluno que não cursa essas matérias, estará tendo problemas, pois muito provavelmente você deveria preencher as notas e faltas dessas matérias no construtor.

E pra calcular a média? A média inclui todas as matérias, ora. Mas os alunos de uma escola não tem as mesmas disciplinas.
E agora? Criar vários métodos diferentes dentro da classe, e acionar o método certo para o cálculo da média através de um booleano?

Claro que não! Vamos criar outras classes: "fundamental" e "medio".
A nossa classe mãe - ou superclasse - será a "Aluno", com dados e disciplinas QUE TODOS os alunos possuem em comum.

Fazemos "fundamental" e "medio" herdarem as características da "Aluno", e dentro de cada subclasse (ou classe filha) dessas irá ter seus métodos e variáveis a mais.

Note que, ao herdar, você é mais eficiente, pois não precisa criar duas classes de alunos diferentes.
Ao herdar, automaticamente as subclasses irão possuir as mesmas variáveis e métodos.


Exemplo 3: Funcionários de uma empresa


Ok, você já sabe que os funcionários da tesouraria, do suporte técnico e do alto escalão são diferentes, fazem diferentes tarefas e tem diferentes características profissional.

Então você cria uma classe para cada tipo de setor: "FuncionarioTesouraria", "FuncionarioSecretaria", "FuncionarioTI" etc.
Uma trabalheira...ao término disso tudo, terá dezenas de classes só para representar os funcionários.

Porém, as redes sociais, como Facebook e Twitter estão muito na moda e são usadas, inclusive, em meios profissionais. Sabia que as empresas olham o facebook de um candidato ao emprego antes de contratar?
Então seu chefe pediu para você adicionar o campo "Facebook" no registro de cada funcionário.

Nossa! E agora? Vai em cada uma das dezenas de classes, adicionar esse campo?
Agora não vai mais, pois aprendeu sobre herança aqui no Java Progressivo (e de graça, que bom hein?).
Uma boa solução seria criar a superclasse "Funcionario", com dados que TODOS os funcionários possuem: idade, nome, salário, setor que trabalha etc.

Qual a vantagem disso?
Ora, se você adicionar o campo "facebook" na classe "Funcionario", todas as subclasses passarão a ter esse campo! Pois todas as subclasses (Tesouraria, Secretaria, TI...) são também classes do tipo "Funcionario".
Notou a importância e a mão-na-roda que é herança?


Quando e como saber que é hora de usar herança em Java - Relação 'é um'


Para saber quando usar, e detectar o uso de herança, use a relação 'é um'.
Nos exemplos anteriores:
"Moto" é um "Veiculo", e "Carro" é um "Veículo".
"alunoMedio" é um "Aluno", assim como "alunoFundamental" é um "Aluno".
"FuncionarioTesouraria" é um "Funcionario" e também "FuncionarioTI" é um "Funcionario".

Bem simples e óbvio, não?
Essa é a vantagem do Java e da programação orientada a objetos(POO).
POO é uma imitação do mundo real.


Hierarquia - subclasse de subclasse

Você notou que, por exemplo, dentro do setor "Tesouraria" de uma empresa, podem existir diversos tipos de profissionais, com características únicas e diferentes?

Ora, uma secretária faz uma coisa. O chefe da tesouraria faz outras coisas.
Logo, uma única classe "FuncionarioTesouraria" não seria o suficiente para definir todos os trabalhadores dessa seção?

O que fazer, então?
Crie classes que herdam a classe 'FuncionarioTesouraria' para cada setor da Tesouraria.
Aí teríamos que a 'FuncionarioTesouraria' seria a superclasse da subclasse "TesourariaSecretarias", que tem os atributos que só as secretárias da seção da tesouraria teriam.

Mas "FuncionarioTesouraria" continuaria sendo uma subclasse da "Funcionario".
E "TesourariaSecretarias" também são subclasses da classe "Funcionario", afinal, todos são funcionários.

Então "Funcionario" é superclasse de "FuncionarioTesouraria" e também é superclasse de "TesourariaSecretarias".
Porém, somente a classe "FuncionarioTesouraria" é superclasse direta da "TesourariaSecretarias".

Bem óbvio e parecido com o mundo.
Uma maravilha essa Orientação a Objetos


Outra vantagem da Herança - Organização

Muitas vezes, durante sua carreira de programador, você terá que estudar o código de outras pessoas.
Se o outro programador que você está estudando (ou decifrando) seu código não tiver estudado no Java Progressivo, vai ser muito desorganizado.

Contextualizando com nossos exemplos, será bem comum você ver:
"TesourariaFuncionarios", "TesourariaSecretarias", "CozinheiraExecutivos", "FuncionariosSecretaria", "Chefes" etc.
Ou seja, muitas classes, muitas informações e tudo completamente desorganizado.

Ao criar superclasses e subclasses você terá uma hierarquia.
Sua IDE vai mostrar as superclasses e suas respectivas subclasses em uma árvore, tudo bem bonito e organizado.

Ao chegar e ver isso na sua IDE:
Funcionários: 
            -Tesouraria:
                      -Secretárias
                      -Banco
                      -Chefes
                
            -Secretaria
                      -Secretárias
                      -Almoxarifado
                      -Supervisores

            -TI
                      -Redes
                      -Office
                      -Programação
                                -Banco de dados
                                -Java
                                -C
                                -C++



Você entende como funciona a empresa somente vendo.
Por exemplo, que tipos de funcionários de TI existem?
Os responsáveis pela Rede, outro pra ensinar e tirar dúvidas sobre o Office e os programadores.

E dentre os programadores, que tipos existem?
É óbvio achar e ver que existem os responsáveis pelo Banco de dados, os que fazem aplicações em Java, C e os que fazem em C++.

Organizado, não?

7 comentários:

Anônimo disse...

Muito bom esplêndido!!
a dica do é um, fará com que
muitos programadores iniciantes
tenham mais dinamismo em seus aplicativos este site é um presente para todos nós parabéns mais uma vez!!

Russell9 disse...

Caros, uma ferramenta como essa é uma iniciativa incrível, as gerações poderiam estar estudando o que realmente é o futuro, ao invés de decorar a capital da bósnia... tudo no google...
a tal "educação" para um povo vai se resumir a Finanças, Inglês e computação(em todos os níveis).
Parabéns a vcs, sinceros agradecimentos...

Anônimo disse...

Este curso de Java e o de C tem me enriquecido e muito na minha faculdade,gostaria de agradecer a voçê que contribuiu ou que contruiu este projeto, nós estudantes de TI,mas especificamente de Programação,precisamos mesmo de uma linguagem assim: Simples, descontraída e direta. Muito Obrigado.Sempre tenho compartilhado a rede de vcs no meu Facebook e aos meus colegas de faculadade :-)

Anônimo disse...

Sou muito grato por poder utilizar desse belíssimo conteúdo e ser capaz de adquirir o domínio da linguagem JAVA. Esse site esta de parabéns.

Luan disse...

Parabéns pelo site, o JavaProgressivo salva minha vida diversas vezes, tudo bem explicado, de forma simples e eficiente, Agradeço de coração por disponibilizar todo conhecimento na web.
Continue assim e obrigado.

nelson disse...

Parabéns pelo site, gosto muito dos jeito que vocês lidão com esta matéria que e um pouco difícil de se intender.
Obrigado e estão me ajudando muito com este conteúdo.

Anônimo disse...

Pessoal do Java Progressivo, Tenho uma dúvida em relação aos conceitos de herança.

Tenho a seguinte dúvida:
Só podemos sobrescrever um método através de Herança?

Obrigado desde Já.

Contribuir com o Java Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo


Tutoriais de Java