Você está na página 1de 5



(QWHQGHQGRH$SOLFDQGR+HUDQoDHP-DYD

www.devmedia.com.br 
[versão para impressão]
Link original: http://www.devmedia.com.br/articles/viewcomp.asp?comp=24544

Entendendo e Aplicando Herança em
Java
Veja nesse artigo um dos conceitos mais utilizados no
paradigma de orientação a objetos: a herança. Entenda o
processo de generalização e aplique a herança em Java com
tudo que a linguagem oferece.

Nesse artigo vamos aprender uma das abstrações mais importantes da orientação a objetos: a
herança. Veremos como aplicá­la em Java, e quais as palavras­chave utilizadas na linguagem
para a representação deste conceito.
A herança é um princípio da POO que permite a criação de novas classes a partir de outras
previamente criadas. Essas novas classes são chamadas de subclasses, ou classes derivadas;
e as classes já existentes, que deram origem às subclasses, são chamadas de superclasses,
ou classes base. Deste modo é possível criar uma hierarquia dessas classes, tornando, assim,
classes mais amplas e classes mais específicas. Uma subclasse herda métodos e atributos de
sua superclasse; apesar disso, pode escrevê­los novamente para uma forma mais específica
de representar o comportamento do método herdado.
Para este artigo, utilizaremos o exemplo de uma modelagem de uma escola, representando
alunos, e professores e funcionários; pois é provável que tenhamos algumas características
comuns entre eles. Logo, para que não escrevamos o mesmo código duas ou mais vezes em
classes diferentes, podemos criar uma só superclasse chamada Pessoa para representar todos
os atores do nosso universo acadêmico, inserindo nela os comportamentos comuns aos três
tipos de “pessoas”. Este processo tem o nome de Generalização.
Vejamos uma possível modelagem da classe Pessoa.
Listagem 1: Classe Pessoa
‹’‘”–Œƒ˜ƒŜ—–‹ŽŜƒ–‡Ś
’—„Ž‹……Žƒ••‡••‘ƒƇ

KWWSZZZGHYPHGLDFRPEUDUWLFOHVYLHZFRPSBIRUSULQWDVS"FRPS  

Listagem 2: Classes Aluno. vemos que a classe pessoa possui nome. que recebe estes três dados como parâmetro. Analisando professores. vemos que todos podem (devem) ter cpf. Veja na listagem 2 como implementar essas três subclasses. e data de nascimento como atributos; além de um construtor. o programa deve fornecer seus dados. alunos e funcionários. e assim preenche os atributos do objeto. Em Java. Funcionario e Professor ‹’‘”–Œƒ˜ƒŜ—–‹ŽŜƒ–‡Ś ’—„Ž‹……Žƒ••Ž—‘‡š–‡†•‡••‘ƒƇ  ’—„Ž‹…Ž—‘ſ–”‹‰ɏ‘‡ř–”‹‰ɏ…’ˆřƒ–‡ɏ†ƒ–ƒƀƇ    ƈ  ’—„Ž‹…–”‹‰ƒ–”‹…—ŽƒŚ •—’‡”ſɏ‘‡řɏ…’ˆřɏ†ƒ–ƒƀŚ ƈ ’—„Ž‹……Žƒ••”‘ˆ‡••‘”‡š–‡†•‡••‘ƒƇ  ’—„Ž‹…”‘ˆ‡••‘”ſ–”‹‰ɏ‘‡ř–”‹‰ɏ…’ˆřƒ–‡ɏ†ƒ–ƒƀƇ    ƈ  ’—„Ž‹…†‘—„Ž‡•ƒŽƒ”‹‘Ś  ’—„Ž‹…–”‹‰†‹•…‹’Ž‹ƒŚ •—’‡”ſɏ‘‡řɏ…’ˆřɏ†ƒ–ƒƀŚ ƈ ’—„Ž‹……Žƒ•• —…‹‘ƒ”‹‘‡š–‡†•‡••‘ƒƇ  ’—„Ž‹… —…‹‘ƒ”‹‘ſ–”‹‰ɏ‘‡ř–”‹‰ɏ…’ˆřƒ–‡ɏ†ƒ–ƒƀƇ    ƈ  ’—„Ž‹…†‘—„Ž‡•ƒŽƒ”‹‘Ś  ’—„Ž‹…ƒ–‡†ƒ–ƒɏƒ†‹••ƒ‘Ś  ’—„Ž‹…–”‹‰…ƒ”‰‘Ś •—’‡”ſɏ‘‡řɏ…’ˆřɏ†ƒ–ƒƀŚ ƈ KWWSZZZGHYPHGLDFRPEUDUWLFOHVYLHZFRPSBIRUSULQWDVS"FRPS   . criamos classes derivadas utilizando a palavra extends. seguida do nome da superclasse. (QWHQGHQGRH$SOLFDQGR+HUDQoDHP-DYD  ’—„Ž‹…–”‹‰‘‡Ś  ’—„Ž‹…–”‹‰…’ˆŚ  ’—„Ž‹…ƒ–‡†ƒ–ƒɏƒ•…‹‡–‘Ś   ’—„Ž‹…‡••‘ƒſ–”‹‰ɏ‘‡ř–”‹‰ɏ…’ˆřƒ–‡ɏ†ƒ–ƒƀƇ   –Š‹•Ŝ‘‡ʰɏ‘‡Ś   –Š‹•Ŝ…’ˆʰɏ…’ˆŚ   –Š‹•Ŝ†ƒ–ƒɏƒ•…‹‡–‘ʰɏ†ƒ–ƒŚ  ƈ ƈ Neste primeiro código. nada mais justo que criar subclasses de Pessoa para representa­los. Na criação de um objeto Pessoa. CPF. nome e data de nascimento; portanto.

 No nosso caso. Portanto. nada (ou quase nada) impede que implementemos de novo os métodos e atributos que quisermos na subclasse.”cpf”. ’—„Ž‹……Žƒ••ƒ‹Ƈ  ’—„Ž‹…•–ƒ–‹…˜‘‹†ƒ‹ſ–”‹‰ƃƄƒ”‰•ƀƇ   Ž—‘‹ʰ‡™Ž—‘ſɑ ‘•‡ ”ƒ…‹•…‘ɑřɑɨɩɪŜɫɬɭŜɮɯɰŞɥɥɑř‡™ƒ–‡ſƀƀŚ   ›•–‡Ŝ‘—–Ŝ’”‹–Žſɑ‡Œƒ…‘‘‘•ƒ–”‹„—–‘•ˆ‘”ƒ’”‡‡…Š‹†‘•ɎɎ‘‡śɑʫ‹Ŝ‘‡ƀŚ   ›•–‡Ŝ‘—–Ŝ’”‹–Žſɑ śɑʫ‹Ŝ…’ˆƀŚ   ›•–‡Ŝ‘—–Ŝ’”‹–Žſɑƒ–ƒ†‡ƒ•…‹‡–‘śɑʫ‹Ŝ†ƒ–ƒɏƒ•…‹‡–‘Ŝ–‘–”‹‰ſƀƀŚ  ƈ ƈ Devemos saber que todos os métodos e atributos públicos e protegidos da superclasse serão herdados. E o que seria isso? A palavra super representa uma chamada de método ou acesso a um atributo da superclasse. Pode testar! Listagem 3: Testando a chamada super. por isso tem esse nome. os métodos e atributos privados (private) não serão herdados. estamos usando o super para invocar construtor da superclasse Pessoa. que recebe os três parâmetros e preenche os atributos do objeto. Então. e então seus atributos serão preenchidos com os dados enviados por parâmetro.new Date())”. por exemplo. quando criarmos um objeto do tipo Aluno. _cpf. ‹’‘”–Œƒ˜ƒŜ—–‹ŽŜƒ–‡Ś ’—„Ž‹……Žƒ••‡••‘ƒƇ  ’—„Ž‹…–”‹‰‘‡Ś  ’—„Ž‹…–”‹‰…’ˆŚ  ’—„Ž‹…ƒ–‡†ƒ–ƒɏƒ•…‹‡–‘Ś  ’—„Ž‹…‡••‘ƒſ–”‹‰ɏ‘‡ř–”‹‰ɏ…’ˆřƒ–‡ɏ†ƒ–ƒƀƇ   –Š‹•Ŝ‘‡ʰɏ‘‡Ś   –Š‹•Ŝ…’ˆʰɏ…’ˆŚ   –Š‹•Ŝ†ƒ–ƒɏƒ•…‹‡–‘ʰɏ†ƒ–ƒŚ  ƈ  ’—„Ž‹…†‘—„Ž‡–‹”ƒ”‘’‹ƒ•ſ‹–“–†ƀƇŵŵ‡–‘”ƒ‘’”‡­‘’ƒ”ƒ–‹”ƒ”…‘’‹ƒ•    ƈ ”‡–—”ɥŜɨɥƋſ†‘—„Ž‡ƀ“–†Ś KWWSZZZGHYPHGLDFRPEUDUWLFOHVYLHZFRPSBIRUSULQWDVS"FRPS   . criando assim um novo comportamento para funções específicas. Listagem 4: Sobrescrita de método para cálculo de preço de cópias para alunos e demais pessoas.String. Vejamos um exemplo da sobrescrita de método. (QWHQGHQGRH$SOLFDQGR+HUDQoDHP-DYD As novas classes criadas possuem suas características (atributos e métodos) próprias. utilizando “new Aluno(“nome”. _data);. e não teremos acesso a eles nem com a utilização da palavra especial super.Date). mas possuem também propriedades comuns: os atributos nome. Apesar de a classe derivada herdar os comportamentos públicos da classe base. Podemos sobrescrever métodos das superclasses. data de nascimento e CPF. caso utilize­se o extends Classe na definição de uma nova classe derivada. Podemos ver que cada construtor das novas classes possui uma chamada super(_nome. a classe Aluno invocará o construtor Pessoa(String.

 para evitar repetição de código em classes diferentes e melhorar a legibilidade da estrutura do programa.10 centavos cada. Precisamos lembrar que as outras duas classes que permaneceram intactas.07 centavos cada. a classe Aluno (ou qualquer outra classe derivada de Pessoa) estaria proibida de sobrescrever o método tirarCopias(int);. Isso significa que se na listagem 3 o método tirarCopias(int); da classe pessoa fosse definido como final. Anteriormente eu havia deixado subentendido que alguma coisa pode impedir que métodos sejam sobrescritos. Agora é só praticar um pouco para percebermos com mais facilidade quando pode ocorrer a generalização. então o método precisou ser sobrescrito. Funcionario e Professor. a seguir. herdarão o método tirarCopias(int); da classe Pessoa. Trata­se da palavra especial final. a cópia é mais barata para os alunos. portanto. terão suas cópias por 0. A declaração do método final seria como mostrado na listagem 5. Até a próxima. que só permite uma declaração da variável ou comportamento em questão. enquanto os alunos por 0. (QWHQGHQGRH$SOLFDQGR+HUDQoDHP-DYD ƈ ’—„Ž‹……Žƒ••Ž—‘‡š–‡†•‡••‘ƒƇ  ’—„Ž‹…Ž—‘ſ–”‹‰ɏ‘‡ř–”‹‰ɏ…’ˆřƒ–‡ɏ†ƒ–ƒƀƇ    ƈ  ’—„Ž‹…–”‹‰ƒ–”‹…—ŽƒŚ  ’—„Ž‹…†‘—„Ž‡–‹”ƒ”‘’‹ƒ•ſ‹–“–†ƀƇŵŵ”‡­‘’ƒ”ƒ–‹”ƒ”…‘’‹ƒ•’ƒ”ƒƒŽ—‘•    ƈ •—’‡”ſɏ‘‡řɏ…’ˆřɏ†ƒ–ƒƀŚ ”‡–—”ɥŜɥɮƋſ†‘—„Ž‡ƀ“–†Ś ƈ Como podemos observar. e então vamos falar disso agora. e. seria proibido reescrevê­lo na subclasse. galera. utilizada na declaração de métodos e atributos. Listagem 5: Declaração de método final ’—„Ž‹…ˆ‹ƒŽ†‘—„Ž‡–‹”ƒ”‘’‹ƒ•ſ‹–“–†ƀƇŵŵ‡–‘”ƒ‘’”‡­‘’ƒ”ƒ–‹”ƒ”…‘’‹ƒ•   ”‡–—”ɥŜɨɥƋſ†‘—„Ž‡ƀ“–†Ś ƈ Dessa forma. e bons estudos.  +XGVRQ*HRYDQH (VWXGDQWHGHFLrQFLDGDFRPSXWDomRQD8QLYHUVLGDGH)HGHUDOGR5LR*UDQGHGR1RUWH)RFRHPDOJRULWPRVH PDWHPiWLFDDSOLFDGD KWWSZZZGHYPHGLDFRPEUDUWLFOHVYLHZFRPSBIRUSULQWDVS"FRPS   .

 (QWHQGHQGRH$SOLFDQGR+HUDQoDHP-DYD KWWSZZZGHYPHGLDFRPEUDUWLFOHVYLHZFRPSBIRUSULQWDVS"FRPS   .