Você está na página 1de 20

Curso Java Starter

www.t2ti.com
1

Curso Java Starter


Apresentao
O Curso Java Starter foi projetado com o objetivo de ajudar quelas pessoas
que tm uma base de lgica de programao e desejam entrar no mercado de
trabalho sabendo Java,
A estrutura do curso formada por mdulos em PDF e por mini-cursos em
vdeo. O aluno deve baixar esse material e estud-lo. Deve realizar os exerccios
propostos. Todas as dvidas devem ser enviadas para a lista de discusso que est
disponvel para inscrio na pgina do Curso Java Starter no site www.t2ti.com. As
dvidas sero respondidas pelos instrutores Albert Eije, Cludio de Barros e Miguel
Kojiio, alm dos demais participantes da lista.
Nosso objetivo que aps o estudo do Curso Java Starter o aluno no tenha
dificuldades

para

acompanhar

um

curso

avanado

onde

poder

aprender

desenvolver aplicativos para Web, utilizando tecnologias como Servlets e JSP e


frameworks como Struts e JSF, alm do desenvolvimento para dispositivos mveis.
Albert Eije trabalha com informtica desde 1993. Durante esse perodo j
trabalhou com vrias linguagens de programao: Clipper, PHP, Delphi, C, Java, etc.
Atualmente mantm o site www.alberteije.com.
Cludio de Barros Tecnlogo em Processamento de Dados.
Miguel Kojiio bacharel em Sistemas de Informao, profissional certificado
Java (SCJP 1.5).
O curso Java Starter surgiu da idia dos trs amigos que trabalham juntos em
uma instituio financeira de grande porte.

www.t2ti.com
2

Curso Java Starter

Mdulo

07

Orientao a Objetos
Herana, Sobreescrita e
Polimorfismo

Introduo
Em relao ao paradigma Orientado a Objetos ns j vimos o que uma
Classe, aprendemos tambm que um objeto nada mais do que a instanciao de
uma classe e que um dos pilares da Orientao a Objetos o encapsulamento.
Neste mdulo e no prximo ns iremos continuar nossos estudos
relacionados aos conceitos fundamentais da programao Orientada a Objetos. A
seguir estudaremos Herana, Sobreescrita e Polimorfismo.

Herana
No paradigma orientado a objetos podemos definir um conjunto de classes
em uma estrutura hierrquica onde cada uma das classes herda caractersticas da
suas superiores nesta estrutura.
No mundo real temos que uma pessoa herda caractersticas de seus pais
que herdaram de seus avs e assim por diante. Respeitando as limitaes das
linguagens de programao, o que acontece quando utilizamos herana no nosso
cdigo uma tentativa de implementar esta propriedade da natureza.
Para ficar mais claros vamos partir para um exemplo. Imagine que
estivssemos implementando um programa que fosse utilizado em um concessionria
de veculos. Esta concessionria vende carros de passeio, jipes e veculos utilitrios.
Para implementar as classes destes veculos poderamos criar trs classes distintas,
A seguir a classe Jipe:
public class Jipe {
private String marca;
private Double capacidadeTanqueCombustivel;
public Double getTanqueCombustivel()
{
return capacidadeTanqueCombustivel;

www.t2ti.com
3

Curso Java Starter


}
public void setTanqueCombustivel(Double capacidadeTanqueCombustivel)
{
this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
public void acelerar()
{
//Cdigo aqui
}
public void frear()
{
//Cdigo aqui
}

public void ligarTracao4x4()


{
//Cdigo aqui
}

A classe que representa o nosso carro de passeio:


public class CarroPasseio {
private String marca;
private Double capacidadeTanqueCombustivel;
public Double getTanqueCombustivel()
{
return capacidadeTanqueCombustivel;
}
public void setTanqueCombustivel(Double capacidadeTanqueCombustivel)
{
this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}
public String getMarca()
{
return marca;
}
public void setMarca(String marca)
{
this.marca = marca;
}
public void acelerar()
{
//Cdigo aqui
}
public void frear()
{
//Cdigo aqui
}
public void ligarArCondicionado()
{
//Cdigo aqui
}
}

E, finalmente, a classe que representa o nosso veculo utilitrio:


public class Utilitario {
private String marca;
private Double capacidadeTanqueCombustivel;

www.t2ti.com
4

Curso Java Starter


public Double getTanqueCombustivel()
{
return capacidadeTanqueCombustivel;
}
public void setTanqueCombustivel(Double capacidadeTanqueCombustivel)
{
this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}
public String getMarca()
{
return marca;
}
public void setMarca(String marca)
{
this.marca = marca;
}
public void acelerar()
{
//Cdigo aqui
}
public void frear()
{
//Cdigo aqui
}
public void ligarFarolMilha()
{
//Cdigo aqui
}
}

Perceba que, nas linhas destacadas em amarelo, temos as caractersticas


que dizem respeito a apenas um dos tipos de veculos, isto , no nosso modelo,
apenas jipes tm trao 4x4, somente os carros de passeio tm opo de ligar o ar
condicionado e farol de milha uma caracterstica existente apenas nos veculos
utilitrios
Todas os demais estados e comportamentos voc ainda lembra o que so
estado e comportamento de um objeto? so idnticos, na verdade para criar estas
trs classes foi realizado uma simples cpia e cola dos membros que so iguais. Isto
vlido, por enqanto, afinal de contas estas caractersticas permanecero idnticas
para os trs tipos (Jipe, Carro de Passeio e Utilitrio).
Agora

vamos

explorar

um

pouco

mais

nosso

modelo,

nossa

concessionria vai comear a vender outros 5 tipos de veculos diferentes, cada um


com suas peculiaridades, l vamos ns criar mais 5 classes e copiar e colar mais 5
vezes! E mais, o cliente do software identificou uma caracterstica importante dos
veculos que deve ser adicionada ao modelo, o cdigo do chassi. L vamos ns de
novo implementar mais 8 afinal so 5 novos veculos mais os 3 anteriores
atributos com getter e setter para contemplar esta caracterstica.
Na verdade nada disto seria necessrio se ns tivssemos utilizado
corretamente o conceito de herana da programao Orientada a Objetos. Perceba
que com exceo das caractersticas que esto grifadas em amarelo todas as demais

www.t2ti.com
5

Curso Java Starter


so comuns a todos os veculos, ou seja, possvel que tenhamos uma superclasse
(classe Pai) Veiculo e que todas as demais herdem estas caractersticas comuns dela.
A nossa classe Veiculo ficaria da seguinte forma:
public class Veiculo {
private String marca;
private Double capacidadeTanqueCombustivel;
public Double getTanqueCombustivel() {
return capacidadeTanqueCombustivel;
}
public void setTanqueCombustivel(Double capacidadeTanqueCombustivel) {
this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
public void acelerar() {
//Cdigo aqui
}
public void frear() {
//Cdigo aqui
}
}

Tudo o que era comum a todos os veculos foi concentrado na classe


Veiculo. Para que as demais classes herdem estas caractersticas ns devemos
utilizar a palavra reservada extends.
As novas classes tm como superclasse a classe Veiculo:
public class Jipe extends Veiculo{

public void ligarTracao4x4()


{
//Cdigo aqui
}

public class CarroPasseio extends Veiculo{


public void ligarArCondicionado()
{
//Cdigo aqui
}
}
public class Utilitario extends Veiculo {

public void ligarFarolMilha()


{
//Cdigo aqui
}

www.t2ti.com
6

Curso Java Starter


Graficamente podemos representar esta hierarquia de classes da seguinte
forma:

Nesta nova hierarquia de classes toda a subclasse de Veiculo ir


compartilhar as suas caractersticas, dizemos que um jipe, carro de passeio ou
utilitrio so todos do tipo Veiculo. E da mesma forma toda a subclasse de Jipe ir
herdar as caractersticas tanto de Veiculo quanto de Jipe.
O

exemplo

especificamente na

abaixo

mostra

classe Jipe,

como,

apesar

posso acessar

de

no

atravs do

ser

getter

declarado
o atributo

capacidadeTanqueCombustivel:
Jipe jipe = new Jipe();
Double capacidadeTanqueJipe = jipe.getCapacidadeTanqueCombustivel();
jipe.setCapacidadeTanqueCombustivel(48.0);

Percebeu!? No exemplo acima estou manipulando o atributo atravs dos


mtodos (getter e setter) sem t-los declarados explicitamente na classe Jipe pois, o
compilador sabe que na verdade estou herdando estas caractersticas da classe
Veiculo.
Esta hierarquia de classes garante que todas as mudanas efetuadas na
classe Veiculo se propagam para as suas subclasses. Por exemplo, se for solicitado
adicionar o comportamento buzinar, e este comportamento for uma caractersticas
que todos os veculos devem ter, ento basta adicion-lo a classe Veiculo que
automaticamente todas as subclasses compartilharo a mesma funcionalidade.
Abaixo temos o exemplo desta modificao na classe Veiculo:

public class Veiculo {


private String marca;
private Double capacidadeTanqueCombustivel;

www.t2ti.com
7

Curso Java Starter


//Getters, setters e demais mtodos aqui...
public void buzinar()
{
System.out.println("Bmmmm");
}
}

E agora o meu Jipe tambm buzina:


Jipe jipe = new Jipe();
Double capacidadeTanqueJipe = jipe.getCapacidadeTanqueCombustivel();
jipe.setCapacidadeTanqueCombustivel(48.0);
jipe.buzinar();

Desta forma ns evitamos aquele super-trabalho de copiar, colar e manter


vrias classes cada vez que uma alterao solicitada, concentramos tudo o que
possvel e pertinente na nossa classe Veiculo e realizamos a manuteno do cdigo
em apenas um ponto da aplicao.
Assim, a herana viabiliza o reuso do cdigo existente pois, como podemos
perceber o cdigo da classe Veiculo reutilizado por todas as suas subclasses e, ainda
mais, podemos ter uma hierarquia de herana de tamanho indefinido onde todas as
subclasses iro sempre herdar caractersticas das superclasses at a raiz da estrutura
hierrquica (classe do topo da hierarquia).
Vamos brincar um pouco com o nosso modelo, imagine que fossmos
vender o nosso software de gerncia de concessionrias para uma concessionria
localizada em um pas que esteja em uma zona conflituosa e, alm destes veculos a
concessionria vende tambm tanques de guerra - agora eu apelei! :) - portanto
devemos adicionar a nossa hierarquia mais uma classe.
A classe que representa um tanque de guerra fica da seguinte forma:

public class TanqueGuerra extends Veiculo {


public void atirarMetralhadora()
{
//Cdigo aqui
}
public void atirarCanhao()
{
//Cdigo aqui
}
}

www.t2ti.com
8

Curso Java Starter


Graficamente a nova hierarquia de classes a seguinte:

E novamente eu sei que a minha classe TanqueGuerra tambm possui as


caractersticas herdadas da classe Veiculo, ou seja, alm de atirar com a metralhadora
e o canho caractersticas prprias deste tipo de veculo o nosso tanque de
guerra poder buzinar, acelerar, frear e etc.
Abaixo temos um exemplo do uso da classe TanqueGuerra:
TanqueGuerra osorio = new TanqueGuerra();
osorio.atirarCanhao();//derivado da classe TanqueGuerra
osorio.buzinar();//derivado da classe Veiculo

Agora ns podemos pensar o seguinte, o som emitido pela buzina


(Bmmmm) fica bem para um Jipe, Utilitrio e at quem sabe um Tanque de
Guerra, mas nunca uma senhora de idade iria adquirir um carro de passeio com uma
buzina deste tipo.
Sendo assim ns precisamos modificar o som da buzina apenas para os
carros de passeio de forma a deix-la mais condizente com a realidade do uso deste
veculo.
Para isto devemos conhecer mais um dos fundamentos da Orientao a
Objetos a sobreescrita de mtodos.

Sobreescrita (override)
A sobreescrita de mtodos uma caracterstica que permite alterao do
comportamento de uma superclasse pelas suas subclasses. Ao sobreescrevermos
um mtodo ns estamos fornecendo uma nova implementao para o mesmo
comportamento.
Para exemplificar vamos alterar o comportamento da nossa buzina para que
seja mais adeqada ao um carro de passeio. A classe Veiculo permanece do mesmo
jeito, modificamos apenas a classe CarroPasseio conforme abaixo:

www.t2ti.com
9

Curso Java Starter

public class CarroPasseio extends Veiculo{


public void ligarArCondicionado()
{
//Cdigo aqui
}
public void buzinar()//Estamos sobreescrevendo o mtodo buzinar() da superclasse Veiculo
{
System.out.println("Fon fon");
}
}

E ao executarmos o main abaixo:


public static void main(String[] args) {
TanqueGuerra osorio = new TanqueGuerra();
osorio.buzinar();
CarroPasseio carroMadame = new CarroPasseio();
carroMadame.buzinar();
}

Obtemos a seguinte sada no console:


TanqueGuerra

CarroPasseio

Bmmmm
Fon fon

Perceba que o som emitido pelo tanque de guerra continuou o mesmo,


derivado da classe Veiculo, porm o som emitido pelo carro de passeio mudou, ou
seja, alteramos o comportamento pr-definido para o mtodo buzinar().
Nesta situao o mtodo buzinar da classe Veiculo completamente
ignorado e substitudo pelo da classe CarroPasseio, porm pode haver situao que
seja interessante a manuteno da implementao existente com adio de
implementao prpria.
Para que isto seja possvel ns devemos, ao sobreescrever o mtodo,
adicionar a palavra reservada super ao corpo do mtodo que estamos fornecendo
nova implementao e invocar o mesmo mtodo da superclasse.
No exemplo abaixo utilizamos a implementao do mtodo buzinar da
superclasse e ao mesmo tempo adicionamos nova implementao:
public class TanqueGuerra extends Veiculo {
public void atirarMetralhadora()
{
//Cdigo aqui
}
public void atirarCanhao()
{
//Cdigo aqui

www.t2ti.com
10

Curso Java Starter


}

public void buzinar()


{
super.buzinar();
System.out.println("BMMMMMMM");
}

A palavra reservada super uma referncia a superclasse. Ao executarmos


este mtodo a JVM ir primeiro invocar e executar o mtodo da superclasse para
depois continuar a execuo local.
Ao sobreescrevermos um mtodo o modificador de acesso neste caso
public

nunca pode ser mais restritivo do que o do mtodo que est sendo

sobreescrito, ou seja, no podemos alterar o modificador de acesso de forma que o


mtodo tenha sua visibilidade reduzida, por exemplo, se tentarmos mudar a
assinatura do mtodo buzinar, conforme abaixo, o compilador no ir permitir:

protected void buzinar()

No entanto o inverso vlido, podemos aumentar a visibilidade de um


mtodo, ou seja, se um mtodo for declarado

protected

e aumentarmos a

visibilidade (public) dele ao sobreescrevermos no teremos problemas com o


compilador.

Sobreescrever diferente de sobrecarregar (overload)


Sobreescrever diferente de sobrecarregar um mtodo. Um mtodo s
sobreescrito se a assinatura do mesmo mantida intacta, isto , o tipo de retorno e
os parmetros (inclusive a seqncia) no so alterados.
Observe a classe CarroPasseio:
public class CarroPasseio extends Veiculo{
public void ligarArCondicionado()
{
//Cdigo aqui
}
public void buzinar(String som)
{
System.out.println(som);
}
}

Observe o que acontecer ao executarmos o cdigo abaixo:

www.t2ti.com
11

Curso Java Starter

public static void main(String[] args) {


CarroPasseio carroMadame = new CarroPasseio();
carroMadame.buzinar();
carroMadame.buzinar("Fon! Fon!");
}

O resultado desta execuo o seguinte:


Bmmmm
Fon! Fon!

Observe

que

nosso

novo

mtodo

(grifado

em

amarelo)

est

sobrecarregando o mtodo j existente, na verdade temos dois mtodos buzinar, com


e sem parmetros, respectivamente, o mtodo da classe CarroPasseio e o mtodo
derivado (herdado) da classe Veiculo.
A sobrecarga de mtodo cria um mtodo novo na classe mantendo o
mtodo existente.

Polimorfismo
O polimorfismo, que significa muitas formas, permite que uma mesma
referncia se comporte de formas diferentes. Utilizando corretamente o polimorfismo
ns podemos fazer o cdigo ficar mais claro, genrico e, portanto, reutilizvel.
Segue abaixo um exemplo:
public class MainModulo09 {
/**
* @param args
*/
public static void main(String[] args) {
Veiculo veiculo = criarVeiculo(args[0]);
veiculo.buzinar();
}
public static Veiculo criarVeiculo(String tipo)
{
if(tipo == null)
{
return new CarroPasseio();
}else if(tipo.equals("utilitario"))
{
return new Utilitario();
}else if(tipo.equals("tanque"))
{
return new TanqueGuerra();
}else if(tipo.equals("passeio"))
{
return new CarroPasseio();

www.t2ti.com
12

Curso Java Starter


}
return new Utilitario();
}
}

A invocao do mtodo buzinar() na varivel veiculo feita de forma


polimrfica, isto , pode possuir diversos comportamentos diferentes. O resultado
desta invocao ser apenas conhecido em tempo de execuo pois, dependendo do
parmetro de entrada do mtodo main o objeto retornado pelo mtodo criarVeiculo()
ser de tipos diferentes.
Perceba que a varivel veiculo do tipo Veiculo, ou seja, ela pode
referenciar objetos das classes Jipe, CarroPasseio, TanqueGuerra e Utilitario, afinal,
conforme visto, todas estas classes so tambm do tipo Veiculo (Herana).
A JVM s conhecer a referncia da varivel veiculo em tempo de
execuo, que ser dependente do parmetro de entrada do mtodo main, ou seja, a
JVM at sabe que em tempo de execuo esta varivel ir referenciar um objeto do
tipo Veiculo, ou uma de suas subclasses, porm ela no sabe qual dos tipos de Veiculo
ser (Jipe, TanqueGuerra, Utilitario ou CarroPasseio).
Durante a execuo da aplicao a JVM ir identificar qual tipo a varivel
est referenciando e assim ir invocar a implementao do mtodo buzinar()
adequada.
Observe abaixo a execuo do cdigo:

Veja que, conforme explicado, durante cada execuo do programa a JVM

www.t2ti.com
13

Curso Java Starter


identificou a correta implementao do mtodo buzinar() neste caso respectivamente
as implementaes da classe TanqueGuerra e CarroPasseio.
Se, por acaso, o mtodo buzinar() no tivesse sido sobreescrito em
nenhuma das subclasses (TanqueGuerra e CarroPasseio) a JVM ento iria invocar a
implementao existente na classe Veiculo.
Ao declararmos a varivel veiculo utilizamos o tipo Veiculo, superclasse
das demais classes, observe o trecho de cdigo abaixo:
Veiculo veiculo = criarVeiculo(args[0]);
veiculo.buzinar();
veiculo.ligarArCondicionado();

A situao acima identificada resulta em erro de compilao, isto acontece


porque o mtodo ligarArCondicionado() no faz parte da classe Veiculo ou de uma
de suas superclasses, ou seja, o compilador verifica se o mtodo existe em tempo
de compilao.
Desta forma, mesmo que voc tenha certeza que naquele momento a
varivel far referncia um objeto do tipo CarroPasseio, o compilador no ir aceitar
este tipo de construo. No entanto existem solues para isto, a primeira e mais

O
K

simples substituir o tipo da varivel, conforme abaixo:


CarroPasseio veiculo = criarVeiculo(args[0]);
veiculo.buzinar();
veiculo.ligarArCondicionado();

A segunda forma executando um cast, a idia a mesma do cast de tipos


primitivos porm, neste caso, ns avisamos ao compilador que a varivel faz
referncia a uma das subclasses da hierarquia de classes, observe a construo
abaixo:
Veiculo veiculo = criarVeiculo(args[0]);
veiculo.buzinar();
((CarroPasseio)veiculo).ligarArCondicionado();
K
O

Podemos dizer que o compilador entende algo como: Opa?! Beleza! Se


voc est garantindo que eu vou encontrar um CarroPasseio neste endereo ento eu
deixo voc invocar este mtodo porm espero que saiba o que est fazendo pois se,
em tempo de execuo, a referncia for de outro tipo a JVM ir emitir uma exceo
bem espalhafatosa.

www.t2ti.com
14

Curso Java Starter


Modificador final
O modificador final quando utilizado em classes ou mtodos bloqueia,
respectivamente, a extenso e a sobreescrita, isto , utilizamos este modificador
quando no desejamos que nossa classe tenha subclasses ou o mtodo seja
sobreescrito.
Devido s suas caractersticas este modificador deve ser utilizado com
parcimnia e sabedoria pois ele vai contra um dos pilares da orientao a objetos:
Reuso de cdigo atravs da herana e/ou sobreescrita.
Abaixo segue um exemplo do uso:
public final class Jipe extends Veiculo{
public void ligarTracao4x4()
{
//Cdigo aqui
}

public void buzinar()


{
System.out.println("Buzina jipe");
}

Conforme dito anteriormente, ao adicionar o modificador final a declarao


da classe estou inviabilizando qualquer tipo de estenso por outras classes, isto ,
apesar da classe Jipe estender a classe Veiculo, nenhuma outra classe poder
estender, ser subclasse, da classe Jipe.
Em mtodos a aplicao deste modificador feita da seguinte forma:
public

class Jipe extends Veiculo{


public void ligarTracao4x4()
{
//Cdigo aqui
}

public final void buzinar()


{
System.out.println("Buzina jipe");
}

Agora a classe Jipe pode ser estendida porm qualquer uma de suas
subclasses no poder sobreescrever o mtodo buzinar(). Isto interessante quando
desejamos que determinado comportamento no seja alterado em hiptese nenhuma.
Nos pacotes bsicos da linguagem Java existem diversas classes que so
modificadas pelo final, temos como exemplo a classe String e a classe Math.

www.t2ti.com
15

Curso Java Starter


Se foi dito que o modificador final vai contra os pilares da Orientao a
Objetos porque as prprias classes desenvolvidas pelos gurus da SUN utilizam este
modificador?
A resposta a seguinte, quando estamos manipulando uma String ns
devemos ter certeza que o comportamento esperado ser encontrado, isto , ao
contrrio de outras classes para a classe String ns esperamos um comportamento
estvel e consistente ao longo do tempo. Imagine os problemas decorrentes do uso de
uma String que se comporta de maneira diferente da esperada?!
Da mesma forma com a classe Math, imagine os problemas decorrentes da
realizao de uma operao matemtica em que o resultado obtido seja diferente do
esperado pois, um outro programador estendeu a classe e resolveu modificar as
implementaes e por acaso ele no sabia tanto de matemtica quanto achava que
sabia :).
Nestes casos o modificador final utilizado a fim de evitar um mal maior
aos programas em detrimento ao melhor uso do paradigma orientado a objetos.
Quando voc for utilizar, se for utilizar, o modificador final pense sempre
nas implicaes e nos objetivos que espera obter com o seu uso.

Classe Object
Para encerrar este mdulo vejamos a classe Object. Em Java todas as
classes, eu disse todas as classes! String, Math, as minhas classes, as suas classes e
etc. estendem a classe Object e portanto so do tipo Object tambm.
Desta forma mesmo quando declaramos uma classe conforme abaixo:
public class Classe {
}

Implicitamente o compilador interpreta esta classe como:


public class Classe extends Object{
}

Por isso todos os objetos objetos e no tipos primitivos! sempre iro


passar (true) por um teste conforme abaixo:

www.t2ti.com
16

Curso Java Starter


if(qualquerObjeto instanceof Object)
{
//Sempre entrar neste bloco
}

L-se: Todo objeto instncia da classe Object.


A seguir temos os alguns dos principais mtodos da classe Object:

Mtodo

Descrio

equals()

Indica quando um objeto igual a este

toString()

Retorna a representao textual deste objeto

hashCode()

Retorna o cdigo hash para este objeto

Todos estes mtodos podem ser sobreescritos, e muitas vezes o so, os


mtodos equals() e hashCode sero abordados no mdulo de Colees. Abaixo temos
um exemplo da utilizao do mtodo toString():
public class Jipe extends Veiculo{
public void ligarTracao4x4()
{
//Cdigo aqui
}
public final void buzinar()
{
System.out.println("Buzina jipe");
}
public String toString()
{
return "toString do Jipe";
}
}

Observe que o mtodo toString(), da classe Object, est sendo sobreescrito


pela minha classe Jipe, a seguir temos trecho de cdigo que imprime um objeto do
tipo Jipe:
Veiculo veiculo = new Jipe();
System.out.println(veiculo);

O resultado deste cdigo o seguinte:


toString do Jipe

Quando imprimimos um objeto, a JVM invoca o mtodo toString() do


objeto, se este mtodo no foi sobreescrito ento o mtodo toString() invocado o da

www.t2ti.com
17

Curso Java Starter


classe Object.
Se no tivesse sido sobreescrito um dos possveis resultados a ser obtido
seria este:
Jipe@10385c1

O que uma representao textual significativa do objeto para a JVM,


mas no para ns seres humanos :).

EXERCCIOS
Aprenda com quem tambm est aprendendo, veja e compartilhe as suas
respostas no nosso Frum:
Exerccios Mdulo 07 Herana, Sobreescrita e Polimorfismo
1 Crie uma hierarquia de classes conforme abaixo com os seguintes atributos e
comportamentos (observe a tabela), utilize os seus conhecimentos e distribua
as caractersticas de forma que tudo o que for comum a todos os animais fique
na classe Animal:

Cachorro

Cavalo

Preguica

Possui Nome

Possui Nome

Possui Nome

Possui Idade

Possui Idade

Possui Idade

Deve emitir som

Deve emitir som

Deve emitir som

Deve correr

Deve correr

Deve subir em rvores

2 Implemente um programa que crie os 3 tipos de animais definidos no exerccio


anterior e invoque o mtodo que emite o som de cada um de forma polimrfica,
isto , independente do tipo de animal.

www.t2ti.com
18

Curso Java Starter


3 Implemente uma classe Veterinario que contenha um mtodo examinar() cujo
parmetro de entrada um Animal, quando o animal for examinado ele deve
emitir um som, passe os 3 animais com parmetro.
4 Crie uma classe Zoologico, com 10 jaulas (utilize um array) coloque em cada
jaula um animal diferente, percorra cada jaula e emita o som e, se o tipo de
animal possuir o comportamento, faa-o correr.
5 Resolva a seguinte situao utilizando os conceitos aprendidos. Uma empresa
quer manter o registro da vida acadmica de todos os funcionrios, o modelo
deve contemplar o registro das seguintes informaes, de forma incremental:
5.1 Para o funcionrio que no estudou, apenas o nome e o cdigo funcional;
5.2 Para o funcionrio que concluiu o ensino bsico, a escola;
5.3 Para o funcionrio que concluiu o ensino mdio, a escola;
5.4 Para o funcionrio que concluiu a graduao, a Universidade;
6 Estenda o modelo implementado no exerccio anterior de forma que todo
funcionrio possua uma renda bsica de R$ 1000,00 e:
6.1 Com a concluso do ensino bsico a renda total renda bsica
acrescentada em 10%;
6.2 Com a concluso do ensino mdio a renda total a renda do nvel anterior
acrescentada em 50%;
6.3 Com a concluso da graduao a renda total a renda do nvel anterior
acrescentada em 100%;
6.4 Todos os clculos so efetuados sempre sobre a ltima renda obtida.
7 Crie um programa que simule uma empresa com 10 funcionrios, utilize um
array, sendo que a escolaridade dos funcionrios distribuda da seguinte
forma: 40% ensino bsico, 40% ensino mdio e 20% nvel superior. Calcule os
custos da empresa com salrios totais e por nvel de escolaridade, utilize a
classe funcionrio desenvolvida no exerccio anterior.
8 Faa uma hierarquia de Comisses, crie as comisses de Gerente, Vendedor e
Supervisor. Cada uma das comisses fornece um adicional ao salrio conforme
abaixo:
8.1 Gerente: R$1500,00
8.2 Supervisor: R$600,00
8.3 Vendedor: R$250,00
9 Adicione a classe funcionrio um atributo referente as comisses desenvolvidas
no exerccio anterior. Corrija o mtodo renda total de forma que ele some ao

www.t2ti.com
19

Curso Java Starter


valor da renda calculada o adicional da comisso do funcionrio.
10 Refaa o exerccio 7 considerando que 10% dos funcionrios so Gerentes,
20% so supervisores e 70% so vendedores.
11 Sobreescreva o mtodo toString de forma que ele imprima o nome do
funcionrio, a comisso e o salrio total. Imprima todos os funcionrios da
empresa criada no exerccio 7.

www.t2ti.com
20

Você também pode gostar