Você está na página 1de 18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

APOSTILA JAVA E ORIENTAO A OBJETOS

CAPTULO 7

Herana, reescrita e polimorfismo


"O homem absurdo aquele que nunca muda." Georges Clemenceau Ao trmino desse captulo, voc ser capaz de: dizer o que herana e quando utiliz-la; reutilizar cdigo escrito anteriormente; criar classes filhas e reescrever mtodos; usar todo o poder que o polimorfismo d.

7.1 - REPETINDO CDIGO ?


Como toda empresa, nosso Banco possui funcionrios. Vamos modelar a classe F u n c i o n a r i o :
c l a s sF u n c i o n a r i o{ S t r i n gn o m e ; S t r i n gc p f ; d o u b l es a l a r i o ; / /m t o d o sd e v e mv i ra q u i }

Alm de um funcionrio comum, h tambm outros cargos, como os gerentes. Os gerentes guardam a mesma informao que um funcionrio comum, mas possuem outras informaes, alm de ter funcionalidades um pouco diferentes. Um gerente no nosso banco possui tambm uma senha numrica que permite o acesso ao sistema interno do banco, alm do nmero de funcionrios que ele gerencia:
c l a s sG e r e n t e{ S t r i n gn o m e ;
www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 1/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

S t r i n gc p f ; d o u b l es a l a r i o ; i n ts e n h a ; i n tn u m e r o D e F u n c i o n a r i o s G e r e n c i a d o s ; p u b l i cb o o l e a na u t e n t i c a ( i n ts e n h a ){ i f( t h i s . s e n h a= =s e n h a ){ S y s t e m . o u t . p r i n t l n ( " A c e s s oP e r m i t i d o ! " ) ; r e t u r nt r u e ; }e l s e{ S y s t e m . o u t . p r i n t l n ( " A c e s s oN e g a d o ! " ) ; r e t u r nf a l s e ; } } / /o u t r o sm t o d o s }

Precisamos mesmo de outra classe? Poderamos ter deixado a classe F u n c i o n a r i omais genrica, mantendo nela senha de acesso, e o nmero de funcionrios gerenciados. Caso o funcionrio no fosse um gerente, deixaramos estes atributos vazios. Essa uma possibilidade, porm podemos comear a ter muito atributos opcionais, e a classe ficaria estranha. E em relao aos mtodos? A classe G e r e n t etem o mtodo a u t e n t i c a , que no faz sentido existir em um funcionrio que no gerente.

Se tivssemos um outro tipo de funcionrio que tem caractersticas diferentes do funcionrio comum, precisaramos criar uma outra classe e copiar o cdigo novamente! Alm disso, se um dia precisarmos adicionar uma nova informao para todos os funcionrios, precisaremos passar por todas as classes de funcionrio e adicionar esse atributo. O problema acontece novamente por no centralizarmos as informaes principais do funcionrio em um nico lugar! Existe um jeito, em Java, de relacionarmos uma classe de tal maneira que uma delas herda tudo que a outra tem. Isto uma relao de classe me e classe filha. No nosso caso, gostaramos de fazer com que o G e r e n t etivesse tudo que um F u n c i o n a r i otem, gostaramos que ela fosse uma extenso de F u n c i o n a r i o . Fazemos isto atravs da palavra chave e x t e n d s .

www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais

2/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

c l a s sG e r e n t ee x t e n d sF u n c i o n a r i o{ i n ts e n h a ; i n tn u m e r o D e F u n c i o n a r i o s G e r e n c i a d o s ; p u b l i cb o o l e a na u t e n t i c a ( i n ts e n h a ){ i f( t h i s . s e n h a= =s e n h a ){ S y s t e m . o u t . p r i n t l n ( " A c e s s oP e r m i t i d o ! " ) ; r e t u r nt r u e ; }e l s e{ S y s t e m . o u t . p r i n t l n ( " A c e s s oN e g a d o ! " ) ; r e t u r nf a l s e ; } } / /s e t t e rd as e n h ao m i t i d o }

Em todo momento que criarmos um objeto do tipo G e r e n t e , este objeto possuir tambm os atributos definidos na classe F u n c i o n a r i o , pois um G e r e n t e um F u n c i o n a r i o :

c l a s sT e s t a G e r e n t e{ p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s ){ G e r e n t eg e r e n t e=n e wG e r e n t e ( ) ; / /p o d e m o sc h a m a rm t o d o sd oF u n c i o n a r i o : g e r e n t e . s e t N o m e ( " J o od aS i l v a " ) ; / /et a m b mm t o d o sd oG e r e n t e ! g e r e n t e . s e t S e n h a ( 4 2 3 1 ) ; } }

Dizemos que a classe G e r e n t eherda todos os atributos e mtodos da classe me, no nosso caso, a F u n c i o n a r i o . Para ser mais preciso, ela tambm herda os atributos e mtodos privados, porm no consegue acess-los diretamente. Para acessar um membro privado na filha indiretamente, seria necessrio que a me expusesse um outro mtodo visvel que invocasse esse atributo ou mtodo privado.

Super e Sub classe


www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 3/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

A nomenclatura mais encontrada que F u n c i o n a r i o a superclasse de G e r e n t e ,eG e r e n t e a subclasse de F u n c i o n a r i o . Dizemos tambm que todo G e r e n t e um F u n c i o n r i o . Outra forma dizer que F u n c i o n a r i o classe me de G e r e n t ee G e r e n t e classe filha de F u n c i o n a r i o .

E se precisamos acessar os atributos que herdamos? No gostaramos de deixar os atributos de F u n c i o n a r i o ,p u b l i c , pois dessa maneira qualquer um poderia alterar os atributos dos objetos deste tipo. Existe um outro modificador de acesso, op r o t e c t e d , que fica entre o p r i v a t ee o p u b l i c . Um atributo p r o t e c t e ds pode ser acessado (visvel) pela prpria classe e por suas subclasses (e mais algumas outras classes, mas veremos isso em outro captulo).
c l a s sF u n c i o n a r i o{ p r o t e c t e dS t r i n gn o m e ; p r o t e c t e dS t r i n gc p f ; p r o t e c t e dd o u b l es a l a r i o ; / /m t o d o sd e v e mv i ra q u i }

Sempre usar protected? Ento porque usar p r i v a t e ? Depois de um tempo programando orientado a objetos, voc vai comear a sentir que nem sempre uma boa ideia deixar que a classe filha acesse os atributos da classe me, pois isso quebra um pouco a ideia de que s aquela classe deveria manipular seus atributos. Essa uma discusso um pouco mais avanada. Alm disso, no s as subclasses, mas tambm as outras classes, podem acessar os atributos p r o t e c t e d , que veremos mais a frente (mesmo pacote). Veja outras alternativas ao p r o t e c t e dno exerccio de discusso em sala de aula juntamente com o instrutor.

Da mesma maneira, podemos ter uma classe D i r e t o rque estenda G e r e n t ee a classe P r e s i d e n t epode estender diretamente de F u n c i o n a r i o . Fique claro que essa uma deciso de negcio. Se Diretor vai estender de Gerente ou no, vai depender se, para voc, Diretor um Gerente. Uma classe pode ter vrias filhas, mas pode ter apenas uma me, a chamada herana simples do java.
www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 4/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

7.2 - REESCRITA DE MTODO


Todo fim de ano, os funcionrios do nosso banco recebem uma bonificao. Os funcionrios comuns recebem 10% do valor do salrio e os gerentes, 15%. Vamos ver como fica a classe F u n c i o n a r i o :
c l a s sF u n c i o n a r i o{ p r o t e c t e dS t r i n gn o m e ; p r o t e c t e dS t r i n gc p f ; p r o t e c t e dd o u b l es a l a r i o ; p u b l i cd o u b l eg e t B o n i f i c a c a o ( ){ r e t u r nt h i s . s a l a r i o*0 . 1 0 ; } / /m t o d o s }

Se deixarmos a classe G e r e n t ecomo ela est, ela vai herdar o mtodo g e t B o n i f i c a c a o .


G e r e n t eg e r e n t e=n e wG e r e n t e ( ) ; g e r e n t e . s e t S a l a r i o ( 5 0 0 0 . 0 ) ; S y s t e m . o u t . p r i n t l n ( g e r e n t e . g e t B o n i f i c a c a o ( ) ) ;

O resultado aqui ser 500. No queremos essa resposta, pois o gerente deveria ter 750 de bnus nesse caso. Para consertar isso, uma das opes seria criar um novo mtodo na classe G e r e n t e , chamado, por exemplo, g e t B o n i f i c a c a o D o G e r e n t e . O problema que teramos dois mtodos em G e r e n t e , confundindo bastante quem for usar essa classe, alm de que cada um da uma resposta diferente. No Java, quando herdamos um mtodo, podemos alterar seu comportamento. Podemos reescrever (reescrever, sobrescrever, override) este mtodo:
www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 5/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

c l a s sG e r e n t ee x t e n d sF u n c i o n a r i o{ i n ts e n h a ; i n tn u m e r o D e F u n c i o n a r i o s G e r e n c i a d o s ; p u b l i cd o u b l eg e t B o n i f i c a c a o ( ){ r e t u r nt h i s . s a l a r i o*0 . 1 5 ; } / /. . . }

Agora o mtodo est correto para o G e r e n t e . Refaa o teste e veja que o valor impresso o correto (750):
G e r e n t eg e r e n t e=n e wG e r e n t e ( ) ; g e r e n t e . s e t S a l a r i o ( 5 0 0 0 . 0 ) ; S y s t e m . o u t . p r i n t l n ( g e r e n t e . g e t B o n i f i c a c a o ( ) ) ;

Tire suas dvidas no novo GUJ Respostas O GUJ um dos principais fruns brasileiros de computao e o maior em portugus sobre Java. A nova verso do GUJ baseada em uma ferramenta de perguntas e respostas (QA) e tem uma comunidade muito forte. So mais de 150 mil usurios pra ajudar voc a esclarecer suas dvidas. Faa sua pergunta.

7.3 - INVOCANDO O MTODO REESCRITO


Depois de reescrito, no podemos mais chamar o mtodo antigo que fora herdado da classe me: realmente alteramos o seu comportamento. Mas podemos invoc-lo no caso de estarmos dentro da classe. Imagine que para calcular a bonificao de um G e r e n t edevemos fazer igual ao clculo de um F u n c i o n a r i oporem adicionando R$ 1000. Poderamos fazer assim:
c l a s sG e r e n t ee x t e n d sF u n c i o n a r i o{ i n ts e n h a ; i n tn u m e r o D e F u n c i o n a r i o s G e r e n c i a d o s ; p u b l i cd o u b l eg e t B o n i f i c a c a o ( ){ r e t u r nt h i s . s a l a r i o*0 . 1 0+1 0 0 0 ; } / /. . . }
www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 6/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

Aqui teramos um problema: o dia que o g e t B o n i f i c a c a odo F u n c i o n a r i o mudar, precisaremos mudar o mtodo do G e r e n t epara acompanhar a nova bonificao. Para evitar isso, o g e t B o n i f i c a c a odo G e r e n t epode chamar o do F u n c i o n a r i outilizando a palavra chave s u p e r .
c l a s sG e r e n t ee x t e n d sF u n c i o n a r i o{ i n ts e n h a ; i n tn u m e r o D e F u n c i o n a r i o s G e r e n c i a d o s ; p u b l i cd o u b l eg e t B o n i f i c a c a o ( ){ r e t u r ns u p e r . g e t B o n i f i c a c a o ( )+1 0 0 0 ; } / /. . . }

Essa invocao vai procurar o mtodo com o nome g e t B o n i f i c a c a ode uma super classe de G e r e n t e . No caso ele logo vai encontrar esse mtodo em F u n c i o n a r i o . Essa uma prtica comum, pois muitos casos o mtodo reescrito geralmente faz "algo a mais" que o mtodo da classe me. Chamar ou no o mtodo de cima uma deciso sua e depende do seu problema. Algumas vezes no faz sentido invocar o mtodo que reescrevemos.

7.4 - POLIMORFISMO
O que guarda uma varivel do tipo F u n c i o n a r i o ? Uma referncia para um F u n c i o n a r i o , nunca o objeto em si. Na herana, vimos que todo G e r e n t e um F u n c i o n a r i o , pois uma extenso deste. Podemos nos referir a um G e r e n t ecomo sendo um F u n c i o n a r i o . Se algum precisa falar com um F u n c i o n a r i odo banco, pode falar com um G e r e n t e ! Porque? Pois G e r e n t e um F u n c i o n a r i o . Essa a semntica da herana.
G e r e n t eg e r e n t e=n e wG e r e n t e ( ) ; F u n c i o n a r i of u n c i o n a r i o=g e r e n t e ; f u n c i o n a r i o . s e t S a l a r i o ( 5 0 0 0 . 0 ) ;

www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais

7/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

Polimorfismo a capacidade de um objeto poder ser referenciado de vrias formas. (cuidado, polimorfismo no quer dizer que o objeto fica se transformando, muito pelo contrrio, um objeto nasce de um tipo e morre daquele tipo, o que pode mudar a maneira como nos referimos a ele). At aqui tudo bem, mas e se eu tentar:
f u n c i o n a r i o . g e t B o n i f i c a c a o ( ) ;

Qual o retorno desse mtodo? 500 ou 750? No Java, a invocao de mtodo sempre vai ser decidida em tempo de execuo. O Java vai procurar o objeto na memria e, a sim, decidir qual mtodo deve ser chamado, sempre relacionando com sua classe de verdade, e no com a que estamos usando para referenci-lo. Apesar de estarmos nos referenciando a esse G e r e n t ecomo sendo um F u n c i o n a r i o , o mtodo executado o do G e r e n t e . O retorno 750. Parece estranho criar um gerente e referenci-lo como apenas um funcionrio. Por que faramos isso? Na verdade, a situao que costuma aparecer a que temos um mtodo que recebe um argumento do tipo F u n c i o n a r i o :
c l a s sC o n t r o l e D e B o n i f i c a c o e s{ p r i v a t ed o u b l et o t a l D e B o n i f i c a c o e s=0 ; p u b l i cv o i dr e g i s t r a ( F u n c i o n a r i of u n c i o n a r i o ){ t h i s . t o t a l D e B o n i f i c a c o e s+ =f u n c i o n a r i o . g e t B o n i f i c a c a o ( ) ; } p u b l i cd o u b l eg e t T o t a l D e B o n i f i c a c o e s ( ){ r e t u r nt h i s . t o t a l D e B o n i f i c a c o e s ; } }

E, em algum lugar da minha aplicao (ou no m a i n , se for apenas para testes):


C o n t r o l e D e B o n i f i c a c o e sc o n t r o l e=n e wC o n t r o l e D e B o n i f i c a c o e s ( ) ; G e r e n t ef u n c i o n a r i o 1=n e wG e r e n t e ( ) ; f u n c i o n a r i o 1 . s e t S a l a r i o ( 5 0 0 0 . 0 ) ; c o n t r o l e . r e g i s t r a ( f u n c i o n a r i o 1 ) ;
www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 8/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

F u n c i o n a r i of u n c i o n a r i o 2=n e wF u n c i o n a r i o ( ) ; f u n c i o n a r i o 2 . s e t S a l a r i o ( 1 0 0 0 . 0 ) ; c o n t r o l e . r e g i s t r a ( f u n c i o n a r i o 2 ) ; S y s t e m . o u t . p r i n t l n ( c o n t r o l e . g e t T o t a l D e B o n i f i c a c o e s ( ) ) ;

Repare que conseguimos passar um G e r e n t epara um mtodo que recebe um F u n c i o n a r i ocomo argumento. Pense como numa porta na agncia bancria com o seguinte aviso: "Permitida a entrada apenas de Funcionrios". Um gerente pode passar nessa porta? Sim, pois G e r e n t e um F u n c i o n a r i o . Qual ser o valor resultante? No importa que dentro do mtodo registra do C o n t r o l e D e B o n i f i c a c o e sreceba F u n c i o n a r i o . Quando ele receber um objeto que realmente um G e r e n t e , o seu mtodo reescrito ser invocado. Reafirmando: no importa como nos referenciamos a um objeto, o mtodo que ser invocado sempre o que dele. No dia em que criarmos uma classe S e c r e t a r i a , por exemplo, que filha de F u n c i o n a r i o , precisaremos mudar a classe de C o n t r o l e D e B o n i f i c a c o e s ? No. Basta a classe S e c r e t a r i areescrever os mtodos que lhe parecerem necessrios. exatamente esse o poder do polimorfismo, juntamente com a reescrita de mtodo: diminuir o acoplamento entre as classes, para evitar que novos cdigos resultem em modificaes em inmeros lugares. Repare que quem criou C o n t r o l e D e B o n i f i c a c o e spode nunca ter imaginado a criao da classe S e c r e t a r i aou E n g e n h e i r o . Contudo, no ser necessrio reimplementar esse controle em cada nova classe: reaproveitamos aquele cdigo.

Herana versus acoplamento Note que o uso de herana aumenta o acoplamento entre as classes, isto , o quanto uma classe depende de outra. A relao entre classe me e filha muito forte e isso acaba fazendo com que o programador das classes filhas tenha que conhecer a implementao da classe pai e vice-versa - fica difcil fazer uma mudana pontual no sistema. Por exemplo, imagine se tivermos que mudar algo na nossa classe F u n c i o n a r i o , mas no quisssemos que todos os funcionrios sofressem a mesma mudana. Precisaramos passar por cada uma das filhas de F u n c i o n a r i overificando se ela se comporta como deveria ou se devemos sobrescrever o tal mtodo modificado.
www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 9/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

Esse um problema da herana, e no do polimorfismo, que resolveremos mais tarde com a ajuda de Interfaces.

7.5 - UM OUTRO EXEMPLO


Imagine que vamos modelar um sistema para a faculdade que controle as despesas com funcionrios e professores. Nosso funcionrio fica assim:
c l a s sE m p r e g a d o D a F a c u l d a d e{ p r i v a t eS t r i n gn o m e ; p r i v a t ed o u b l es a l a r i o ; d o u b l eg e t G a s t o s ( ){ r e t u r nt h i s . s a l a r i o ; } S t r i n gg e t I n f o ( ){ r e t u r n" n o m e :"+t h i s . n o m e+"c o ms a l r i o"+t h i s . s a l a r i o ; } / /m t o d o sd eg e t ,s e teo u t r o s }

O gasto que temos com o professor no apenas seu salrio. Temos de somar um bnus de 10 reais por hora/aula. O que fazemos ento? Reescrevemos o mtodo. Assim como o g e t G a s t o s diferente, o g e t I n f otambm ser, pois temos de mostrar as horas/aula tambm.
c l a s sP r o f e s s o r D a F a c u l d a d ee x t e n d sE m p r e g a d o D a F a c u l d a d e{ p r i v a t ei n th o r a s D e A u l a ; d o u b l eg e t G a s t o s ( ){ r e t u r nt h i s . g e t S a l a r i o ( )+t h i s . h o r a s D e A u l a*1 0 ; } S t r i n gg e t I n f o ( ){ S t r i n gi n f o r m a c a o B a s i c a=s u p e r . g e t I n f o ( ) ; S t r i n gi n f o r m a c a o=i n f o r m a c a o B a s i c a+"h o r a sd ea u l a :" +t h i s . h o r a s D e A u l a ; r e t u r ni n f o r m a c a o ; } / /m t o d o sd eg e t ,s e teo u t r o sq u ef o r e mn e c e s s r i o s }

A novidade, aqui, a palavra chave s u p e r . Apesar do mtodo ter sido reescrito, gostaramos de acessar o mtodo da classe me, para no ter de copiar e colocar o contedo desse mtodo e depois concatenar com a informao das horas de aula. Como tiramos proveito do polimorfismo? Imagine que temos uma classe de relatrio:

www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais

10/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

c l a s sG e r a d o r D e R e l a t o r i o{ p u b l i cv o i da d i c i o n a ( E m p r e g a d o D a F a c u l d a d ef ){ S y s t e m . o u t . p r i n t l n ( f . g e t I n f o ( ) ) ; S y s t e m . o u t . p r i n t l n ( f . g e t G a s t o s ( ) ) ; } }

Podemos passar para nossa classe qualquer E m p r e g a d o D a F a c u l d a d e ! Vai funcionar tanto para professor, quanto para funcionrio comum. Um certo dia, muito depois de terminar essa classe de relatrio, resolvemos aumentar nosso sistema, e colocar uma classe nova, que representa o R e i t o r . Como ele tambm um E m p r e g a d o D a F a c u l d a d e , ser que vamos precisar alterar algo na nossa classe de R e l a t o r i o ? No. Essa a ideia! Quem programou a classe G e r a d o r D e R e l a t o r i onunca imaginou que existiria uma classe Reitor e, mesmo assim, o sistema funciona.
c l a s sR e i t o re x t e n d sE m p r e g a d o D a F a c u l d a d e{ / /i n f o r m a e se x t r a s S t r i n gg e t I n f o ( ){ r e t u r ns u p e r . g e t I n f o ( )+"ee l eu mr e i t o r " ; } / /n os o b r e s c r e v e m o sog e t G a s t o s ! ! ! }

Nova editora Casa do Cdigo com livros de uma forma diferente Editoras tradicionais pouco ligam para ebooks e novas tecnologias. No conhecem programao para revisar os livros tecnicamente a fundo. No tm anos de experincia em didticas com cursos. Conhea a Casa do Cdigo, uma editora diferente, com curadoria da Caelum e obsesso por livros de qualidade a preos justos. Casa do Cdigo, ebook com preo de ebook.

7.6 - UM POUCO MAIS...


1. Se no houvesse herana em Java, como voc poderia reaproveitar o cdigo de outra classe? 2. Uma discusso muito atual sobre o abuso no uso da herana. Algumas pessoas usam herana apenas para reaproveitar o cdigo, quando poderiam ter feito uma
www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 11/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

composio. Procure sobre herana versus composio. 3. Mesmo depois de reescrever um mtodo da classe me, a classe filha ainda pode acessar o mtodo antigo. Isto feito atravs da palavra chave s u p e r . m t o d o ( ) . Algo parecido ocorre entre os construtores das classes, o que?

Mais sobre o mau uso da herana No blog da Caelum existe um artigo interessante abordando esse tpico: http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-aobjetos-heranca/ James Gosling, um dos criadores do Java, um crtico do mau uso da herana. Nesta entrevista ele discute a possibilidade de se utilizar apenas interfaces e composio, eliminando a necessidade da herana: http://www.artima.com/intv/gosling3P.html

7.7 - EXERCCIOS: HERANA E POLIMORFISMO


1. Vamos criar uma classe C o n t a , que possua um s a l d oos mtodos para pegar saldo, depositar e sacar. a. Crie a classe C o n t a :
p u b l i cc l a s sC o n t a{ }

b. Adicione o atributo s a l d o
p u b l i cc l a s sC o n t a{ p r i v a t ed o u b l es a l d o ; }

c. Crie os mtodos g e t S a l d o ( ) ,d e p o s i t a ( d o u b l e )e s a c a ( d o u b l e )
p u b l i cc l a s sC o n t a{ p r i v a t ed o u b l es a l d o ; p u b l i cv o i dd e p o s i t a ( d o u b l ev a l o r ){ t h i s . s a l d o+ =v a l o r ; }
www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 12/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

p u b l i cv o i ds a c a ( d o u b l ev a l o r ){ t h i s . s a l d o=v a l o r ; } p u b l i cd o u b l eg e t S a l d o ( ){ r e t u r nt h i s . s a l d o ; } }

2. Adicione um mtodo na classe C o n t a , que atualiza essa conta de acordo com uma taxa percentual fornecida.
c l a s sC o n t a{ p r i v a t ed o u b l es a l d o ; / /o u t r o sm t o d o sa q u it a m b m. . . v o i da t u a l i z a ( d o u b l et a x a ){ t h i s . s a l d o+ =t h i s . s a l d o*t a x a ; } }

3. Crie duas subclasses da classe C o n t a :C o n t a C o r r e n t ee C o n t a P o u p a n c a . Ambas tero o mtodo atualiza reescrito: A C o n t a C o r r e n t edeve atualizar-se com o dobro da taxa e a C o n t a P o u p a n c adeve atualizar-se com o triplo da taxa. Alm disso, a C o n t a C o r r e n t edeve reescrever o mtodo d e p o s i t a , a fim de retirar uma taxa bancria de dez centavos de cada depsito. Crie as classes C o n t a C o r r e n t ee C o n t a P o u p a n c a . Ambas so filhas da classe C o n t a :
p u b l i cc l a s sC o n t a C o r r e n t ee x t e n d sC o n t a{ } p u b l i cc l a s sC o n t a P o u p a n c ae x t e n d sC o n t a{ }

Reescreva o mtodo a t u a l i z ana classe C o n t a C o r r e n t e , seguindo o enunciado:


p u b l i cc l a s sC o n t a C o r r e n t ee x t e n d sC o n t a{ p u b l i cv o i da t u a l i z a ( d o u b l et a x a ){ t h i s . s a l d o+ =t h i s . s a l d o*t a x a*2 ; } }

Repare que, para acessar o atributo saldo herdado da classe C o n t a , voc vai precisar trocar o modificador de visibilidade de saldo para p r o t e c t e d . Reescreva o mtodo a t u a l i z ana classe C o n t a P o u p a n c a , seguindo o enunciado:
p u b l i cc l a s sC o n t a P o u p a n c ae x t e n d sC o n t a{ p u b l i cv o i da t u a l i z a ( d o u b l et a x a ){
www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 13/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

t h i s . s a l d o+ =t h i s . s a l d o*t a x a*3 ; } }

Na classe C o n t a C o r r e n t e , reescreva o mtodo d e p o s i t apara descontar a taxa bancria de dez centavos:


p u b l i cc l a s sC o n t a C o r r e n t ee x t e n d sC o n t a{ p u b l i cv o i da t u a l i z a ( d o u b l et a x a ){ t h i s . s a l d o+ =t h i s . s a l d o*t a x a*2 ; } p u b l i cv o i dd e p o s i t a ( d o u b l ev a l o r ){ t h i s . s a l d o+ =v a l o r-0 . 1 0 ; } }

4. Crie uma classe com mtodo m a i ne instancie essas classes, atualize-as e veja o resultado. Algo como:
p u b l i cc l a s sT e s t a C o n t a s{ p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s ){ C o n t ac=n e wC o n t a ( ) ; C o n t a C o r r e n t ec c=n e wC o n t a C o r r e n t e ( ) ; C o n t a P o u p a n c ac p=n e wC o n t a P o u p a n c a ( ) ; c . d e p o s i t a ( 1 0 0 0 ) ; c c . d e p o s i t a ( 1 0 0 0 ) ; c p . d e p o s i t a ( 1 0 0 0 ) ; c . a t u a l i z a ( 0 . 0 1 ) ; c c . a t u a l i z a ( 0 . 0 1 ) ; c p . a t u a l i z a ( 0 . 0 1 ) ; S y s t e m . o u t . p r i n t l n ( c . g e t S a l d o ( ) ) ; S y s t e m . o u t . p r i n t l n ( c c . g e t S a l d o ( ) ) ; S y s t e m . o u t . p r i n t l n ( c p . g e t S a l d o ( ) ) ; } }

Aps imprimir o saldo (g e t S a l d o ( ) ) de cada uma das contas, o que acontece?

www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais

14/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

5. O que voc acha de rodar o cdigo anterior da seguinte maneira:


C o n t ac=n e wC o n t a ( ) ; C o n t ac c=n e wC o n t a C o r r e n t e ( ) ; C o n t ac p=n e wC o n t a P o u p a n c a ( ) ;

Compila? Roda? O que muda? Qual a utilidade disso? Realmente, essa no a maneira mais til do polimorfismo - veremos o seu real poder no prximo exerccio. Porm existe uma utilidade de declararmos uma varivel de um tipo menos especfico do que o objeto realmente . extremamente importante perceber que no importa como nos referimos a um objeto, o mtodo que ser invocado sempre o mesmo! A JVM vai descobrir em tempo de execuo qual deve ser invocado, dependendo de que tipo aquele objeto, no importando como nos referimos a ele. 6. (opcional) Vamos criar uma classe que seja responsvel por fazer a atualizao de todas as contas bancrias e gerar um relatrio com o saldo anterior e saldo novo de cada uma das contas. Alm disso, conforme atualiza as contas, o banco quer saber quanto do dinheiro do banco foi atualizado at o momento. Por isso, precisamos ir guardando o s a l d o T o t a le adicionar um getter classe.
p u b l i cc l a s sA t u a l i z a d o r D e C o n t a s{ p r i v a t ed o u b l es a l d o T o t a l=0 ; p r i v a t ed o u b l es e l i c ; p u b l i cA t u a l i z a d o r D e C o n t a s ( d o u b l es e l i c ){ t h i s . s e l i c=s e l i c ; } p u b l i cv o i dr o d a ( C o n t ac ){ / /a q u iv o c i m p r i m eos a l d oa n t e r i o r ,a t u a l i z aac o n t a , / /ed e p o i si m p r i m eos a l d of i n a l / /l e m b r a n d od es o m a ros a l d of i n a la oa t r i b u t os a l d o T o t a l } / /o u t r o sm t o d o s ,c o l o c a rog e t t e rp a r as a l d o T o t a l ! }

7. (opcional) No mtodo m a i n , vamos criar algumas contas e rod-las:


p u b l i cc l a s sT e s t a A t u a l i z a d o r D e C o n t a s{ p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s ){ C o n t ac=n e wC o n t a ( ) ; C o n t ac c=n e wC o n t a C o r r e n t e ( ) ; C o n t ac p=n e wC o n t a P o u p a n c a ( ) ; c . d e p o s i t a ( 1 0 0 0 ) ;
www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 15/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

c c . d e p o s i t a ( 1 0 0 0 ) ; c p . d e p o s i t a ( 1 0 0 0 ) ; A t u a l i z a d o r D e C o n t a sa d c=n e wA t u a l i z a d o r D e C o n t a s ( 0 . 0 1 ) ; a d c . r o d a ( c ) ; a d c . r o d a ( c c ) ; a d c . r o d a ( c p ) ; S y s t e m . o u t . p r i n t l n ( " S a l d oT o t a l :"+a d c . g e t S a l d o T o t a l ( ) ) ; } }

8. (Opcional) Use a palavra chave s u p e rnos mtodos a t u a l i z areescritos, para no ter de refazer o trabalho. 9. (Opcional) Se voc precisasse criar uma classe C o n t a I n v e s t i m e n t o , e seu mtodo a t u a l i z afosse complicadssimo, voc precisaria alterar a classe A t u a l i z a d o r D e C o n t a s ? 10. (Opcional, Trabalhoso) Crie uma classe B a n c oque possui um array de C o n t a . Repare que num array de C o n t avoc pode colocar tanto C o n t a C o r r e n t equanto C o n t a P o u p a n c a . Crie um mtodo p u b l i cv o i da d i c i o n a ( C o n t ac ) , um mtodo p u b l i cC o n t ap e g a C o n t a ( i n tx )e outro p u b l i ci n tp e g a T o t a l D e C o n t a s ( ) , muito similar a relao anterior de Empresa-Funcionario. Faa com que seu mtodo m a i ncrie diversas contas, insira-as no B a n c oe depois, com um f o r , percorra todas as contas do B a n c opara pass-las como argumento para o A t u a l i z a d o r D e C o n t a s .

7.8 - DISCUSSES EM AULA : ALTERNATIVAS AO ATRIBUTO PROTECTED


Discuta com o instrutor e seus colegas alternativas ao uso do atributo p r o t e c t e dna herana. Preciso realmente afrouxar o encapsulamento do atributo por causa da herana? Como fazer para o atributo continuar p r i v a t ena me e as filhas conseguirem de alguma formar trabalhar com ele?

J conhece os cursos online Alura? A Alura oferece dezenas de cursos online em sua plataforma exclusiva de ensino que favorece o aprendizado com a qualidade reconhecida da Caelum. Voc pode escolher um curso nas reas de Java, Ruby, Web, Mobile, .NET e outros, ou fazer a assinatura semestral que d acesso a todos os cursos.
www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais 16/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

Conhea os cursos online da Caelum.

CAPTULO ANTERIOR:

Modificadores de acesso e atributos de classe


PRXIMO CAPTULO:

Eclipse IDE

Voc encontra a Caelum tambm em:

Blog Caelum

Cursos Online

Facebook

Newsletter

www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais

17/18

06/08/13

Herana, reescrita e polimorfismo - Java e Orientao a Objetos

Casa do Cdigo

Twitter

www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescrita-e-polimorfismo/#7-6-um-pouco-mais

18/18

Você também pode gostar