Você está na página 1de 144

Bacharelado em Sistemas de Informao

UAPI

Mdulo II
Organizao de Sistema Metodolgico
Algoritmos e Programao II
Mdulo II

Algoritmos e Programao II
Magno Santos
PRESIDENTE DA REPBLICA
Luiz Incio Lula da Silva

MINISTRO DA EDUCAO
Fernando Haddad

GOVERNADOR DO ESTADO
Wellington Dias

REITOR DA UNIVERSIDADE FEDERAL DO PIAU


Luiz de Sousa Santos Jnior

SECRETRIO DE EDUCAO A DISTNCIA DO MEC


Carlos Eduardo Bielschowsky

COORDENADORIA GERAL DA UNIVERSIDADE ABERTA DO BRASIL


Celso Costa

SECRETRIO DE EDUCAO DO ESTADO DO PIAU


Antonio Jos Medeiros

COORDENADOR GERAL DO CENTRO DE EDUCAO ABERTA A


DISTNCIA DA UFPI
Gildsio Guedes Fernandes

SUPERITENDNTE DE EDUCAO SUPERIOR NO ESTADO


Eliane Mendona

DIRETOR DO CENTRO DE CINCIAS HUMANAS E LETRAS


Antnio Fonseca dos Santos Neto

COORDENADOR DO CUSO DE ADMINISTRAO A DISTNCIA


Francisco Pereira da Silva Filho

COODENADORA DE MATERIAL DIDTICO DO CEAD/UFPI


Cleidinalva Maria Barbosa Oliveira

DIAGRAMAO
Emanuel Alcntara da Silva

B726c SANTOS, Magno Alves


Algoritmos e Programao II / Magno Alves dos Santos
Teresina: UFPI/UAPI
2008.

Inclui bibliografia

1 Algoritmo. 2 Linguagem Java, 3 Programao Orientada a


Objetos . I. Universidade Federal do Piau/Universidade Aberta do
Piau. II. Ttulo.

CDU: 32
Sumrio Geral

UNIDADE 1. FUNDAMENTOS DE PROGRAMAO


ORIENTADA A OBJETOS 07

01 Introduo engenharia de software 09


02 Introduo programao de computadores 21
03 Histrico da Linguagem Java 27
04 - Instalao do Java e do NetBeans 31
05 Primeiro Programa Java com a IDE NetBeans 36
06 Entrada e Sada de Dados 46

UNIDADE 2. ESTRUTURAS DE CONTROLE 53


07 Estruturas de Deciso: if-then-else, switch 56
08 Estruturas de Repetio: while, do-while, for 62
09 Estruturas de Interrupo: break, continue, return 69

UNIDADE 3. ARRANJOS E ARGUMENTOS 75


10 Arranjos em Java 77
11 Argumentos em Java 83

UNIDADE 4. PARADIGMA DE PROGRAMAO


ORIENTADA A OBJETOS 89
12 Classes, Objetos e Mtodos 91
13 Definio de Classe em Java 107
14 Herana, Polimorfismo e Interface 125
15 Tratamento e Excees em Java 138

APNDICES:
A01 - EXERCCIOS ADICIONAIS 142
A02 PLANO DE ENSINO 145
A03 - AGENDA DE ATIVIDADES 149

REFERNCIAS BIBLIOGRFICAS 151


Apresentao
Apresentao

Este texto destinado aos estudantes aprendizes que


participam do programa de Educao a Distncia da
Universidade Aberta do Piau (UAPI) vinculada ao consrcio
formado pela Universidade Federal do Piau (UFPI) Universidade
Estadual do Piau (UESPI), Centro Federal de Ensino
Tecnolgico do Piau (CEFET-PI), com apoio do Governo do
estado do Piau, atravs da Secretaria de Educao.
O texto deste compndio composto de quatro unidades,
contendo quinze sub-unidades, estruturadas de modo
sequencial, onde discorrem sobre os fundamentos da
programao de computadores orientada a objetos.
Na Unidade 1, abordamos os fundamentos de engenharia
de software e da programao orientada a objetos, apresentando
a anatomia de um programa orientado a objetos com seus
elementos constituintes. Apresentamos os primeiros passos com
a IDE NetBeans e como escrever um cdigo para ler e escrever
dados na entrada e sada padro.
Na Unidade 2, apresentamos as estruturas de controle de
um programa em Java. Exemplificamos as estruturas de
repetio incremental, repetio com teste no incio e repetio
com teste no final, alm das estruturas de desvio condicional.
Na Unidade 3, abordamos as estruturas de dados de
arranjos homogneos e heterogneos. Trabalhamos exemplos
com vetores, matrizes e adicionalmente passagem de
parmetros como argumentos para um programa
Na Unidade 4, so expostos contedos sobre o
paradigma da programao orientada a objetos. Focamos nas
definies e exemplos de classe, objeto, mensagem.
Apresentamos caractersticas intrnsecas da programao OO
como herana, polimorfismo e interface.
U ni da de
Unidade 1 1
AA soc
sociolo
iologia
gia ee a
a Soc
Sociolo
iologia
gia
da
da Educa
Fundamentos
Edu caoo de
Programao Orientada
a Objetos

Resumo
Esta unidade tem como meta apresentar uma viso
geral sobre os elementos conceituais da programao
orientada a objetos. So abordados os fundamentos
da engenharia de software e da programao de
computadores. A anatomia de um programa em Java
apresentada com suas caractersticas e funes
onde se deve aprender a criar, editar, compilar e
executar um dos primeiro programa em Java. Como
objetivo principal, esta unidade ensina, a gerar um
cdigo simples dentro dos padres mnimos exigido
pela engenharia software.
Sumrio

UNIDADE 1. FUNDAMENTOS DE PROGRAMAO


ORIENTADA A OBJETOS 07

01 Introduo engenharia de software 09


02 Introduo programao de computadores 21
03 Histrico da Linguagem Java 27
04 - Instalao do Java e do NetBeans 31
05 Primeiro Programa Java com a IDE NetBeans 36
06 Entrada e Sada de Dados 46
1. INTRODUO ENGENHARIA DE SOFTWARE

1.1. Engenharia de Software Uma viso em camadas

Engenharia de Software uma disciplina que aplica


princpios da engenharia de desenvolvimento na qualidade do
software em um determinado tempo e com um custo efetivo.
Usando uma abordagem sistemtica e metodolgica para
produzir resultados que possam ser quantificados. Faz uso de
medio e mtricas para avaliar a qualidade, no somente do
software, mas tambm do processo. Utilizada para avaliar e
gerenciar projetos de desenvolvimento de software.

Engenharia de Software vista de modo diferente pelos


diversos profissionais. Pressman sugere uma viso da
engenharia de software como uma camada tecnolgica 1. Essa
viso consiste em quatro camadas: foco na qualidade, processo,
mtodo e ferramentas. A Figura abaixo ilustra essa viso da
engenharia de software.

1.1.1. Foco na Qualidade

Essa camada busca um total foco na qualidade. uma


cultura onde o compromisso em melhoria continua no processo
de desenvolvimento do software sustentado. Permite o
desenvolvimento de mais abordagens efetivas para engenharia
de software.

1.1.2. Processo

Define uma estrutura, que consiste em reas de processos


chave, que define e permite a entrega racional e a tempo de um
software. reas de processos chave so a base para o
gerenciamento de projeto de software. Estabelecem que
mtodos tcnicos sejam aplicados, quais ferramentas so
usadas, que produtos de trabalho precisam ser produzidos, e que
marcos so definidos. Incluem a garantia que a qualidade ser
mantida, e que a mudana devidamente controlada e
gerenciada.

82
9
1.1.3. Mtodo

Mtodos definem procedimentos sistemticos e


ordenados de construo de software. Eles proporcionam uma
estrutura global interna onde as atividades do engenheiro de
software so realizadas. Essas atividades incluem um conjunto
amplo de tarefas, tais como, anlise de requisitos, design,
construo do programa, teste e manuteno.

Metodologia a cincia de pensamento sistemtico,


usando os mtodos ou procedimentos para uma disciplina em
particular. Existem vrias metodologias da engenharia de
software que so usadas atualmente. Algumas delas esto
enumeradas abaixo:

Metodologias Estruturadas:

Informaes de Engenharia
Desenvolvimento do Ciclo de Vida do Software/Ciclo de
Vida do Projeto Metodologia de Desenvolvimento de Aplicao
Rapid
Metodologia de Desenvolvimento de Aplicao Joint
Mtodo CASE*

Metodologias Orientadas a Objeto:

Mtodo Booch
Mtodo Coad e Yourdon
Mtodo Jacobson
Mtodo Rambaugh
Mtodo Wirfs-Brock

1.1.4. Ferramentas

Promovem o suporte aos processos e mtodos.


Ferramentas CASE (Computer Aided Software Engineeing)
proporcionam um sistema de suporte ao projeto de
desenvolvimento, onde as informaes criadas por uma
ferramenta podem ser usadas por outras. Podem ser
automticas ou semi-automticas.

Muitas ferramentas so usadas para desenvolver


modelos. Modelos so patterns (padres) de algo que foi criado
ou so simplificaes. Existem dois modelos que geralmente so
desenvolvidos por um engenheiro de software, especialmente, o
modelo de sistema e o modelo de software. O modelo de sistema
uma representao acessvel de um sistema complexo que
precisa ser estudado, enquanto o modelo de software chamado
de blueprint do software que precisa ser construdo. Assim como
as metodologias, vrios modelos de ferramentas so usados
para representar sistemas e softwares. Alguns esto descritos
abaixo.

Abordagem de Modelos de Ferramentas Estruturada:

10
82
Diagrama de Entidade-Relacionamento
Diagrama de Fluxo de Dados
Pseudocdigo
Fluxograma

Abordagem de Modelo de Ferramenta Orientada a Objeto:

Linguagem de Modelagem Unificada (UML)

1.2. Qualidade dentro do Esforo de Desenvolvimento

Conforme mencionado anteriormente, a qualidade a


mente que influencia todo engenheiro de software. Focando na
qualidade em todas as atividades de engenharia de software,
reduz-se custo e melhora-se o tempo de desenvolvimento pela
minimizao de um novo trabalho de correo. Para proceder
dessa forma, um engenheiro de software tem que definir
explicitamente que qualidade de software ter um conjunto de
atividades que asseguraro que todo produto de trabalho da
engenharia de software exibe alta qualidade, fazer controle de
qualidade e atividades garantidas, o uso de mtricas para
desenvolver estratgias para melhorar o produto de software e o
processo.

1.2.1. O que qualidade?

Qualidade a caracterstica total de uma entidade para


satisfazer necessidades declaradas e implcitas. Essas
caractersticas ou atributos tm que ser mensurveis de modo
que possam ser comparados por padres conhecidos.

1.2.2. Como definimos qualidade?

Trs perspectivas so usadas na compreenso da


qualidade, especialmente, olhamos para a qualidade do produto,
do processo e no contexto do ambiente de negcios.

Qualidade do Produto

Significa coisas diferentes para cada pessoa. relativo


para uma pessoa analisar qualidade. Para os usurios finais, o
software tem qualidade se fornecer o que desejam e quando
desejam o tempo todo. Tambm julgam baseados na facilidade de
usar e de aprender como us-lo.

Normalmente avaliam e categorizam com base em


caractersticas externas, tal como, nmero de falhas por tipo.
Falhas podem ser categorizadas como: insignificantes,
importantes e catastrficas. Para que outros possam desenvolver
e manter o software, estes devem ficar de olho nas caractersticas
internas em vez das externas. Exemplos que incluem erros e
falhas encontradas durante as fases de anlise de requisitos,
design, e codificao so normalmente feitos anteriormente ao
carregamento dos produtos para os usurios finais.

82
11
Como engenheiros de software, devemos construir
modelos baseados em como os requisitos dos usurios externos
sero relacionados com os requisitos internos dos
desenvolvedores.

Qualidade do Processo

Existem vrias tarefas que afetam a qualidade do


software. s vezes, quando uma tarefa falha, a qualidade do
software falha. Como engenheiros de softwares, devemos
validar a qualidade no processo de desenvolvimento do software.
Regras de processo sugerem que pela melhoria do processo de
desenvolvimento do software, tambm h melhora da qualidade
do produto resultante. Algumas regras de processo so
demonstradas abaixo:

Capability Maturity Model Integration(CMMI). Foram


formulados pelo Software Engineering Institute (SEI). um
processo meta-modelo que baseado em um conjunto de
sistemas e competncias da engenharia de software que devem
existir dentro de uma organizao. Como a mesma atinge
diferentes nveis de capacidade e maturidade desses processos
de desenvolvimento.

ISSO 9000:2000 para Software. um padro genrico,


aplicado para qualquer organizao que queira melhorar a
qualidade global dos produtos, sistemas ou servios que
proporciona.

Software Process Improvement e Capability


Determination (SPICE). um padro que define um conjunto de
requisitos para avaliao do processo de software. O objetivo
desse padro auxiliar organizaes a desenvolver uma anlise
objetiva da eficcia de qualquer processo de software definido.

Nessa perspectiva, qualidade visualizada em termos de


produtos e servios sendo proporcionado pelo negcio em que o
software usado. Melhorando a qualidade tcnica dos
processos de negcio, agrega-se valor ao negcio, por exemplo,
valor tcnico do software traduz o valor do negcio. Tambm
importante medir o valor do software em termos de terminologias
de negcio, tal como, quantos pedidos de venda foram
processados hoje?, valor do dlar sobre o retorno em cima dos
investimentos (ROI), etc. Se o software no agrega valor ao
negcio, qual a necessidade de t-lo em primeiro lugar?

1.2.3. Como endereamos os pontos importantes sobre


qualidade?

Podemos enderear os pontos importantes sobre


qualidade em:

82
12
1. Uso de padres de Qualidade. Padres de qualidade so um
conjunto de princpios, procedimentos, metodologias e regras,
para resumir, sobre qualidade no processo, tais como, CMMI,
ISO 9000:2000 para Software e SPICE.

2. Compreender pessoas envolvidas no processo de


desenvolvimento incluindo usurios finais e participantes.
Sustenta um ambiente de colaborao e comunicao efetiva.

3. Compreender as tendncias sistemticas na natureza


humana. Tal como, as pessoas tendem a ser contrrias ao risco
quando existe uma perda potencial, so indevidamente
otimistas em seus planos e projees, e preferem usar
julgamentos intuitivos ao invs de modelos quantitativos.

4. Engajamento para a qualidade. Uma mente focada sobre


qualidade necessria para descobrir erros e defeitos assim que
possam ser endereados imediatamente.

5. Requisitos de usurios administradores porque mudaro ao


longo do tempo. Requisitos a base, definindo as caractersticas
da qualidade de software.

1.3. Tcnicas e Garantias de Qualidade de Software

Garantia de qualidade de Software um subconjunto da


engenharia de software que assegura que todos os produtos de
trabalho sejam realizados, e que cumpram com as exigncias e
padres estabelecidos pelos usurios. Considera-se como uma
das atividades mais importantes que aplicada durante todo o
processo do desenvolvimento do software. O objetivo detectar
defeitos antes do software ser entregue como um produto
acabado para o usurio final. Isto abrange uma aproximao
eficaz da gerncia de qualidade, tecnologia de engenharia de
software (mtodos e ferramentas), tcnicas formais de reviso,
vrias estratgias de teste, controle de documentao de
software e alteraes feitas, um procedimento para assegurar a
conformidade com os padres de desenvolvimento de software,
e um mecanismo para mensur-los e document-los.

1.3.1. Qualidade de Software

Um software possui qualidade se ele estiver ajustado para


uso, isto , se estiver trabalhando corretamente. Para que ele
trabalhe corretamente, ele deve estar em conformidade com os
requisitos funcionais e de performance caractersticas externas
dos usurios), padres explicitamente documentados de
desenvolvimento (padres de qualidade), e caractersticas
implcitas (caractersticas internas aos desenvolvedores) que
so esperadas por todo desenvolvimento profissional de
software.

Trs pontos importantes enfatizados para definir a


qualidade do software.

13
82
1. Requisitos de Software so a base para a qualidade do
software. necessrio explicitar, especificar e priorizar.

2. Padres definem um de critrios de desenvolvimento


que iro mostrar a maneira com a qual o software ser
desenvolvido.

3. Caractersticas implcitas devero ser identificadas e


documentadas; elas influenciam na maneira de como o
software ser desenvolvido assim como sua manutenibilidade.

1.3.2. Caractersticas para uma Boa Engenharia de Software

Para definir uma boa engenharia de software, d uma


olhada nas caractersticas especficas que o software apresenta.
Algumas delas esto enumeradas abaixo:

Usabilidade. a caracterstica do software de apresentar


facilidades entre a comunicao dos usurios com o sistema.
Portabilidade. a capacidade do software ser executado em
diferentes plataformas e arquiteturas.
Reusabilidade. a habilidade do software de se transferir de um
sistema para outro.
Manutenibilidade. a habilidade do software de se envolver e
adaptar-se s alteraes em um curto espao de tempo.
caracterizado pela fcil atualizao e manuteno.
Dependncia. a caracterstica do software ser confivel e de
segurana
Eficincia. a capacidade do software utilizar os recursos com
maior eficincia.

1.3.3. Atividades da Garantia de Qualidade de Software

Garantia de Qualidade de Software composta por uma


variedade de atividades com o objetivo de construir software com
qualidade. Isto envolve dois grupos de desenvolvedores e a
equipe de SQA (Software Quality Assurance). A equipe de SQA
tem responsabilidade em garantir plenamente qualidade,
supervisionar, manter, analisar e reportar defeitos. As atividades
envolvidas so as seguintes:

1. A equipe de SQA prepara o Plano de SQA. Isto se d durante a


fase de planejamento de projeto. Identificam-na:

Avaliao a ser executada;


Auditorias e revises a serem executadas;
Padres que devem ser aplicados;
Procedimentos de erros reportados e monitorados;
Documentos que devem ser produzidos; e
Conjunto de respostas que se fizer necessrio.

2. A equipe de SQA participa na descrio do processo de


desenvolvimento de software. O time de desenvolvedores

82
14
escolhe o processo de desenvolvimento e a equipe de SQA deve
verificar se ele se enquadra na poltica organizacional e nos
padres de qualidade

3. A equipe de SQA revisa as atividades de engenharia de


software empregadas pelo time de desenvolvedores para checar
a conformidade com o processo de desenvolvimento de software.
Eles monitoram e seguem desvios do processo do
desenvolvimento do software. Documentam-no e asseguram-
se de que as correes sejam feitas.

4. A equipe de SQA rev o trabalho para verificar se esto


conforme o padro definido. Eles monitoram e marcam defeitos e
falhas encontrados em cada trabalho.

5. A equipe de SQA assegura-se que os desvios nas atividades de


software e no processo de produo estejam seguramente
baseados na definio de procedimentos e padres de operao

6. A equipe de SQA envia desvios e desconformidades aos


padres para os gerentes ou a quem for de interesse.

1.3.4. Tcnicas Formais de Reviso

Produtos de trabalho so as sadas esperadas como


resultado da execuo de tarefas no processo de
desenvolvimento de software. Esses resultados contribuem para
o desenvolvimento de software com qualidade.
Conseqentemente, devem ser mensurados e verificados
novamente se vo ao encontro das exigncias e dos padres. As
alteraes nos produtos de trabalho so significativas; elas
podem ser monitoradas e controladas. A tcnica de checar a
qualidade dos produtos de trabalho a tcnica formal de reviso.
Formal Technical Reviews (FTR) so executadas em vrios
pontos do processo do desenvolvimento do software. Ela serve
para descobrir erros e defeitos que podem ser eliminados antes
do software ser enviado para o usurio final. Especificamente,
seus objetivos so:

1. Descobrir erros em funes, na lgica ou na execuo para


toda a representao do software;
2. Verificar se o software sob a reviso encontra-se de acordo
com os requisitos do usurio;
3. Assegurar-se que o software esteja de acordo com os padres
definidos;
4. Conseguir que o software seja desenvolvido de uma maneira
uniforme; e
5. Desenvolver projetos mais gerenciveis.

Um guia geral de conduo das tcnicas formais de


reviso est listado abaixo.

Revisar o produto de trabalho e NO o desenvolvedor do


produto de trabalho. O objetivo da reviso e descobrir erros e
defeitos para melhorar a qualidade do software. O tom da reviso

15
82
pode ser brando, porm construtivo.
Planejar e cumprir a agenda. Revises no devem durar mais de
duas horas.
Minimizar os debates e discusses. inevitvel que os
problemas sejam levantados e isso no cause efeito nas pessoas.
Lembre a todos que no hora de resolver os problemas que
sero apenas documentados, uma outra reunio deve ser
agendada para resolv-los.
Indique reas de problema, mas no s tente resolv-las.
Mencione e esclarea reas de problema. Entretanto, no hora
de resolver problemas, devero ser resolvidos em uma outra
reunio.
Tome nota. uma boa prtica tomar nota do que foi dito e suas
prioridades para que elas possam ser vistas por outros revisores.
Isto ajudar a esclarecer os defeitos e aes a serem tomadas.
Mantenha o nmero dos participantes a um mnimo e insista em
preparar-se para a reviso. Escrever comentrios e observaes
pelos revisores uma boa tcnica.
Fornea uma lista de verificao para o produto de trabalho que
provvel ser revista. A lista de reviso prov uma estrutura que
conduza a reviso. Isto tambm ajuda os revisores a manterem o
foco na questo.
Programe as revises como parte do processo de
desenvolvimento de software e assegure-se de que os recursos
sejam fornecidos para cada revisor. Preparao prev
interpretaes em uma reunio. Isto tambm ajuda os revisores a
manterem o foco na questo.
Sumrio da reviso. Verifica a eficcia do processo da reviso.

Duas tcnicas formais de reviso do produto de trabalho


usadas na indstria so Fagan's Inspection Method e
Walkthroughs.

1.3.5. Mtodo de Inspeo de Fagan

Introduzido por Fagan em 1976 na IBM. Originalmente foi


utilizado para verificar cdigos de programas. Entretanto, pode ser
estendido para incluir outros produtos de trabalho como tcnicas
de documentos, modelo de elementos, projetos de cdigos e
dados etc. Isto gerenciado por um moderador que responsvel
por supervisionar a reviso. Isto requer uma equipe de inspetores
designados a verificar se as regras do produto de trabalho vo de
encontro lista de interesse preparada. mais formal que o
walkthrough. A seguir esto descritas regras determinadas na qual
cada participante dever aderir:

As inspees so realizadas em um nmero de pontos no


processo do planejamento do projeto e do desenvolvimento dos
sistemas.
Todas as classes com defeito so documentadas e os produtos
do trabalho so inspecionados no somente a nvel lgico, de
especificaes ou de funes de erros.
A inspeo realizada por colegas em todos os nveis exceto o
16
82
chefe.
As inspees so realizadas em uma lista prescrita das
atividades.
As reunies de inspeo so limitadas a duas horas.
As inspees so conduzidas por um moderador treinado.
Inspetores so designados a especificar regras para aumentar a
eficcia. As listas de verificao dos questionrios a serem
perguntados pelos inspetores so usadas para definir tarefas e
estimular a encontrar defeitos. Os materiais so inspecionados
minuciosamente para que seja encontrado o mximo nmero de
possveis erros.
Estatsticas com os tipos de erros so vitais, so utilizadas para
obter anlises de uma maneira similar anlise financeira.

Conduzir inspees requer muitas atividades. Elas esto


categorizadas a seguir:

Planejamento. O moderador deve se preparar para a inspeo.


Decide quem sero os inspetores e as regras que estes devem
obedecer, quem e quando desempenharo seus papis e
distribuir a documentao necessria.
Uma rpida apresentao. 30 minutos de apresentao do
projeto dos inspetores o suficiente. Isto pode ser omitido se
todos estiverem bem familiarizados com o projeto.
Preparando. Cada inspetor ter de 1 a 2 horas sozinho para
inspecionar o produto de trabalho. Ele ir executar as regras
passadas a ele com base na documentao provida pelo
moderador. Ele ir tentar descobrir defeitos no produto de
trabalho. Ele no dever reparar defeitos ou criticar o
desenvolvedor do produto de trabalho.
Realizando a reunio. Os participantes das reunies so
inspetores, moderadores e desenvolvedores do produto de
trabalho. Os desenvolvedores do produto de trabalho esto
presentes para explicar o produto de trabalho, e responder s
perguntas que os inspetores fizerem. Nenhuma discusso se o
defeito ou no real permitida. Uma lista de defeitos deve ser
produzida pelo moderador.
Refazendo o produto de trabalho. A lista de defeitos deve ser
atribuda a uma pessoa para repar-la. Normalmente, esta o
desenvolvedor do produto de trabalho.
Acompanhando os reajustes. O moderador assegura-se que os
defeitos nos produtos de trabalho sejam endereados e
solucionados. Mais tarde este deve ser inspecionado por outro
inspetor.
Realizando uma reunio ocasional de anlise. Isto opcional,
momento onde dada a possibilidade aos inspetores de
expressarem sua viso pessoal sobre erros e melhorias. A nfase
dada maneira que a inspeo foi feita.

1.3.6. Walkthrough

O walkthrough menos formal que a inspeo. Aqui, o


produto de trabalho e sua documentao correspondente so
entregues para um time de revisores, normalmente em torno de 3
17
pessoas, onde comentrios de sua exatido so apresentados.
Ao contrrio da inspeo onde um o moderador, o
desenvolvedor do produto de trabalho coordena o walkthrough.
Um escrivo tambm deve estar presente para documentar a lista
de aes. Uma lista de aes deve ser feita a fim de melhorar a
qualidade do produto final a qual inclui ajustes dos defeitos,
resolues dos problemas etc.

Alguns passos devem ser seguidos para obter sucesso no


walkthrough. Eles esto listados abaixo:

Nenhum gerente deve estar presente.


Enfatizar que o walkthrough para deteco de erros e no para
correo.
Manter o interesse do grupo.
Nenhuma contagem ou atribuio de nota.
Criticar o produto; no a pessoa.
Sempre documentar a lista de aes.

Conduzir o walkthrough, similar inspeo, requer muitas


atividades. Elas esto categorizadas como se segue:

Antes do walkthrough

o O desenvolvedor do produto de trabalho agenda o


walkthrough, preferivelmente, com um dia de
antecedncia ou dois no mximo.
o Distribuir o material necessrio para o produto de
trabalho dos revisores.
o Pede-se especificamente que cada revisor traga
pelo menos dois comentrios positivos do
walkthrough e um comentrio negativo sobre o
produto do trabalho.

Durante o walkthrough

o O desenvolvedor do produto de trabalho faz uma


rpida apresentao do seu produto de trabalho.
Este passo pode ser ignorado caso os revisores
conheam bem o produto de trabalho.
o olicitar comentrios aos revisores. s vezes,
problemas so levantados e apresentados, mas
no devem ser solucionados durante o
walkthrough. Os problemas devero ser includos
em uma lista de aes.
o Uma lista de aes deve ser produzida at o fim do
walkthrough.

Aps o walkthrough

o O desenvolvedor do produto de trabalho recebe a


lista de aes.
o Pede-se para enviar os estados das aes com o

18
82
apresentadas na lista de aes.
o Possivelmente, um outro walkthrough deve
ser agendado.

1.4. Documentao no Esforo de Desenvolvimento

1.4.1. O que documentao?

um conjunto de documentos ou informaes do produto


que descrevem o sistema. Cada documento desenhado para
executar uma funo especfica, como:

REFERNCIA, como por exemplo, especificaes tcnicas ou


funcionais.

INSTRUCIONAL, como por exemplo, tutoriais, demonstraes


ou prottipos.

MOTIVACIONAL, como por exemplo, brochuras,


demonstraes ou prottipos.

H vrios tipos de documentao e informaes funcionais do


produto. Alguns so citados abaixo:

Caractersticas e Funes do Sistema


Sumrio Gerencial e do Usurio
Manual do Usurio
Manual de Administrao do Sistema
Vdeo
Multimdia
Tutoriais
Demonstraes
Guia de Referncia
Guia de Referncia Rpida
Referncias Tcnicas
Arquivos de Manuteno do Sistema
Modelos de Teste do Sistema
Procedimentos de Converso
Manual de Operaes/Operador
Help ON-Line
Wall Charts
Layout de teclado ou Templates
Jornais

Bons documentos no geram sistemas complicados. No


entanto, eles podem ajudar de outra forma. A tabela seguinte
mostra como a documentao ajuda no processo de
desenvolvimento de software.

19
82
Existem dois principais propsitos da documentao.
Especificamente, eles:
Fornecem um argumento racional e permanente para a
estrutura do sistema ou comportamento atravs dos manuais de
referncia, guia do usurio e documentos de arquitetura do
sistema.
Servem como documentos transitrios que so parte de
uma infra-estrutura envolvida em uma execuo de um projeto
real como: cenrios, documentao do projeto interno, relatrio
de reunies e problemas.

Exerccios:

1. Discuta a viso em camadas tendo em vista no


gerenciamento e desenvolvimento do software.

2. Qualidade do software a caracterstica para satisfazer


necessidades declaradas e implcitas do contratante. Como
mensurar estas caractersticas que do modo que possa ser
comparada a padres conhecidos?

3. Pesquisa na Internet exemplos de documentao de


software como: a) Manual do Usurio, b) Manual de
Administrao do Sistema, c) Vdeo, Multimdia, Tutoriais, d)
Demonstraes, e) Arquivos de Manuteno do Sistema, f)
Manual de Operaes/Operador, g) Help ON-Line, Wall Charts.

4. Apresente um algoritmo (em fluxograma ou em passos


lgicos) do fluxo de desenvolvimento do software. Apresente as
fases e atividades importantes para garantir a qualidade do
software.

20
82
5. Documente o cdigo abaixo.

public class Documento {


public static void main( String args[] ) {
System.out.println( "Cdigo documentado!" ); {
}
}

Desafio:

6. A equipe de desenvolvimento responsvel pela


construo do software que ir dar suporte ao sistema de
informao solicitado. Em geral formado por: analista de
sistemas, projetista, programadores e testadores. Qual papel de
cada um no processo de engenharia do software.

2. INTRODUO PROGRAMAO DE COMPUTADORES

2.1. O que uma linguagem de programao?

Uma linguagem de programao uma tcnica de


comunicao padronizada para se expressar instrues para um
computador. Assim como os idiomas utilizados pelos seres
humanos, cada linguagem tem sua prpria sintaxe e gramtica.
Linguagens de programao possibilitam ao programador
especificar precisamente com quais dados o computador ir
interagir, como estes dados sero gravados/transmitidos, e
precisamente quais aes sero tomadas de acordo com as
circunstncias.
Existem diferentes tipos de linguagens de programao
que podem ser usadas para a criao de programas, mas,
independente da linguagem utilizada, essas instrues so
traduzidas em linguagem de mquina, e podem ser entendidas
por computadores.

2.2. Categorias das Linguagens de Programao

2.2.1. Linguagens de Programao de Alto Nvel

Uma linguagem de programao de alto nvel uma


linguagem de programao que mais amigvel para o usurio,
em alguns casos independente de plataforma, e que abstrai
operaes de baixo nvel como acesso a memria. Uma
instruo de programao pode ser traduzida em uma ou vrias
instrues de mquina por um compilador.
Exemplos so Java, C, C++, Basic, Fortran

2.2.2. Linguagens de Montagem de Baixo Nvel

Linguagens de montagem so similares s linguagens de

82
21
Este o ciclo de vida quando se tenta resolver um
problema no computador:

Para entendermos o
funcionamento deste ciclo na
soluo de problemas no
computador, vamos definir
um problema exemplo que
iremos resolver passo a
passo enquanto discutimos
as metodologias para
resoluo de problemas em
detalhe.

2.3.1. Definir o problema

Geralmente, um programador recebe uma tarefa na forma


de um problema. Antes do programa poder ser projetado para
resolver um problema em particular, o problema deve, em
primeiro lugar, ser bem e claramente definido em termos dos seus
requisitos de entrada e sada.
Um problema claramente definido j metade da soluo.
Programao de computadores requer que o problema seja
primeiro definido antes de se pensar em criar a soluo.
Vamos definir o problema exemplo:
Crie um programa que ir determinar o nmero de vezes que um
nome aparece em uma lista.

2.3.2. Analisar o problema

Depois do problema ter sido definido adequadamente, o


mais simples e tambm o mais eficiente e efetivo meio de se
resolver ser visualiz-lo atravs de uma representao clara e
objetiva.
Geralmente, este passo se d com a quebra do problema
em sub-problemas menores e mais simples.
Problema Exemplo:
Determinar o nmero de vezes que um nome aparece em
uma lista

Entrada para o programa:


Lista de nomes, nome que se deseja procurar

Sada do programa:
O nmero de vezes que o nome aparece em uma lista

2.4. Projetar e representar o algoritmo

Logo que o problema estiver sido claramente definido,


podemos nos concentrar em desenvolver a soluo. Na
programao de computadores, geralmente requerido que
expressemos a soluo passo a passo.
82
22
Um Algoritmo uma especificao clara e no ambgua
dos passos necessrios para se resolver o problema. Ele pode
ser expresso tanto em linguagem humana (Ingls, Tagalog e
Portugus), como atravs de representao grfica como
fluxograma ou atravs de pseudocdigo, que um meio termo
entre a linguagem humana e a linguagem de programao.
Dado o problema definido na seo anterior, como
podemos expressar a soluo de uma maneira simples e que
possa ser entendida?
Expressando a soluo atravs da linguagem humana:

1. Obter a lista de nomes, vamos cham-la de NomeLista


2. Obter o nome a ser procurado, vamos cham-lo de
NomeChave
3. Criar um contador, vamos cham-lo de Conta
4. Pegar cada nome em NomeLista
5. Se NomeChave for igual ao nome selecionado em NomeLista
6. Adicionar 1 a Conta
7. Repetir 4 at que todos os nomes j tiverem sido comparados
8. Exibir o valor de Conta

Expressando a soluo atravs de um fluxograma:

Expressando a soluo atravs de pseudocdigo:

23
2.4.1. Smbolos do Fluxograma e o seu significado

Um fluxograma uma ferramenta de projeto usada para


representar graficamente a lgica de uma soluo. Os
fluxogramas, tipicamente, no mostram comandos de linguagem
de programao. Ao invs disto, eles mostram o conceito em
Portugus ou em notao matemtica.
Aqui esto algumas dicas dos smbolos mais usados para a
criao de fluxogramas. Pode-se utilizar quaisquer smbolos
quando criar os seus fluxogramas, desde que use-os de maneira
consistente.

2.5. Codificar e Depurar

Depois de construir o algoritmo, ser possvel criar o cdigo


fonte. Usando o algoritmo como base, o cdigo fonte pode ser
escrito usando a linguagem de programao escolhida.
Na maioria das vezes, depois do programador ter escrito o
programa, este poder no estar funcionando 100% no incio. O
programador deve corrigir o programa no caso de erros (tambm
conhecidos como Erros de Compilao) que ocorrem no programa.
Este processo chamado de depurao de erros (debug).
82
24
Existem dois tipos de erros que os programadores
podero encontrar. O primeiro o erro em tempo de compilao e
o outro o erro em tempo de execuo.
Erro em tempo de compilao ocorre se h um erro de
sintaxe no cdigo. O compilador ir detectar o erro e o programa
nem mesmo compilar. Neste ponto, o programador estar
inapto a criar um executvel que possa ser executado pelo
usurio at que o erro seja corrigido.
Esquecer um ponto-e-vrgula no final de uma instruo ou
escrever um comando erroneamente, por exemplo, so erros em
tempo de compilao. algo que o compilador pode detectar
como sendo um erro.
Compiladores no so perfeitos e ento no podem
detectar todos os erros em tempo de compilao. Isso
especialmente verdadeiro para erros de lgica como as
repeties (loops) infinitos. Este tipo de erro chamado de erro
em tempo de execuo.
Por exemplo, a sintaxe do cdigo pode estar correta.
Entretanto, ao seguir a lgica do cdigo, o mesmo pedao de
instruo executado vrias e vrias vezes, infinitamente. Neste
caso, os compiladores no so espertos o suficiente para pegar
todos estes tipos de erro em tempo de compilao,
conseqentemente, o programa compila corretamente em um
arquivo executvel.
Entretanto, quando o usurio final roda o programa, o
programa (ou mesmo o computador inteiro) congela devido a
uma repetio infinita. Outros tipos de erro em tempo de
execuo so: um valor errado a ser computado, uma instruo
errada a ser executada, etc.

Exerccios:

1. Escrevendo algoritmos: Dado o seguinte conjunto de tarefas,


crie um algoritmo para realizar cada uma das tarefas abaixo.
Escreva os algoritmos usando pseudocdigo ou fluxogramas.
a) Assar po
b) Acessar o computador
c) Obter a mdia de trs nmeros

2. Com base a figura abaixo, defina um problema simples, faa a


anlise de como o problema ser resolvido, represente o
problema em fluxograma e codifique em pseudocdigo
(portugol).

25
82
Desafio:

Suponha que um certo instituto deseja fazer uma


pesquisa de opinio pblica. Os dados sero coletados nos
bairros da vrias cidades. Os dados sero armazenados e
devero ser processados para gerar os relatrios estatsticos
da pesquisa. Construa um fluxograma de como ser o
processo de coleta, processamento e resultados do sistema.

26
82
3 Histrico da Linguagem Java

3.1. Um pouco da histria

Java foi criado em 1991 por James Gosling da Sun


Microsystems. Inicialmente chamada OAK (Carvalho), em
homenagem uma rvore de janela do Gosling, seu nome foi
mudado para Java devido a existncia de uma linguagem com o
nome OAK.
A motivao original do Java era a necessidade de uma
linguagem independente de plataforma que podia ser utilizada
em vrios produtos eletrnicos, tais como torradeiras e
refrigeradores. Um dos primeiros projetos desenvolvidos
utilizando Java era um controle remoto pessoal chamado *7 (Star
Seven).

Ao mesmo tempo, a World Wide Web e a Internet foram


ganhando popularidade. Gosling achava que a linguagem Java
poderia ser usada para programao da Internet.

3.2. O que a tecnologia Java?

3.2.1. Uma linguagem de programao

Como linguagem de programao, Java pode ser utilizado


para criar todos os tipos de aplicaes existentes, de programas
de Inteligncia Artificial para Robs at programas para
aparelhos celulares.

3.2.2. Um ambiente de desenvolvimento

Como ambiente de desenvolvimento, a tecnologia Java


fornece um grande conjunto de ferramentas: um compilador, um
interpretador, um gerador de documentao, ferramenta de
empacotamento de classes de arquivos e outros.

3.2.3. Um ambiente de aplicao

Aplicaes de tecnologia Java so tipicamente programas


de propsito geral que executam sobre uma mquina onde o Java
Runtime Environment instalado.
82
27
3.2.4. Um ambiente de distribuio

H dois ambientes de distribuio principais: Primeiro, o


JRE, fornecido atravs do Java 2 Software Development Kit
(SDK), contm um conjunto completo de arquivos de classes
para todos pacotes de tecnologia Java. Outro ambiente de
distribuio o navegador web, ou seja, o browser. Os
navegadores web atuais fornecem interpretao tecnologia e
ambiente Java em tempo de execuo.

3.3. Algumas caractersticas do Java

3.3.1. Mquina Virtual Java

A Mquina Virtual Java uma mquina imaginria que


implementada atravs de um software emulador em uma
mquina real. A JVM prov especificaes de plataforma de
hardware na qual compila-se todo cdigo de tecnologia Java.
Essas especificaes permitem que o software Java seja uma
plataforma independente pois a compilao feita por uma
mquina genrica
conhecida como JVM.
O bytecode uma linguagem de mquina especial que
pode ser entendida pela Mquina Virtual Java (JVM). O
bytecode independente de qualquer hardware de computador
particular. Assim, qualquer computador com o interpretador Java
pode executar um programa Java compilado, no importando
em que tipo de computador o programa foi compilado.

3.3.2. Garbage Collection

Muitas linguagens de programao permitem ao


programador alocar memria durante o tempo de execuo.
Entretanto, aps utilizar a memria alocada, deve existir uma

28
82
maneira para desalocar o bloco de memria de forma que os
demais programas a utilizem novamente. Em C, C++ e outras
linguagens o programador o responsvel por isso. Isso, s
vezes, pode ser difcil j que instncias podem ser esquecidas de
serem desalocadas da memria pelos programadores e resultar
no que chamamos de escapes da memria.
Em Java, o programador no possui a obrigao da retirar
uma varivel criada das reas de memria, isto feito por uma
parte da JVM especfica que chamamos de Garbage Collection.
O Garbage Collection o grande responsvel pela liberao
automtica do espao em memria.
Isso acontece automaticamente durante o tempo de vida
do programa Java.

3.3.3. Segurana do Cdigo

Segurana do Cdigo alcanada em Java atravs da


implementao da Java Runtime Environment (JRE). A JRE
roda cdigos compilados para a JVM e executa o carregamento
de classes (atravs do Class Loader), verificao de cdigo
(atravs do verificador de bytecode) e finalmente o cdigo
executvel.
O Class Loader responsvel por carregar todas as
classes necessrias ao programa Java. Isso adiciona segurana
atravs da separao do namespace entre as classes do sistema
de arquivos local e aquelas que so importadas pela rede. Isso
limita qualquer ao de programas que podem causar danos, pois
as classes locais so carregadas primeiro. Depois de carregar
todas as classes, a quantidade de memria que o executvel ir
ocupar determinada. Isto acrescenta, novamente, uma proteo
ao acesso no autorizado de reas restritas ao cdigo pois a
quantidade de memria ocupada determinada em tempo de
execuo.
Aps carregar as classes e definir a quantidade de
memria, o verificador de bytecode verifica o formato dos
fragmentos de cdigo e pesquisa nestes fragmentos por cdigos
ilegais que possam violar o direito de acesso aos objetos.
Depois que tudo isso tiver sido feito, o cdigo finalmente
executado.

3.4. Fases do Programa Java

A figura seguinte descreve o processo de compilao e


execuo de um programa Java.

29
82
O primeiro passo para a criao de um programa Java
escrever os programas em um editor de texto. Exemplos de
editores de texto que podem ser utilizados: bloco de notas, vi,
emacs, etc. Esses arquivos so armazenados no disco rgido com
a extenso .java.
Aps o programa Java ter sido criado e salvo, compile o
programa utilizando o Compilador Java. A sada desse processo
um arquivo de bytecode com extenso .class.
O arquivo .class ento lido pelo Interpretador Java que
converte os bytecodes em linguagem de mquina do computador
que se est usando.

Exerccios:

1. O que a tecnologia Java inovou em relao as


tecnologias j existentes como C++, Delphi, Visual Basic?
2. Com base a figura abaixo, escreva um fluxograma
das fases de implementao de um programa em Java.
Especifique os desvios lgicos e desvios com repeties.
3. Com vista no desepenho em tempo de execuo,
compare a execuo de uma aplio em Java e outra em C++ no
ambiente Linux.

Desafio:

Pesquise e relacione os sistemas middlewares (mquinas


virtuais) existentes para linguagens e aplicativos. Descreva a
funo de cada um.

30
82
4 Instalao do Java e do NetBeans

4.1. Instalando Java no Ubuntu

Passo 1: No diretrio onde foi efetuado o download dos


instaladores.

Passo 2: Antes de executar o instalador, assegure-se de que o


arquivo seja um executvel. Para tanto, pressione o boto direito
do mouse no cone do instalador, e em seguida selecione
Properties. Selecione na aba Permissions, e ento marque a
opo Execute. Feche a janela.

Passo 3: Duplo-clique no arquivo jdk-1_5_0_07-linux-i586.bin.


A caixa de dilogo abaixo ser mostrada. Pressione o boto Run
in Terminal.
31
82
No console ser mostrado o contrato de licena do
software.
Pressione ENTER at ser mostrada a pergunta: Do you
agree to the above license terms? [yes or no]. Caso concorde
com os termos apresentados digite a palavra yes e pressione a
tecla ENTER. Aguarde que o instalador termine de
descompactar e instale o Java.

Passo 4: Devemos um caminho de pesquisa a fim de permitir a


execuo de comandos java em qualquer local. Para isto,
entraremos na pasta /usr/local/bin. Digitando:

Para criar os links simblicos para os comandos, tecle:

sudo ln -s /usr/java/jdk1.5.0_07/bin/* .

4.2. Instalando NetBeans no Ubuntu

Passo 1: V para a pasta onde estiver o instalador do


NetBeans.

Passo 2: Antes de executar o instalador, assegure-se de


que o arquivo seja executvel. Para tanto, utilize o boto direito
do mouse no cone do instalador e, em seguida selecione
Properties. Selecione a aba Permissions, e marque a opo
Execute. Encerre a janela.

32
82
Passo 3: Duplo-clique no arquivo de instalao do NetBeans.
Pressione o boto Run in Terminal.
Ser mostrada uma caixa de dilogo do NetBeans 5.5.
Pressione o boto Next >.

Na prxima janela o termos da licena sero mostrados,


caso concorde selecione a opo I accept the terms in the
license agreement, e ento pressione o boto Next >.

Modifique o nome do diretrio para: /usr/java/netbeans-


5.5, ento pressione o boto Next >.

33
82
Na pasta do JDK, selecione /usr/java/jdk1.5.0_07, e ento
pressione o boto Next >.

A prxima caixa de dilogo mostra apenas informaes


sobre o NetBeans que voc est instalando. Pressione o boto
Next >. Aguarde o NetBeans terminar o processo de instalao.
Pressione o boto Finish para completar a instalao.

Passo 4: A fim de possibilitar a execuo do NetBeans a partir de


qualquer pasta no computador, precisamos criar um caminho de
pesquisa. Para isso, entramos na pasta :/usr/local/bin. com o
comando:

cd /usr/local/bin
Crie um caminho de pesquisa para o NetBeans, digitando:

sudo ln -s /usr/java/netbeans-5.5 .
34
82
possvel executar o NetBeans a partir de qualquer pasta,
digitando:

netbeans &

Exerccios:

1. Baixe da Internet e instale o sistema de desenvolvimento


java (J2SDK) no ambiente Windowns. Edite (usando o editor
padro - NotePad), compile e execute (usando linha de comando
CMD) o programa Wello World.
2. Baixe da Internet e instale o sistema de desenvolvimento
java (J2SDK) no ambiente Linux. Edite (usando o editor padro
vi ou pico, etc), compile e execute (usando linha de comando do
terminal console) o programa Wello World.
3. Baixe e instale no NetBeans no ambiente Windonws e
Linux. Teste alguns exemplos.

35
82
5. PRIMEIRO PROGRAMA JAVA COM A IDE NETBEANS

Antes de explicar o que o programa significa, vamos


escrev-lo e execut-lo.

5.1 Utilizando a console e um editor de texto

Neste exemplo utilizaremos um simples editor de texto,


que pode ser o gedit do Linux, para editar o cdigo fonte. Em
seguida ser necessrio abrir uma janela terminal para compilar e
executar os programas.

Passo 1: executar um editor de texto

Para iniciar um editor de texto no Linux selecione


Applications Accessories Text Editor.

Passo 2: Abrir a janela de console

Para abrir o terminal no Linux, selecione Applications


Accessories Terminal.

Passo 3: Escrever as instrues utilizando o Editor de Texto

Digite as seguintes instrues no editor de textos:

Passo 4: Salvar o programa Java

Chamaremos o programa de "Hello.java" e o colocaremos


em uma pasta denominada "myJavaPrograms".
Caso esta pasta no tenha sido criada, retorne janela de
terminal aberta e insira as seguintes instrues:

Para o Linux:

$ md myJavaPrograms

Retorne ao Editor de textos e salve o programa. Para abrir


a caixa de dilogo salvar selecione a opo "File" localizada na
barra de menus e depois clique na opo "Save".
Selecione a nova pasta criada como myJavaPrograms
para entrar nela. A pasta deve estar vazia porque ainda no
salvamos nada dentro dela.

36
82
Na caixa de texto "Name", digite o nome do programa
(Hello.java), e depois clique no boto salvar.
Aps salvar o arquivo observe que o ttulo da janela mudou
de "Untitled" para "Hello.java", caso deseje alterar novamente o
arquivo basta edit-lo e depois salv-lo novamente clicando em
File Save.

Passo 5: Entrar na pasta que contm o programa

O prximo passo deve ser o de compilar o programa.


Inicialmente, precisamos entrar na pasta que o contm. Retorne
janela do terminal.

Em Linux:
Normalmente, quando abrimos uma janela terminal, ela vai
diretamente para sua pasta home (identificada por $). Para ver o
que tem dentro do diretrio digite ls (LS em minscula,
significando "List Sources") e pressione ENTER. Isso far com
que sejam listados os arquivos e pastas da pasta home.
Verifique a existncia de uma pasta chamada
"myJavaPrograms", criada a pouco, sendo esta o local em que foi
salvo o programa "Hello.java". Mudaremos o contexto para esta
pasta.
Para entrar nesta pasta devemos utilizar o comando: cd
[nome da pasta]. O comando "cd" significa "Change Directory".
Digitaremos:

$ cd myJavaPrograms

Agora que estamos dentro da pasta onde o arquivo do


programa est, poderemos ento compillo.
Certifique-se de que o arquivo est realmente dentro
desta, executando o comando ls (LS em minscula) novamente.

Passo 6: Compilar o programa

Para compilar o programa, utilizamos o comando: javac


[Nome do Arquivo]. Ou seja:

javac Hello.java

Durante a compilao, criado o arquivo: [Nome do


Arquivo].class, neste caso, Hello.class, que contm o cdigo
em linguagem de mquina (chamado de bytecode).

Passo 7: Executar o programa

Assumindo que no ocorreu problemas na compilao


(caso tenha ocorrido qualquer problema refaa os passos
realizados), estamos prontos para executar o programa.
Para executar o programa, utilizamos o comando: java
[nome do arquivo sem a extenso].
No caso do exemplo, digite:
37
82
java Hello

Veremos na mesma tela, em que foi executado o


comando, a seguinte mensagem:

Hello world!

5.2 Erros

Vimos um pequeno programa Java, geralmente no


encontraremos qualquer problema para compilar e executar
esses programas, entretanto nem sempre este o caso, como
mencionamos na primeira parte deste curso, ocasionalmente
encontramos erros durante esse processo.
Como mencionamos antes, h dois tipos de erros: o
primeiro pode ocorrer durante a compilao, chamado de erro de
sintaxe, o segundo pode ocorrer durante a execuo, chamado
runtime error.

5.2.1 Erros de Sintaxe

Os erros de sintaxe normalmente so erros de digitao,


ocasionados pelo programador que pode ter se equivocado e
digitar uma instruo errada, ou por esquecimento de alguma
parte da instruo, por exemplo, um ponto e vrgula. O
Compilador tenta isolar o erro exibindo a linha de instruo e
mostrando o primeiro caractere incorreto naquela linha,
entretanto, um erro pode no estar exatamente neste ponto.
Outros erros comuns so a troca de letras, troca de letras
maiscula por minscula (a linguagem Java completamente
case-sensitive, ou seja, o caractere "a" completamente
diferente do caractere "A", e o uso incorreto da pontuao.
Vamos retornar ao exemplo, o programa Hello.java.
Intencionalmente, escreveremos a palavrachave "static" de
forma errada e omitiremos o ponto-e-vrgula em uma instruo e
a deixaremos errada.

Salve o programa e execute os passos necessrios para


compil-lo. Observe a mensagem de erro gerada ao se tentar
compilar novamente o programa na imagem da pgina seguinte :

38
82
A primeira mensagem de erro sugere que existe um erro
na linha 6 do programa apontado para a palavra void, entretanto
esta palavra est correta. O erro na palavra anterior statict que
deve ser digitada como static.
A segunda mensagem de erro sugere que faltou um
ponto-e-vrgula na linha 10, entretanto, esta contm
simplesmente o comando de fechar o bloco do mtodo main. O
erro est exatamente na linha anterior.
Como regra, ao encontrar muitas mensagens de erros
devemos corrigir o primeiro erro da lista e tente novamente
compilar o programa. Deste modo reduziremos o nmero total de
mensagens de erro dramaticamente, pois podem existir o que
chamamos de erros derivados, ou seja, um erro que tem por
causa a instruo anterior.

5.2.2 Erros em tempo de execuo (Erros de run-time)

Os erros em tempo de execuo so erros que no


aparecero at que tentemos executar o programa. Os
programas so compilados com sucesso, mas apresentaro
respostas erradas, que podem ter como causa se o programador
no obedeceu uma lgica coerente ou no caso em erro de
estruturas do programa.

5.3. Usando NetBeans

Construmos o programa sem utilizar nenhum recurso


sofisticado, iremos aprender como fazer todo o processo da
seo anterior utilizando uma IDE.
Nesta parte da lio utilizaremos o NetBeans que um
Ambiente de Desenvolvimento Integrado ( I D E - I n t e g r a t e d
Development Environment).
Um ambiente de desenvolvimento integrado um
software aplicativo que possui uma interface construtora, um
editor de texto, um editor de cdigo, um compilador e/ou
interpretador e um depurador.

Passo 1 : executar o NetBeans

Para executar o NetBeans por intermdio da linha de


comando, abra uma janela terminal (Os passos para abrir a
janela terminal foram discutidos anteriormente) e digite:

39
82
Depois de abrir a
IDE NetBeans ser
mostrada a interface
grfica GUI,
conforme Figura.

Passo 2: construir o projeto

Clique em File
New Project, depois
de fazer isso, uma
janela de dilogo
aparecer. Neste
momento deve-se
clicar em "Java
Application" e em
seguida clicar no
boto "Next >".

Ser mostrada
uma nova janela de
dilogo, conforme
a figura.

40
82
Troque o local da
aplicao clicando
no boto
"Browse...".
Aparecer uma
janela de dilogo
para localizao
do diretrio. D
um clique duplo no
seu diretrio
home.

O contedo da
raiz do diretrio
ser
apresentado. D
um clique duplo
no diretrio
MYJAVAPROGR
AMS e depois d
um clique no
boto "Open".

Veja que a
localizao do
projeto mudou
para
/home/florence/M
YJAVAPROGRA
MS.
Finalmente, no
campo "Create
Main Class",
digite "Hello",
que ser o nome
da classe
principal, e em
seguida clique no
boto "Finish".

82
41
Passo 3: escrever os detalhes do programa

Antes de escrever o programa descreveremos a janela


principal.
Como mostrado na figura abaixo, automaticamente, o
NetBeans cria um cdigo bsico para o programa Java.
Poderemos adicionar as declaraes neste cdigo gerado. No
lado esquerdo da janela visualizamos uma lista de pastas e
arquivos que o NetBeans gerou antes de criar o projeto.
Tudo se encontra dentro da sua pasta
MYJAVAPROGRAMS, onde foi configurado o local do projeto. No
lado direito, visualizamos o cdigo gerado.

Modifique o cdigo gerado pelo NetBeans, por hora


ignoraremos as outras partes das instrues discutindo os
detalhes destas posteriormente. Insira a seguinte instruo:

System.out.println("Hello world!");

Isto significa que voc deseja que seja mostrada a


mensagem "Hello world!" na sada padro do computador, em
seguida seja feito um salto de linha. Poderamos substituir esta
instruo por duas equivalentes:

System.out.print("Hello");
System.out.println(" world!");

O mtodo print() faz com que no seja provocado o salto de


linha, utilizaremos para este exemplo a primeira instruo. Insira
esta instruo aps a linha de comentrio (que ser desprezada
pelo compilador):
82
42
//TODO code application logic here.

Passo 4 : compilar o projeto


Para compilar o programa, a partir do Menu Principal
selecione Build Build Main Project, ou utilize a tecla de atalho
F11, ou utilize o boto de atalho para compilar o cdigo.

43
Se no existir erros
no programa,
veremos a
mensagem de
sucesso na janela
de sada.

Passo 5: Executar o projeto

Para executar o
programa, clique
em Run Run
Main Project, ou
utilize a tecla de
atalho F6, ou
utilize o boto de
atalho para
executar o
programa.

O resultado final
do programa
ser mostrado
na janela de
sada.

82
44
Exerccios:

1. Baixe e instale no NetBeans no ambiente Windonws e Linux.


Teste alguns exemplos inclusive o Hello World
2. Melhore o Hello World. Utilizando o NetBeans crie uma classe
chamada [MeuNome], o programa dever mostrar como
resultado a mensagem: Welcome to Java Programming
[MeuNome]!!!
3. Utilizando o NetBeans, crie uma classe chamada TheTree. O
programa dever mostrar as seguintes linhas na sada:
Estou aprendendo a usar a IDE NetBeans
Minha produtividade vai melhorar
O desenvolvimento fica facilitado

Desafio:

Baixe da Internet e instale a IDE, bastante conhecida pelo


desenvolvedores Java, chamada Eclipse
http://www.eclipse.org/. Instale no ambiente Win ou Linux.
Execute o memo aplicativo Wello World. Descreva as
dificuldades de manipulao entre o Eclipse e o NetBeans.

45
6. ENTRADA E SADA DE DADOS

6.1. BufferedReader para capturar dados

Primeiramente, utilizaremos a classe BufferedReader do


pacote java.io para capturar dados de entrada atravs do teclado.
Passos para capturar os dados digitados, tomemos por base o
programa visto na lio anterior:
1. Digite a seguinte instruo no incio do programa:

import java.io.*;

2. Adicione as seguintes instrues no corpo do mtodo main:

BufferedReader dataIn = new BufferedReader(


new InputStreamReader(System.in));

3. Declare uma varivel temporria do tipo String para gravar os


dados digitados pelo usurio e chame o mtodo readLine() que
vai capturar linha por linha do que o usurio digitar. Isso dever
ser escrito dentro de um bloco try-catch para tratar possveis
excees.

try {
String temp = dataIn.readLine();
} catch (IOException e) {
System.out.println("Error in getting input");
}

Abaixo, segue o programa completo:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class GetInputFromKeyboard {
public static void main(String[] args) {
BufferedReader dataIn = new BufferedReader(new
InputStreamReader(System.in));
String name = "";
System.out.print("Please Enter Your Name:");
try {
name = dataIn.readLine();
} catch (IOException e) {
System.out.println("Error!");
}
System.out.println("Hello " + name +"!");
}
}

Faremos uma anlise deste programa linha por linha:


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
46
82
Estas linhas acima mostram que estamos utilizando as
classes BufferedReader, InputStreamReader e IOException
cada qual dentro do pacote java.io. Essas APIs ou Interfaces de
Programao de Aplicaes (Application Programming Interface)
contm centenas de classes pr-definidas que se pode usar nos
programas. Essas classes so
organizadas dentro do que chamamos de pacotes.
Pacotes contm classes que se relacionam com um
determinado propsito. No exemplo, o pacote java.io contm as
classes que permitem capturar dados de entrada e sada. Estas
linhas poderiam ser reescritas da seguinte forma:

import java.io.*;

que importar todas as classes encontradas no pacote java.io,


deste modo possvel utilizar todas classes desse pacote no
programa.
As prximas linhas:

public class GetInputFromKeyboard {


public static void main( String[] args ) {

j foram discutidas na lio anterior. Isso significa que


declaramos uma classe nomeada GetInputFromKeyboard e,
em seguida, iniciamos o mtodo principal (main).
Na instruo:

BufferedReader dataIn = new BufferedReader(new


InputStreamReader(System.in));

declaramos a varivel dataIn do tipo BufferedReader. No se


preocupe com o significado da sintaxe, pois ser abordado mais
frente.
A seguir, declaramos a varivel name do tipo String:

String name = "";

na qual armazenaremos a entrada de dados digitada pelo


usurio. Note que foi inicializada como uma String vazia "". uma
boa prtica de programao inicializar as variveis quando
declaradas.
Na prxima instruo, solicitamos que o usurio escreva um
nome:

System.out.print("Please Enter Your Name:");


As seguinte linhas definem um bloco try-catch:
try {
name = dataIn.readLine();
} catch (IOException e) {
System.out.println("Error!");
}

que asseguram, caso ocorram excees sero tratadas.

82
47
Falaremos sobre o tratamento de excees na ltima parte
deste curso. Por hora, necessrio adicionar essas linhas para
utilizar o mtodo readLine() e receber a entrada de dados do
usurio.

Em seguida:

name = dataIn.readLine();

capturamos a entrada dos dados digitados pelo usurio e as


enviamos para a varivel String criada anteriormente. A
informao guardada na varivel name.
Como ltima instruo:

System.out.println("Hello " + name + "!");

montamos a mensagem final para cumprimentar o usurio.

PRATICANDO!

Digite (retire no nmero das linhas, coloque a identao e


documentao) o programa abaixo e execute. Veja a forma de
dilogo. Observer a forma de converso de dados parseInt.

1. import javax.swing.*;
2.
3. public class InputTest
4. {
5. public static void main(String[] args)
6. {
7. // get first input
8. String name = JOptionPane.showInputDialog
9. ("What is your name?");
10.
11. // get second input
12. String input = JOptionPane.showInputDialog
13. ("How old are you?");
14.
15. // convert string to integer value
16. int age = Integer.parseInt(input);
17.
18. // display output on console
19. System.out.println("Hello, " + name +
20. ". Next year, you'll be " + (age + 1));
21.
22. System.exit(0);
23. }
24. }

48
82
6.2. Classe Scanner para capturar dados

Vimos uma maneira para obter dados de entrada atravs


do teclado. O JDK 5.0 lanou uma nova classe chamada
Scanner que engloba diversos mtodos para facilitar este
servio.
Abaixo, segue o programa completo utilizando esta
classe:

import java.util.Scanner;
public class GetInputFromScanner
{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Please Enter Your Name:");
String name = sc.next();
System.out.println("Hello " + name +"!");
}
}

Compare-o com o programa visto anteriormente.


Percebe-se que fica mais simples conseguir a mesma
funcionalidade.
Inicialmente, definimos a chamada ao pacote que contm
a classe Scanner:

import java.util.Scanner;

Em seguida, as instrues que define a classe e o mtodo main:

public class GetInputFromScanner


{
public static void main(String[] args) {

Definimos uma varivel, denominada sc, que ser criada


a partir da classe Scanner e direcionada para a entrada padro:

Scanner sc = new Scanner(System.in);

De forma semelhante, mostramos uma mensagem


solicitando informao do usurio:

System.out.println("Please Enter Your Name:");

Utilizamos a varivel sc para chamarmos o mtodo que


far o recebimento dos dados digitados:

String name = sc.nextLine();

A classe Scanner possui diversos mtodos que podem


ser utilizados para realizar este servio.
Os principais mtodos que podemos utilizar, neste caso,
so:
49
82
Por fim, mostramos o resultado e encerramos o mtodo
main e a classe:

System.out.println("Hello " + name +"!");


}
}

6.3. Utilizando a JOptionPane para receber dados

Um outro modo de receber os dados de entrada utilizar a


classe JOptionPane, que pertence ao pacote javax.swing. A
JOptionPane possui mtodos que conseguem criar caixas de
dilogo na qual o usurio pode informar ou visualizar algum
dado.
Dado o seguinte cdigo:

import javax.swing.JOptionPane;
public class GetInputFromKeyboard {
public static void main( String[] args ){
String name = "";
name = JOptionPane.showInputDialog("Please
enter your name");
String msg = "Hello " + name + "!";
JOptionPane.showMessageDialog(null, msg);
}
}

Essa classe apresentar o


seguinte resultado:

50
82
A primeira instruo:

import javax.swing.JOptionPane;

mostra que estamos importando a classe JOptionPane do


pacote javax.swing.
Poderamos, de forma semelhante, escrever estas
instrues do seguinte modo:

import javax.swing.*;

A instruo seguinte:

name = JOptionPane.showInputDialog("Please enter


your name");

cria uma caixa de entrada que exibir um dilogo com uma


mensagem, um campo de texto para receber os dados do
usurio e um boto OK, conforme mostrado na figura 1. O
resultado ser armazenado na varivel do tipo String name.
Na prxima instruo, criamos uma mensagem de
cumprimento, que ficar armazenada na varivel msg:

String msg = "Hello " + name + "!";

Finalizando a classe, exibiremos uma janela de dilogo


que conter a mensagem e o boto de OK, conforme mostrado
na figura pgina anterior.

JOptionPane.showMessageDialog(null, msg);

Exerccios:

1. Utilizando a classe BufferedReader ou Scanner, capture trs


palavras digitadas pelo usurio e mostre-as como uma nica
frase na mesma linha. Por exemplo:
Palavra 1: Meu nome
Palavra 2:
Palavra 3: Jesus
Sada : Meu nome Jesus

2. Utilizando a classe JOptionPane, capture palavras em trs


caixas de dilogos distintas e mostre-as como uma nica frase.
Por exemplo utilizaremos a figura da pgina a seguir :

51
3. Digite (sem nro de linha e identado), compile e execute o
programa abaixo. Estude o programa, diga o que faz e coloque
os comentrios em cada linha.

1. import javax.swing.*;
2.
3. public class SimpleFrameTest
4. {
5. public static void main(String[] args)
6. {
7. SimpleFrame frame = new SimpleFrame();
8. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
9. frame.show();
10. }
11. }
12.
13. class SimpleFrame extends JFrame
14. {
15. public SimpleFrame()
16. {
17. setSize(WIDTH, HEIGHT);
18. }
19.
20. public static final int WIDTH = 300;
21. public static final int HEIGHT = 200;
22. }

52
82
Unidade 2
Estruturas de controle

Resumo
Esta unidade tem como meta principal apresentar as
estruturas de controles bsicas como: desvios
condicionais simples (if/then) e compostos
(if/then/else), e repeties condicionais com teste no
incio (while/for) e no final (do/while) das estruturas da
programao Java. Estas estruturas so importantes
na especificao de algoritmos, pois de acordo com as
entradas o fluxo de execuo do algoritmo pode ser
alterado. O principal objetivo desta unidade trabalhar
com exemplos das estruturas de controle condicional
para desenvolver a capacidade de abstrao na
especificao dos algoritmos de acordo com os
problemas apresentados.
Sumrio

UNIDADE 2. ESTRUTURAS DE CONTROLE 53


07 Estruturas de Deciso: if-then-else, switch 56
08 Estruturas de Repetio: while, do-while, for 62
09 Estruturas de Interrupo: break, continue, return 69

54
82
7. ESTRUTURA DE CONTROLE DE DECISO IF-THEN-ELSE
SWITCH

Estruturas de controle de deciso so instrues em


linguagem Java que permitem que blocos especficos de cdigo Dicas de
sejam escolhidos para serem executados, redirecionando programao:
determinadas partes do fluxo do programa. 1. Expresso
lgica uma
7.1. Declarao if declarao que
possui um valor
A declarao if especifica que uma instruo ou bloco de lgico. Isso
instrues seja executado se, e somente se, uma expresso significa que
lgica for verdadeira. A declarao if possui a seguinte forma: a execuo desta
expresso deve
if (expresso_lgica) resultar em um
instruo; valor true ou false.
2. Coloque as
ou: instrues de
forma que elas
if (expresso_lgica) { faam parte do
instruo1; bloco if. Por
instruo2 exemplo:
... if
} (expresso_lgica
){
onde, expresso_lgica representa uma expresso ou varivel // instruo1;
lgica. // instruo2;
}

Instruo
Por exemplo, dado o trecho de cdigo: Simples

int grade = 68;


if (grade > 60) Stem.out.println (Congratulations!");

ou: Instrues
em Bloco
int grade = 68;
if (grade > 60) {
System.out.println("Congratulations!");
System.out.println("You passed!");
}

56
82
7.2. Declarao if-else

A declarao if-else usada quando queremos executar


determinado conjunto de instrues se a condio for verdadeira
e outro conjunto se a condio for falsa.
Possui a seguinte forma:

if (expresso_lgica)
instruo_caso_verdadeiro;
else
instruo_caso_falso;
Dicas de programao:
1. Para evitar confuso, Tambm podemos escrev-la na forma abaixo:
sempre coloque a
instruo ou instrues if (expresso_lgica) {
contidas no instruo_caso_verdadeiro1;
bloco if ou if-else entre instruo_caso_verdadeiro2;
chaves {}. ...
2. Pode-se ter } else {
declaraes if-else instruo_caso_falso1;
dentro de declaraes instruo_caso_falso2;
if-else, por exemplo: ...
if (expresso_lgica) { }
if (expresso_lgica) {
... Por exemplo, dado o trecho de cdigo:
}else {
... int grade = 68;
} if (grade > 60)
}else { System.out.println("Congratulations! You passed!");
... else
} System.out.println("Sorry you failed");

ou:

int grade = 68;


if (grade > 60) {
System.out.print("Congratulations! ");
System.out.println("You passed!");
} else {
System.out.print("Sorry ");
System.out.println("you failed");
}

57
82
7.3. Declarao if-else-if

A declarao else pode conter outra estrutura if-else. Este


cascateamento de estruturas permite ter decises lgicas muito
mais complexas.
A declarao if-else-if possui a seguinte forma:

if (expresso_lgica1)
instruo1;
else if(expresso_lgica2)
instruo2;
else
instruo3;

Podemos ter vrias estruturas else-if depois de uma


declarao if. A estrutura else opcional e pode ser omitida. No
exemplo mostrado acima, se a expresso_lgica1 verdadeira,
o programa executa a instruo1 e salta as outras instrues.
Caso contrrio, se a expresso_lgica1 falsa, o fluxo de
controle segue para a anlise da expresso_lgica2.

Se esta for verdadeira, o


programa executa a
instruo2 e salta a
instruo3. Caso
contrrio, se a
expresso_lgica2
falsa, ento a instruo3
executada.

Observe um exemplo da declarao if-else-if no seguinte trecho


de cdigo:

public class Grade {


public static void main( String[] args ) {
double grade = 92.0;
if (grade >= 90) {
System.out.println("Excellent!");
} else if((grade < 90) && (grade >= 80)) {
System.out.println("Good job!");
} else if((grade < 80) && (grade >= 60)) {
System.out.println("Study harder!");
} else {
System.out.println("Sorry, you
failed.");
}
}
58
82
}
7.4. Erros comuns na utilizao da declarao if

1. A condio na declarao if no avalia um valor lgico.


Por exemplo:

// ERRADO
int number = 0;
if (number) {
// algumas instrues aqui
}

a varivel number no tem valor lgico.

2. Usar = (sinal de atribuio) em vez de == (sinal de


igualdade) para comparao. Por exemplo:

// ERRADO
int number = 0;
if (number = 0) {
Notas: // algumas instrues aqui
1. Ao contrrio da }
declarao if,
mltiplas 3. Escrever elseif em vez de else if.
instrues so
executadas sem a // ERRADO
necessidade das int number = 0;
chaves que if (number == 0) {
determinam o // algumas instrues aqui
incio e trmino de } elseif (number == 1) {
bloco {}. // algumas instrues aqui
2. Quando um }
case for
selecionado, todas 7.5. Declarao switch
as instrues
vinculadas ao case Outra maneira de indicar uma condio atravs de uma
sero declarao switch. A construo switch permite que uma nica
executadas. Alm varivel inteira tenha mltiplas possibilidades de finalizao.
disso, as A declarao switch possui a seguinte forma:
instrues dos
case seguintes switch (varivel_inteira) {
tambm sero case valor1:
executadas. instruo1; //
3. Para prevenir instruo2; // bloco 1
que o programa ... //
execute instrues break;
dos outros case case valor2:
subseqentes, instruo1; //
utilizamos a instruo2; // bloco 2
declarao break ... //
aps a ltima break;
instruo de cada default:
case. instruo1 ; //
instruo2; // bloco n
... //
break;
} 59
82
onde, varivel_inteira uma varivel de tipo byte, short, char ou int.
valor1, valor2, e assim por diante, so valores constantes que esta
varivel pode assumir.
Quando a declarao switch encontrada, o fluxo de
controle avalia inicialmente a varivel_inteira e segue para o case
que possui o valor igual ao da varivel. O programa executa todas
instrues a partir deste ponto, mesmo as do prximo case, at
encontrar uma instruo break, que interromper a execuo do
switch.
Se nenhum dos valores case for satisfeito, o bloco default
ser executado. Este um bloco opcional. O bloco default no Dicas de
obrigatrio na declarao switch. Programao:
1. A deciso entre
usar uma declarao
if ou switch
subjetiva. O
programador
pode decidir com
base na facilidade de
entendimento do
cdigo, entre outros
fatores.
2. Uma declarao if
pode ser usada para
decises
relacionadas a
conjuntos,
escalas de variveis
ou condies,
enquanto que a
declarao switch
pode ser utilizada
para situaes que
envolvam varivel do
tipo inteiro. Tambm
necessrio que o
7.6. Exemplo para switch valor de cada
clusula case seja
public class Grade { nico, subseqentes,
public static void main(String[] args) { utilizamos a
int grade = 92; declarao break
switch(grade) { aps a ltima
case 100: instruo de cada
System.out.println("Excellent!"); case.
break;
case 90:
System.out.println("Good job!");
break;
case 80:
System.out.println("Study harder!");
break;
default:
System.out.println("Sorry, you failed.");

}
60
82
Compile e execute o programa acima e veremos que o
resultado ser:
Sorry, you failed.

pois a varivel grade possui o valor 92 e nenhuma das opes


case atende a essa condio.
Note que para o caso de intervalos a declarao if-else-if
mais indicada.

Exerccios:

1. Obtenha do usurio trs notas de exame e calcule a mdia


dessas notas. Reproduza a mdia dos trs exames. Junto com a
mdia, mostre tambm um :-) no resultado se a mdia for maior
ou igual a 60; caso contrrio mostre :-(
Faa duas verses deste programa:
a) Use a classe BufferedReader (ou a classe Scanner) para obter
as notas do usurio, e System.out para mostrar o resultado.
b) Use JOptionPane para obter as notas do usurio e para
mostrar o resultado.
2. Solicite ao usurio para digitar um nmero, e mostre-o por
extenso. Este nmero dever variar entre 1 e 10. Se o usurio
introduzir um nmero que no est neste intervalo, mostre:
"nmero invlido".
Faa duas verses deste programa:
a) Use uma declarao if-else-if para resolver este problema
b) Use uma declarao switch para resolver este problema

3. Escreva um programa para calcular o valor da fatura do


consumo de energia eltrica. O programa tem como entrada o
consumo em Kilo Watt ms. O valor da conta calculado
baseado na faixa de consumo progressivo:
a) de 1 a 50 Kw, computa-se R$ 0,50 por Kw consumido
b) de 51 a 100 Kw, computa-se R$ 1,00
c) de 101 a 150 Kw, computa-se R$ 2,00
d) acimda de 150 Kw, computa-se R$ 3,00
Por exemplo: Um consumo de 157 Kw/ms gera uma fatura de:
(50 x 0,50) + (50 x 1,00) + (50 x 2,00) + (7 x 3,00) = R$ 196,00

Desafio

O que faz o program abaixo? O que imprime como sada?


public class Mystery {
public static void main( String args[] ) {
int y, x = 1, total = 0;
while ( x <= 10 ) {
y = x * x;
System.out.println( y );
total += y;
++x;
}
System.out.println( "Total is " + total );
}
}
82
61
8. ESTRUTURA DE CONTROLE DE REPETIO: WHILE, DO-
WHILE, FOR

8.1. Estruturas de controle de repetio

Estruturas de controle de repetio so comandos em


linguagem Java que permitem executar partes especficas do
cdigo determinada quantidade de vezes. Existem 3 tipos de
estruturas de controle de repetio: while, do-while e for.
A figura abaixo apresenta a anatomia de um program em
Java com os elementos mais relevantes da linguagem. Em geral
a maioria da aplicaes em Java so baseadas neste modelo.

8.2. Declarao while

A declarao while executa repetidas vezes um bloco de


instrues enquanto uma determinada condio lgica for
verdadeira.

A declarao while possui a seguinte


forma:

while (expresso_lgica) {
instruo1;
instruo2;
...
}

62
82
As instrues contidas dentro do bloco while so executadas
repetidas vezes enquanto o valor de expresso_lgica for
verdadeira.

Por exemplo, dado o trecho de cdigo:

int i = 4;
while (i > 0){
System.out.print(i);
i--;
}

O cdigo acima ir imprimir 4321 na tela. Se a linha


contendo a instruo i-- for removida, teremos uma repetio
infinita, ou seja, um cdigo que no termina. Portanto, ao usar
laos while, ou qualquer outra estrutura de controle de repetio,
tenha a certeza de utilizar uma estrutura de repetio que
encerre em algum momento.

PRATICANDO!

Digite os exemplos abaixo e observe como funciona a


instruo while em diversar formas. Lembre-se da anatomia de
um cdigo em Java.

Exemplo 1:

int x = 0;
while (x<10) {
System.out.println(x);
x++;
}

Exemplo 2:

// lao infinito
while (true)
System.out.println("hello");

Exemplo 3:

// a instruo do lao no ser executada


while (false)
System.out.println("hello");

8.3. Declarao do-while

A declarao do-while similar ao while. As instrues


dentro do lao do-while sero executadas pelo menos uma vez.

63
A declarao do-while possui a seguinte forma:
do {
instruo1;
instruo2;
...
} while (expresso_lgica);

Inicialmente, as instrues dentro do lao do-while so


executadas. Ento, a condio na expresso_lgica avaliada.
Se for verdadeira, as instrues dentro do lao do-while sero
executadas novamente.
A diferena entre uma declarao while e do-while que,
no lao while, a avaliao da expresso lgica feita antes de se
executarem as instrues nele contidas enquanto que, no lao
do-while, primeiro se executam as instrues e depois realiza-se
a avaliao da expresso lgica, ou seja, as instrues dentro em
um lao do-while so executadas pelo menos uma vez.

PRATICANDO!
Dicas de
Experimente executar os trechos de cdigo abaixo. programao:
Analise o que ocorre. 1. Erro comum de
programao ao
Exemplo 1: utilizar o lao do-
int x = 0; while esquecer o
do { ponto-evrgula
System.out.println(x); (;) aps a declarao
x++; while.
} while (x<10); do {
...
Este exemplo ter 0123456789 escrito na tela. } while
(boolean_expression)
Exemplo 2: // ERRADO -> faltou;
// lao infinito 2. Como visto para a
do { declarao while,
System.out.println("hello"); tenha certeza que a
} while(true); declarao do-while
poder terminar em
Exemplo 3: algum momento.
// Um lao executado uma vez
do
System.out.println(hello);
while (false);
64
82
O exemplo anterior mostrar a palavra hello escrita na
tela infinitas vezes.

8.4. Declarao for

A declarao for, como nas declaraes anteriores,


permite a execuo do mesmo cdigo uma quantidade
determinada de vezes.

A declarao for possui a seguinte forma:

for (declarao_inicial; expresso_lgica; salto) {


instruo1;
instruo2;
...
}

onde:

declarao_inicial inicializa uma varivel para o lao


expresso_lgica compara a varivel do lao com um
valor limite
salto atualiza a varivel do lao

Um exemplo para a declarao for :

for (int i = 0; i < 10; i++) {


System.out.print(i);
}

Neste exemplo, uma varivel i, do tipo int, inicializada


com o valor zero. A expresso lgica "i menor que 10"
avaliada. Se for verdadeira, ento a instruo dentro do lao
executada. Aps isso, a expresso i ter seu valor adicionado
em 1 e, novamente, a condio lgica ser avaliada. Este
processo continuar at que a condio lgica tenha o valor
falso.

65
82
Este mesmo exemplo, utilizando a declarao while,
mostrado abaixo:

int i = 0;
while (i < 10) {
System.out.print(i);
i++;
}

PRATICANDO!

1.Modifique o programa abaixo com a estrutura for para


incrementar e decrementar valores de c.

// Increment.java
public class Increment {
// main method begins execution of Java application
public static void main( String args[] )
int c;
c = 5;
System.out.println( c ); // print 5
System.out.println( c++ ); // print 5 then postincrement
System.out.println( c ); // print 6
System.out.println(); // skip a line
c = 5;
System.out.println( c ); // print 5
System.out.println( ++c ); // preincrement then print 6
System.out.println( c ); // print 6
} // end method main
} // end class Increment

66
82
2. Digite o programa abaixo e estude com ele funciona. Remove
nos nro de linha e faa a identao do cdigo

1 // Average2.java
2 // Class average program with sentinel-controlled repetition.
3
4
// Java core packages
5 import java.text.DecimalFormat;
67
// Java extension packages
8 import javax.swing.JOptionPane;
9
10 public class Average2 {
11
12 // main method begins execution of Java application
13 public static void main( String args[] )
14 {
15 int gradeCounter, // number of grades entered
16 gradeValue, // grade value
17 total; // sum of grades
18 double average; // average of all grades
19 String input; // grade typed by user
20
21 // Initialization phase
22 total = 0; // clear total
23 gradeCounter = 0; // prepare to loop
24
25 // Processing phase
26 // prompt for input and read grade from user
27 input = JOptionPane.showInputDialog(
28 "Enter Integer Grade, -1 to Quit:" );
29
30 // convert grade from a String to an integer
31 gradeValue = Integer.parseInt( input );
32
33 while ( gradeValue != -1 ) {
34
35 // add gradeValue to total
36 total = total + gradeValue;
37
38 // add 1 to gradeCounter
39 gradeCounter = gradeCounter + 1;
40
41 // prompt for input and read grade from user
42 input = JOptionPane.showInputDialog(
43 "Enter Integer Grade, -1 to Quit:" );
44
45 // convert grade from a String to an integer
46 gradeValue = Integer.parseInt( input );
47 }
48
49 // Termination phase
50 DecimalFormat twoDigits = new DecimalFormat( "0.00" );
51
52 if ( gradeCounter != 0 ) {
53 average = (double) total / gradeCounter;
54
55 // display average of exam grades
56 JOptionPane.showMessageDialog( null,
57 "Class average is " + twoDigits.format( average ),
58 "Class Average", JOptionPane.INFORMATION_MESSAGE );
59 }
60 else
61 JOptionPane.showMessageDialog( null,
62 "No grades were entered", "Class Average",
63 JOptionPane.INFORMATION_MESSAGE );
64
65 System.exit( 0 ); // terminate application
66
67 } // end method main
68
69 } // end class Average2

67
82
Exerccios:

1. Crie um programa que mostre seu nome cem vezes. Faa trs
verses deste programa:
a) Use uma declarao while para resolver este problema
b) Use uma declarao do-while para resolver este problema
c) Use uma declarao for para resolver este problema

2. Receba como entrada um nmero e um expoente. Calcule este


nmero elevado ao expoente. Faa trs verses deste programa:
a) Use uma declarao while para resolver este problema
b) Use uma declarao do-while para resolver este problema3. c)
Use uma declarao for para resolver este problema

3. O que o programa abaixo faz:

// Faz algo
public class Calculate {
public static void main( String args[] )
{
int sum, x;
x = 1;
sum = 0;
while ( x <= 10 ) {
sum += x;
++x;
}
System.out.println( "The sum is: " + sum );
}
}

Desafio

Encontre e faa a devida correo dos erros em cada um dos fragmentos de cdigo
abaixo.

// Cod A // Cod B // Cod C imprime valores de 1 a 10


x = 1; switch ( n ) { n = 1;
while ( x <= 10 ); case 1: while ( n < 10 )
x++; System.out.println( "The number is 1" ); System.out.println( n++ );
} case 2:
System.out.println( "The number is 2" );
break; // Cod D
default: for ( y = .1; y != 1.0; y += .1 )
System.out.println( "The number is not 1 or 2" ); System.out.println( y );
break;
}

68
82
9. ESTRUTURA DE CONTROLE DE INTERRUPO: BREAK,
CONTINUE E RETURN

9.1. Declaraes de Interrupo

Declaraes de interrupo permitem que redirecionemos


o fluxo de controle do programa. A linguagem Java possui trs
declaraes de interrupo. So elas: break, continue e return.

9.2. Declarao break

A declarao break possui duas formas: unlabeled (no


identificada - vimos esta forma com a declarao switch) e
labeled (identificada).

9.2.1. Declarao unlabeled break

A forma unlabeled de uma declarao break encerra a


execuo de um switch e o fluxo de controle transferido
imediatamente para o final deste. Podemos tambm utilizar a
forma para terminar declaraes for, while ou do-while.
Por exemplo:

String names[] = {"Beah", "Bianca", "Lance", "Belle",


"Nico", "Yza", "Gem", "Ethan"};
String searchName = "Yza";
boolean foundName = false;
for (int i=0; i < names.length; i++) {
if (names[i].equals(searchName)) {
foundName = true;
break;
}
}
if (foundName) {
System.out.println(searchName + " found!");
} else {
System.out.println(searchName + " not found.");
}
Neste exemplo, se a String Yza for encontrada, a
declarao for ser interrompida e o controle do programa ser
transferido para a prxima instruo abaixo da declarao for.

9.2.2. Declarao labeled break

A forma labeled de uma declarao break encerra o


processamento de um lao que identificado por um label
especificado na declarao break.
Um label, em linguagem Java, definido colocando-se
um nome seguido de dois-pontos, como por exemplo:

teste:

esta linha indica que temos um label com o nome teste.

69
82
O programa a seguir realiza uma pesquisa de um
determinado valor em um array bidimensional. Dois laos so
criados para percorrer este array. Quando o valor encontrado,
um labeled break termina a execuo do lao interno e retorna o
controle para o lao mais externo.

int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};


int searchNum = 5;
searchLabel: for (int i=0; i<numbers.length; i++) {
for (int j=0; j<numbers[i].length; j++) {
if (searchNum == numbers[i][j]) {
foundNum = true;
break searchLabel;
}
} // final do lao j
} // final do lao i
if (foundNum) {
System.out.println(searchNum + " found!");
} else {
System.out.println(searchNum + " not found!");
}

A declarao break, ao terminar a declarao for, no


transfere o controle do programa ao final de seu lao, controlado
pela varivel j. O controle do programa segue imediatamente
para a declarao for marcada com o label, neste caso,
interrompendo o lao controlado pela varivel i.

9.3. Declarao continue

A declarao continue tem duas formas: unlabeled e


labeled. Utilizamos uma declarao continue para saltar a
repetio atual de declaraes for, while ou do-while.

9.3.1. Declarao unlabeled continue

A forma unlabeled salta as instrues restantes de um


lao e avalia novamente a expresso lgica que o controla.
O exemplo seguinte conta a quantidade de vezes que a
expresso "Beah" aparece no array.

String names[] = {"Beah", "Bianca", "Lance", "Beah"};


int count = 0;
for (int i=0; i < names.length; i++) {
if (!names[i].equals("Beah")) {
continue; // retorna para a prxima condio
}
count++;
}
System.out.println(count + " Beahs in the list");

70
82
9.3.2. Declarao labeled continue

A forma labeled da declarao continue interrompe a


repetio atual de um lao e salta para a repetio exterior
marcada com o label indicado.

outerLoop: for (int i=0; i<5; i++) {


for (int j=0; j<5; j++) {
System.out.println("Inside for(j) loop"); //
mensagem1
if (j == 2)
continue outerLoop;
}
System.out.println("Inside for(i) loop"); // mensagem2
}

Neste exemplo, a mensagem 2 nunca ser mostrada,


pois a declarao continue outerloop interromper este lao
cada vez que j atingir o valor 2 do lao interno.

9.4. Declarao return

A declarao return utilizada para sair de um mtodo. O


fluxo de controle retorna para a declarao que segue a
chamada do mtodo original. A declarao de retorno possui
dois modos: o que retorna um valor e o que no retorna nada.
Para retornar um valor, escreva o valor (ou uma
expresso que calcula este valor) depois da palavra chave
return. Por exemplo:

return ++count;
ou
return "Hello";

Os dados so processados e o valor devolvido de


acordo com o tipo de dado do mtodo.
Quando um mtodo no tem valor de retorno, deve ser
declarado como void. Use a forma de
return que no devolve um valor. Por exemplo: return;

Abordaremos as declaraes return nas prximas lies,


quando falarmos sobre mtodos.

71
PRATICANDO!

Digite o programa abaixo. Veja que brincadeira legal com o uso


do continue.

Exerccios:

1. Execute o programa abaixo. Se faz o lao de 1 a 10 vezes,


porque imprime somente at 5? Faa o teste passo a passo no
algoritmo.

// BreakTeste.java
// Lao 10 vezes
import javax.swing.JOptionPane;
public class BreakTest {
public static void main( String args[] ) {
String output = "";
int count;
for ( count = 1; count <= 10; count++ ) {
if ( count == 5 )
break;
output += count + " ";
}
output += "\nLao = " + count;
JOptionPane.showMessageDialog( null, output );
System.exit( 0 );
}
}

82
72
2. Execute o programa abaixo. Faz-se o lao at de 1 a 9 vezes, o
que ser impresso? Faa o teste passo a passo no algoritmo.

// ContinueTest.java
import
javax.swing.JOptionPane;
public class ContinueTest {
public static void
main( String args[] ) {
String output = "";
for ( int count = 1; count
<= 10; count++ ) {
if ( count == 5 )
continue;
output += count + " ";
}

73
82
Unidade 3
Arranjos e Argumentos

Resumo
Esta unidade tratar a forma de se ter acesso a
conjunto de dados agrupados em um programa Java,
atravs do estudo de arranjos homogneos e
heterogneos elementares, destacando-se exemplos
com vetores, matrizes. Argumentos tambm so
apresentados como forma de transferncia de dados
para os aplicativos. O principal objetivo conhecer as
estruturas de dados bsicas constantes nos
programas e saber empreg-las no memento da
especificao do modo que o cdigo fique mais claro e
otimizvel.

75
82
Sumrio

UNIDADE 3. ARRANJOS E ARGUMENTOS 75


10 Arranjos em Java 77
11 Argumentos em Java 83

76
82
10 ARRAY EM JAVA

10.1. Introduo a Array

Em lies anteriores, discutimos como declarar diferentes


variveis usando os tipos de dados primitivos. Na declarao de
variveis, freqentemente utilizamos um identificador ou um
nome e um tipo de dados. Para se utilizar uma varivel, deve-se
cham-la pelo nome que a identifica.
Por exemplo, temos trs variveis do tipo int com
diferentes identificadores para cada varivel:

int number1;
int number2;
int number3;

number1 = 1;
number2 = 2;
number3 = 3;

Como se v, inicializar e utilizar variveis pode torna-se


uma tarefa tediosa, especialmente se elas forem utilizadas para
o mesmo objetivo. Em Java, e em outras linguagens de
programao, pode-se utilizar uma varivel para armazenar e
manipular uma lista de dados com maior eficincia. Este tipo de
varivel chamado de array.

Um array armazena mltiplos itens de um mesmo tipo de


dado em um bloco contnuo de memria, dividindo-o em certa
quantidade de posies. Imagine um array como uma varivel
esticada que tem um nome que a identifica e que pode conter
mais de um valor para esta mesma varivel.

10.2. Declarando Array

Array precisa ser declarados como qualquer varivel. Ao


declarar um array, defina o tipo de dados deste seguido por
colchetes [] e pelo nome que o identifica.

Por exemplo:

int [] ages;

ou colocando os colchetes depois do identificador. Por exemplo:

int ages[];

82
77
Depois da declarao, precisamos criar o array e
especificar seu tamanho. Este processo chamado de
construo (a palavra, em orientao a objetos, para a criao
de objetos). Para se construir um objeto, precisamos utilizar um
construtor. Por exemplo:

// declarao
int ages[];
// construindo
ages = new int[100];

ou, pode ser escrito como:

// declarar e construir
int ages[] = new int[100];

No exemplo, a declarao diz ao compilador Java que o


identificador ages ser usado como um nome de um array
contendo inteiros, usado para criar, ou construir, um novo array
contendo 100 elementos.
Em vez de utilizar uma nova linha de instruo para
construir um array, tambm possvel automaticamente
declarar, construir e adicionar um valor uma nica vez.
Exemplos:

// criando um array de valores lgicos em uma varivel


// results. Este array contm 4 elementos que so
// inicializados com os valores {true, false, true, false}
boolean results[] ={ true, false, true, false };
// criando um array de 4 variveis double inicializados
// com os valores {100, 90, 80, 75};
double []grades = {100, 90, 80, 75};
// criando um array de Strings com identificador days e
// tambm j inicializado. Este array contm 7 elementos
S t r i n g d a y s [ ] =
{"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};

Uma vez que tenha sido inicializado, o tamanho de um


array no pode ser modificado, pois armazenado em um bloco
contnuo de memria.

10.3. Acessando um elemento do Array

Para acessar um elemento do array, ou parte de um array,


utiliza-se um nmero inteiro chamado de ndice.
Um ndice atribudo para cada membro de um array,
permitindo ao programa e ao programador acessar os valores
individualmente quando necessrio. Os nmeros dos ndices
so sempre inteiros. Eles comeam com zero e progridem
seqencialmente por todas as posies at o fim do array.
Lembre-se que os elementos dentro do array possuem ndice de
0 a tamanhoDoArray-1.

78
82
Por exemplo, dado o array ages que declaramos
anteriormente, temos:

// atribuir 10 ao primeiro elemento do array Dicas de


ages[0] = 10; programao:
1. Normalmente,
// imprimir o ltimo elemento do array melhor inicializar, ou
System.out.print(ages[99]); instanciar, um array
logo aps declar-
Lembre-se que o array, uma vez declarado e construdo, lo.
ter o valor de cada membro inicializado automaticamente. Por exemplo, a
Conforme a seguinte tabela: instruo:
int []arr = new
int[100];
prefervel, ao
invs de:
int [] arr;
arr = new int[100];
2. Os elementos de
um array de n
elementos tem
ndices de 0 a n-1.
Note que no
Entretanto, tipos de dados por referncia, como as existe o elemento
Strings, no sero inicializados caracteres em branco ou com arr[n]. A tentativa de
uma string vazia "", sero inicializados com o valor null. Deste acesso a este
modo, o ideal preencher os elementos do arrays de forma elemento causar
explcita antes de utiliz-los. A manipulao de objetos nulos uma
pode causar a desagradvel surpresa de uma exceo do tipo exceo do tipo
NullPointerException, por exemplo, ao tentar executar algum ArrayIndexOutOfB
mtodo da classe String, conforme o exemplo a seguir: oundsException,
pois o ndice deve
public class ArraySample { ser
public static void main(String[] args){ at n-1.
String [] nulls = new String[2]; 3. No possvel
System.out.print(nulls[0]); modificar o tamanho
// Linha correta, mostra null de um array.
System.out.print(nulls[1].trim());
// Causa erro
}
}

O cdigo abaixo utiliza uma declarao for para mostrar


todos os elementos de um array.

public class ArraySample {


public static void main(String[] args){
int[] ages = new int[100];
for (int i = 0; i < 100; i++) {
System.out.print(ages[i]);
}
}
}
79
82
10.4. Tamanho de Array
Dicas de
programao: Para se obter o nmero de elementos de um array, pode-
1. Quando criar laos se utilizar o atributo length. O atributo length de um array retorna
com for para o seu tamanho, ou seja, a quantidade de elementos.
processamento de um utilizado como no cdigo abaixo:
array, utilize o campo
length como nomeArray.length
argumento da
expresso lgica. Isto Por exemplo, dado o cdigo anterior, podemos reescrev-
ir permitir ao lao lo como:
ajustarse,
automaticamente para public class ArraySample {
tamanhos de public static void main (String[] args) {
diferentes arrays. int[] ages = new int[100];
2. Declare o tamanho for (int i = 0; i < ages.length; i++) {
dos arrays utilizando System.out.print(ages[i]);
variveis do tipo }
constante para facilitar }
alteraes posteriores. }
Por exemplo:
final int ARRAY_SIZE 10.5. Arrays Multidimensionais
= 1000; // declarando
uma constante Arrays multidimensionais so implementados como arrays
... dentro de arrays. So declarados ao atribuir um novo conjunto de
int[] ages = new colchetes depois do nome do array. Por exemplo:
int[ARRAY_SIZE];
// array inteiro de 512 x 128 elementos
int [][] twoD = new int[512][128];

// array de caracteres de 8 x 16 x 24
char [][][] threeD = new char[8][16][24];

// array de String de 4 linhas x 2 colunas


String [][] dogs = {{"terry", "brown"},
{"Kristin", "white"},
{"toby", "gray"},
{"fido", "black"}};

Acessar um elemento em um array multidimensional


semelhante a acessar elementos em um array de uma dimenso.
Por exemplo, para acessar o primeiro elemento da primeira linha
do array dogs, escreve-se:

System.out.print(dogs[0][0]);

Isso mostrar a String "terry" na sada padro. Caso queira


mostrar todos os elementos deste array, escreve-se:

for (int i = 0; i < dogs.length; i++) {


for (int j = 0; j < dogs[i].length; j++) {
System.out.print(dogs[i][j] + " ");
}
} 80
82
EXERCCIOS

1. Criar um array de Strings inicializado com os nomes dos sete


dias da semana. Por exemplo:

String days[] = {"Monday", "Tuesday", "Wednesday",


"Thursday", "Friday", "Saturday", "Sunday"};

Usando uma declarao while, imprima todo o contedo do array.


Faa o mesmo para as declaraes do-while e for.

2. Usando as classes BufferedReader, Scanner ou


JOptionPane, solicite 10 nmeros ao usurio. Utilize um array
para armazenar o valor destes nmeros. Mostre o nmero de
maior valor.

3. Dado o seguinte array multidimensional, que contm as


entradas da agenda telefnica:

String entry = {{"Florence", "735-1234", "Manila"},


{"Joyce", "983-3333", "Quezon City"},
{"Becca", "456-3322", "Manila"}};

mostre-as conforme o formato abaixo:

Name : Florence
Tel. # : 735-1234
Address: Manila

Name : Joyce
Tel. # : 983-3333
Address: Quezon City

Name : Becca
Tel. # : 456-3322
Address: Manila

DESAFIOS:

1. O programa abaixo ler os argumentos na linha de comando e


coloca no array de args. Altere o programa abaixo para mostrar as
opes disponveis caso o usurio entre com argumentos
invlidos.
public class Comand {
public static void main(String[] args) {
if (args[0].equals("-h"))
System.out.print("Help,");
else if (args[0].equals("-g"))
System.out.print("Go to do,");
for (int i = 1; i < args.length; i++)
System.out.print(" " + args[i]);
System.out.println("!");
}
}

82
81
2. Escreva um programa para ler um conjuto de elementos,
armazenar em arrays, classificar em ordem crescente e imprimir
os elementos do array.

82
11 ARGUMENTOS EM JAVA

11.1. Argumentos de linha de comando

Uma aplicao em Java aceita qualquer quantidade de


argumentos passados pela linha de comando. Argumentos de
linha de comando permitem ao usurio modificar a operao de
uma aplicao a partir de sua execuo. O usurio insere os
argumentos na linha de comando no momento da execuo da
aplicao. Deve-se lembrar que os argumentos de linha de
comando so especificados depois do nome da classe a ser
executada.
Por exemplo, suponha a existncia de uma aplicao
Java, chamada Sort, que ordena cinco nmeros que sero
recebidos. Essa aplicao seria executada da seguinte maneira:

java Sort 5 4 3 2 1

Lembre-se que os argumentos so separados por


espaos.
Em linguagem Java, quando uma aplicao executada,
o sistema repassa os argumentos da linha de comando para a o
mtodo main da aplicao atravs de um array de String. Cada
elemento deste array conter um dos argumentos de linha de
comando passados. Lembre-se da declarao do mtodo main:

public static void main(String[] args) {


}

Os argumento que so passados para o programa so


Dicas de
salvos em um array de String com o identificador args. No
programao:
exemplo anterior, os argumentos de linha de comando passados
1. Antes de usar
para a aplicao Sort estaro em um array que conter cinco
os argumentos de
strings: "5", "4", "3", "2" e "1". possvel conhecer o nmero de
linha de comando,
argumentos passados pela linha de comando utilizando-se o
observe a
atributo length do array.
quantidade de
Por exemplo:
argumentos
passados para a
int numberOfArgs = args.length;
aplicao. Deste
modo, nenhuma
Se o programa precisa manipular argumento de linha de
exceo ser
comando numrico, ento, deve-se converter o argumento do
disparada.
tipo String, que representa um nmero, assim como "34", para
um nmero. Aqui est a parte do cdigo que converte um
argumento de linha de comando para inteiro:

int firstArg = 0;
if (args.length > 0) {
firstArg = Integer.parseInt(args[0]);
}

83
parseInt dispara uma exceo do tipo
NumberFormatException se o contedo do elemento arg[0]
no for um nmero.

11.2. Argumentos de linha de comando no NetBeans

Para ilustrar a passagem de alguns argumentos para um


projeto no NetBeans, vamos criar um projeto em Java que
mostrar na tela o nmero de argumentos e o primeiro
argumento
passado.

public class CommandLineExample {


public static void main( String[] args ) {
System.out.println(
"Number of arguments=" + args.length);
System.out.println(
"First Argument="+ args[0]);
}
}

PRATICANDO!

Abra o NetBeans, crie um novo projeto e d o nome de


CommandLineExample. Copie o cdigo mostrado
anteriormente e o compile. Em seguida, siga estas etapas para
passar argumentos para o programa, utilizando o NetBeans.

84
D um clique com o boto direito do mouse no cone
CommandLineExample, conforme destacado na Figura acima.
Um menu aparecer, conforme a Figura da pgina seguinte.
Selecione a opo
"Properties".

A janela "Project Properties" ir aparecer, conforme a


Figura abaixo:

Acesse a opo Run ? Running Project.

85
Na caixa de texto dos argumentos, digite os argumentos
que se quer passar para o programa. Neste caso, digitamos os
argumentos 5 4 3 2 1. Pressione o boto OK.

86
Execute o projeto.

Como pode-se ver, a sada do projeto a quantidade de


argumentos, que 5, e o primeiro argumento passado, que
tambm 5.

87
EXERCCIOS

1. Utilizando os dados passados pelo usurio atravs dos


argumentos de linha de comando, exiba os argumentos
recebidos. Por exemplo, se o usurio digitar:

java Hello world that is all

o programa dever mostrar na tela:

world
that
is
all

2. Obtenha dois nmeros, passados pelo usurio usando


argumentos de linha de comando, e mostre o resultado da
soma, subtrao, multiplicao e diviso destes nmeros. Por
exemplo, se o usurio digitar:

java ArithmeticOperation 20 4

o programa dever mostrar na tela:

sum = 24
subtraction = 16
multiplication = 80
division = 5

DESAFIO

Altere o programa abaixo para receber os parmetros atravs


da linha de comando.

import javax.swing.*;
public class InputArgs {
public static void
main(String[] args) {
String name =
JOptionPane.showInputDialog
("What is your name?");
String input =
JOptionPane.showInputDialog
("How old are you?");
int age =
Integer.parseInt(input);
System.out.println("Hello,
" + name +

88
Unida de 4
Paradigma de
programao Orientada a
Objetos

Resumo
Esta unidade tem como meta apresentar os fundamentos do
paradigma de programao orientada a objetos. Aborda o tema,
caracterizando com exemplos uma linguagem orientada a
objetos com Java. Apresentar os elementos inerentes como
classes, objetos e mtodos. Mostra com exemplos,
caractersticas que podem ser exploradas como herana
polimorfismo e interface. Apresenta ainda com feito o
tratamento de excees em linguagem OO como Java. So
apresentados exemplos ilustrativos, exerccios propostos a
serem vencidos pelos aprendizes. O objetivo conhecer
fundamentalmente os recursos de programao orientada por
objetos como uma ferramenta poderosa que pode gerar cdigos
sofisticados e complexos. Nesta unidade o aprendiz ter a
oportunidade a implementar os algoritmos de seu interesse
usando a linguagem Java, para solidificar os conhecimentos
adquiridos nas sub-unidades anteriores.
89
Sumriol

UNIDADE 4. PARADIGMA DE PROGRAMAO


ORIENTADA A OBJETOS 89
12 Classes, Objetos e Mtodos 91
13 Definio de Classe em Java 107
14 Herana, Polimorfismo e Interface 125
15 Tratamento e Excees em Java 138

90
12. CLASSES, OBJETOS E MTODOS

12.1. Introduo Programao Orientada a Objeto

Programao Orientada a Objetos (POO) refere-se ao


conceito de objetos como elemento bsico das classes. O
mundo fsico constitudo por objetos tais como carro, leo,
pessoa,
dentre outros. Estes objetos so caracterizados pelas suas
propriedades (ou atributos) e seus comportamentos.
Por exemplo, um objeto "carro" tem as propriedades, tipo
de cmbio, fabricante e cor. O seu comportamento pode ser
'virar', 'frear' e 'acelerar'. Igualmente, podemos definir diferentes
propriedades e comportamentos para um leo. Veja exemplos na
Tabela abaixo:

Com tais descries, os objetos do mundo fsico podem


ser facilmente modelados como objetos de software usando as
propriedades como atributos e os comportamentos como
mtodos. Estes atributos e mtodos podem ser usados em
softwares de jogos ou interativos para simular objetos do mundo
real! Por exemplo, poderia ser um objeto de 'carro' numa
competio de corrida ou um objeto de 'leo' num aplicativo
educacional de zoologia para crianas.

12.2. Classes e Objetos

12.2.1. Diferenas entre Classes e Objetos

No mundo do computador, um objeto um componente


de software cuja estrutura similar a um objeto no mundo real.
Cada objeto composto por um conjunto de atributos
(propriedades) que so as variveis que descrevem as
caractersticas essenciais do objeto e, consiste tambm, num
conjunto de mtodos (comportamentos) que descrevem como o
objeto se comporta. Assim, um objeto uma coleo de atributos
e mtodos relacionados. Os atributos e mtodos de um objeto
Java so formalmente conhecidos como atributos e mtodos
de objeto, para distinguir dos atributos e mtodos de classes,
que sero discutidos mais adiante.
A classe a estrutura fundamental na Programao
Orientada a Objetos. Ela pode ser pensada como um gabarito,
um prottipo ou, ainda, uma planta para a construo de um
objeto. Ela consiste em dois tipos de elementos que so
chamados atributos (ou propriedades) e mtodos.

91
Atributos especificam os tipos de dados definidos pela classe,
enquanto que os mtodos especificam as operaes. Um objeto
uma instncia de uma
classe.
Para diferenciar entre classes e objetos, vamos examinar
um exemplo. O que temos aqui uma classe Carro que pode ser
usada pra definir diversos objetos do tipo carro. Na tabela
mostrada abaixo, Carro A e Carro B so objetos da classe Carro. A
classe tem os campos nmero da placa, cor, fabricante e
velocidade que so preenchidos com os valores correspondentes
do carro A e B. O carro tambm tem alguns mtodos: acelerar,
virar e frear.

Quando construdos, cada objeto adquire um conjunto


novo de estado. Entretanto, as implementaes dos mtodos so
compartilhadas entre todos os objetos da mesma classe.
As classes fornecem o benefcio do Reutilizao de
Classes (ou seja, utilizar a mesma classe em vrios projetos). Os
programadores de software podem reutilizar as classes vrias
vezes para criar os objetos.

12.2.2. Encapsulamento

Encapsulamento um princpio que prope ocultar


determinados elementos de uma classe das demais classes. Ao
colocar uma proteo ao redor dos atributos e criar mtodos para
prover o acesso a estes, desta forma estaremos prevenindo
contra os efeitos colaterais indesejados que podem afet-los ao
ter essas propriedades modificadas de forma inesperada.
Podemos prevenir o acesso aos dados dos nossos objetos
declarando que temos controle desse acesso. Aprenderemos
mais sobre como Java implementa o encapsulamento quando
discutirmos mais detalhadamente sobre as classes.

12.2.3. Atributos e Mtodos de Classe

Alm dos atributos de objeto, tambm possvel definir


atributos de classe, que so atributos que pertencem classe
como um todo. Isso significa que possuem o mesmo valor para
todos os objetos daquela classe. Tambm so chamados de
atributos estticos.
Para melhor descrever os atributos de classe, vamos voltar
ao exemplo da classe Carro.
92
Suponha que a classe Carro tenha um atributo de classe
chamado Contador. Ao mudarmos o valor de Contador para 2,
todos os objetos da classe Carro tero o valor 2 para seus
atributos Contador.

12.2.4. Instncia de Classe

Para criar um objeto ou uma instncia da classe, utilizamos


o operador new. Por exemplo, para criar uma instncia da classe
String, escrevemos o seguinte cdigo:

String str2 = new String("Hello world!");

ou, o equivalente:

String str2 = "Hello world!";

O operador new aloca a memria para o objeto e retorna


uma referncia para essa alocao.
Ao criar um objeto, invoca-se, na realidade, o construtor da
classe. O construtor um mtodo onde todas as inicializaes do
objeto so declaradas e possui o mesmo nome da classe.

12.3. Mtodos

12.3.1. O que so mtodos e porque usar mtodos?

Nos exemplos apresentados anteriormente, temos apenas um


mtodo, o mtodo main(). Em Java, ns podemos definir vrios
mtodos e podemos cham-los a partir de outros mtodos.
Um mtodo um trecho de cdigo distinto que pode ser chamado
por qualquer outro mtodo para realizar alguma funo
especfica.

93
Mtodos possuem as seguintes caractersticas:
Podem ou no retornar um valor
Podem aceitar ou no argumentos
Aps o mtodo encerrar sua execuo, o fluxo de controle
retornado a quem o chamou
O que necessrio para se criar mtodos? Porque no
colocamos todas as instrues dentro de um grande mtodo? O
foco destas questes chamado de decomposio. Conhecido o
problema, ns o separamos em partes menores, que torna
menos crtico o trabalho de escrever grandes classes.

12.3.2. Chamando Mtodos de Objeto e Enviando


Argumentos

Para ilustrar como chamar os mtodos, utilizaremos como


exemplo a classe String. Pode-se usar a documentao da API
Java para conhecer todos os atributos e mtodos disponveis na
classe String. Posteriormente, iremos criar nossos prprios
mtodos.
Para chamar um mtodo a partir de um objeto,
escrevemos o seguinte:

nomeDoObjeto.nomeDoMtodo([argumentos]);

Vamos pegar dois mtodos encontrados na classe String


como exemplo:

Usando os mtodos:
String str1 = "Hello";
char x = str1.charAt(0); // retornar o caracter H
// e o armazenar no atributo x
String str2 = "hello";
// aqui ser retornado o valor booleano true
boolean result = str1.equalsIgnoreCase(str2);

12.3.3. Envio de Argumentos para Mtodos

Em exemplos anteriores, enviamos atributos para os


mtodos. Entretanto, no fizemos nenhuma distino entre os
diferentes tipos de atributos que podem ser enviados como
argumento para os mtodos. H duas formas para se enviar
argumentos para um mtodo, o primeiro envio por valor e o
segundo envio por referncia.

94
12.3.3.1. Envio por valor

Quando ocorre um envio por valor, a chamada do mtodo faz


uma cpia do valor do atributo e o reenvia como argumento. O
mtodo chamado no modifica o valor original do argumento
mesmo que estes valores sejam modificados durante operaes
de clculo implementadas pelo mtodo. Por exemplo:

Dicas de
programao:
1. Um erro comum
sobre envio por
No exemplo dado, o mtodo test foi chamado e o valor de i referncia
foi enviado como argumento. O valor de i copiado para o acontece quando
atributo do mtodo j. J que j o atributo modificado no mtodo criamos um
test, no afetar o valor do atributo i, o que significa uma cpia mtodo para fazer
diferente do atributo. trocas (swap)
Como padro, todo tipo primitivo, quando enviado para usando referncia.
um mtodo, utiliza a forma de envio por valor. Note que Java
manipula
objetos 'por
referncia',
12.3.3.2. Envio por referncia entretanto envia-
se a referncia
Quando ocorre um envio por referncia, a referncia de um para um mtodo
objeto enviada para o mtodo chamado. Isto significa que o 'por
mtodo faz uma cpia da referncia do objeto enviado. valor'. Como
Entretanto, diferentemente do que ocorre no envio por valor, o conseqncia,
mtodo pode modificar o objeto para o qual a referncia est no se escreve
apontando. Mesmo que diferentes referncias sejam usadas nos um mtodo
mtodos, a localizao do dado para o qual ela aponta a padro para fazer
mesma. Como exemplo veremos a figura na pgina a seguir: troca
de valores (swap)
95 entre objetos.
12.4. Chamando mtodos estticos

Mtodos estticos so mtodos que podem ser invocados


sem que um objeto tenha sido instanciado pela classe (sem
utilizar a palavra-chave new). Mtodos estticos pertencem a
classe como um todo e no ao objeto especifico da classe.
Mtodos estticos so diferenciados dos mtodos de objeto pela
declarao da palavra-chave static na definio do mtodo.
Para chamar um mtodo esttico, digite:

NomeClasse.nomeMtodoEsttico(argumentos);

Alguns mtodos estticos, que j foram usados em nossos


exemplos so:

// Converter a String 10 em um atributo do tipo inteiro


int i = Integer.parseInt("10");

// Retornar uma String representando um inteiro sem o


sinal da
// base 16
String hexEquivalent = Integer.toHexString(10);

96
12.5. Escopo de um atributo

Alm do atributo ter um nome e um tipo, eletambm


possui um escopo. O escopo determina onde o atributo
acessvel dentro da classe. O escopo tambm determina o
tempo de vida do
atributo ou quanto tempo o atributo ir existir na memria. O
escopo determinado pelo local onde o atributo declarado na
classe.
Para simplificar, vamos pensar no escopo como sendo
algo existente entre as chaves {...}. A chave direita chamada
de chave de sada do bloco (outer) e a chave esquerda
chamada chave de entrada do bloco (inner).
Ao declarar atributos fora de um bloco, eles sero visveis
(usveis) inclusive pelas linhas da classe dentro do bloco.
Entretanto, ao declarar os atributo dentro do bloco, no ser
possvel utiliz-los fora do bloco.
O escopo de um atributo dito local quando declarado
dentro do bloco. Seu escopo inicia com a sua declarao e vai at
a chave de sada do bloco.

Por exemplo, dado o seguinte fragmento de cdigo:

O cdigo acima representa cinco escopos indicado pelas letras.


Dados os atributos i, j, k, m e n, e os cinco escopos A, B, C, D e E,
temos os seguintes escopos para cada atributo:

O escopo do atributo i A.
O escopo do atributo j B.
O escopo do atributo k C.
O escopo do atributo m D.
O escopo do atributo n E.

97
Dado dois mtodos: main e test teremos o seguinte exemplo:

ages[] - escopo A
i em B - escopo B
i em C escopo C

E, no mtodo test, os escopos dos atributos so:

arr[] - escopo D
i em E - escopo E

Quando atributos so declarados, o identificador deve ser nico


no escopo. Isto significa que se voc tiver a seguinte declarao:

{
int test = 10;
int test = 20;
}

o compilador ir gerar um erro pois deve-se ter um nome nico


para o atributos dentro do bloco. Entretanto, possvel ter
Dicas de atributos definidos com o mesmo nome, se no estiverem
programao: declarados no mesmo bloco. Por exemplo:
1. Evite ter atributos
declarados com o public class TestBlock {
mesmo nome dentro int test = 10;
de um mtodo para public void test() {
no causar System.out.print(test);
confuso.8. int test = 20;
System.out.print(test);
}
public static void main(String[] args) {
TestBlock testBlock = new TestBlock();
testBlock.test();
}
}
98
Quando a primeira instruo System.out.print for invocada,
exibir o valor 10 contido na primeira declarao do atributo test.
Na segunda instruo System.out.print, o valor 20 exibido,
pois o valor do atributos test neste escopo.

12.6. Casting, Converso e Comparao de Objetos

Nesta seo, vamos aprender como realizar um casting.


Casting, ou typecasting, o processo de converso de um certo
tipo de dado para outro. Tambm aprenderemos como converter
tipos de dados primitivos para objetos e vice-versa. E, finalmente,
aprenderemos como comparar objetos.

12.6.1. Casting de Tipos Primitivos

Casting entre tipos primitivos permite converter o valor de


um dado de um determinado tipo para outro tipo de dado primitivo.
O casting entre primitivos comum para os tipos numricos.
H um tipo de dado primitivo que no aceita o casting, o tipo de
dado boolean.
Como demonstrao de casting de tipos, considere que
seja necessrio armazenar um valor do tipo int em um atributo do
tipo double. Por exemplo:

int numInt = 10;


double numDouble = numInt; // cast implcito

uma vez que o atributo de destino double, pode-se armazenar


um valor cujo tamanho seja menor ou igual aquele que est sendo
atribudo. O tipo convertido implicitamente.
Quando convertemos um atributo cujo tipo possui um
tamanho maior para um de tamanho menor, necessariamente
devemos fazer um casting explcito. Esse possui a seguinte
forma:
(tipoDado)valor onde:

tipoDado o nome do tipo de dado para o qual se quer converter


o valor
valor um valor que se quer converter.

Por exemplo:

double valDouble = 10.12;


int valInt = (int)valDouble; //converte valDouble para o tipo
int
double x = 10.2;
int y = 2;
int result = (int)(x/y); //converte o resultado da operao
para int

Outro exemplo quando desejamos fazer um casting de


um valor do tipo int para char. Um caractere pode ser usado como
int porque para cada caractere existe um correspondente

99
numrico que representa sua posio no conjunto de caracteres.
O casting (char)65 ir produzir a sada 'A'. O cdigo numrico
associado letra maiscula A 65, segundo o conjunto de
caracteres ASCII. Por exemplo:

char valChar = 'A';


System.out.print((int)valChar); //casting explcito
produzir 65

12.6.2. Casting de Objetos

Para objetos, a operao de casting tambm pode ser


utilizada para fazer a converso para outras classes, com a
seguinte restrio: a classe de origem e a classe de destino
devem ser da mesma famlia, relacionadas por herana; uma
classe deve ser subclasse da outra. Veremos mais em lies
posteriores sobre herana.
Analogamente converso de valores primitivos para um
tipo maior, alguns objetos no necessitam ser convertidos
explicitamente. Em conseqncia de uma subclasse conter
todas as informaes da sua superclasse, pode-se usar um
objeto da subclasse em qualquer lugar onde a superclasse
esperada.
Por exemplo, um mtodo que recebe dois argumentos, um
deles do tipo Object e outro do tipo Window. Pode-se enviar um
objeto de qualquer classe como argumento Object porque todas
as classes Java so subclasses de Object. Para o argumento
Window, possvel enviar apenas suas subclasses, tais como
Dialog, FileDialog, Frame (ou quaisquer de subclasses de suas
subclasses, indefinidamente). Isso vale para qualquer parte da
classe, no apenas dentro da chamadas do mtodo. Para um
objeto definido como uma classe Window, possvel atribuir
objetos dessa classe ou qualquer uma de suas subclasses para
esse objeto sem o casting.
O contrrio tambm verdadeiro. Uma superclasse pode
usada quando uma subclasse esperada. Entretanto, nesse
caso, o casting necessrio porque as subclasses contm mais
mtodos que suas superclasses, e isso acarreta em perda de
preciso. Os objetos das superclasses podem no dispor de todo
o comportamento necessrio para agir como um objeto da
subclasse. Por exemplo, se uma operao faz a chamada a
um mtodo de um objeto da classe Integer, usando um objeto da
classe Number, ele no ter muitos dos mtodos que foram
especificados na classe Integer. Erros ocorrero se voc tentar
chamar mtodos que no existem no objeto de destino.
Para usar objetos da superclasse onde uma subclasse
esperada, necessrio fazer o casting explcito. Nenhuma
informao ser perdida no casting, entretanto, ganhar todos os
atributos e mtodos que a subclasse define. Para fazer o casting
de um objeto para outro, utiliza-se a mesma operao utilizada
com os tipos primitivos:

100
Para fazer o casting:

(nomeClasse)objeto
onde:
nomeClasse o nome da classe destino
objeto a referncia para o objeto origem que se quer converter

Uma vez que casting cria uma referncia para o antigo


objeto de nomeClasse; ele continua a existir depois do casting.

O exemplo a seguir realiza um casting de um objeto da


classe VicePresident para um objeto da classe Employee.
VicePresident uma subclasse de Employee com mais
informaes, supondo que tenha sido definido que a classe
VicePresident tem mais privilgios que um Employee.

Employee emp = new Employee();


VicePresident veep = new VicePresident();
emp = veep; // casting no necessrio de baixo para cima
veep = (VicePresident)emp; // necessita do casting
explcito

12.6.3. Convertendo Tipos Primitivos para Objetos e Vice-


Versa
Dicas de
No se pode fazer sob qualquer circunstncia um casting programao:
de um objeto para um tipo de dado primitivo, ou vice-versa. Tipos 1. A classe Void
primitivos e objetos so muito diferentes em Java e no se pode representa vazio em
fazer o casting automaticamente entre os dois ou intercambiar o Java. Deste modo,
seu uso. no existem motivos
Como alternativa, o pacote java.lang oferece classes que para
fazem a correspondncia para cada tipo primitivo: Float, Boolean, ela ser usada na
Byte, dentre outros. Muitas dessas classes tm o mesmo nome converso de valores
dos tipos de dados primitivos, exceto pelo fato que o nome dessas primitivos e objetos.
classe comeam com letra maiscula (Short ao invs de short, Ela um tratador
Double ao invs de double, etc). H duas classes que possuem para a palavra-chave
nomes que diferem do correspondente tipo de dado primitivo: void, que utilizada
Character usado para o tipo char e Integer usado para o tipo na assinatura de
int. Estas classes so chamadas de Wrapper Class. mtodos indicando
Verses anteriores a 5.0 de Java tratam os tipos de dados que estes no
e suas Wrapper Class de forma muito diferente e uma classe no retornam valor.
ser compilada com sucesso se for utilizado uma quando
deveria usar a outra. Por exemplo:

Integer ten = 10;


Integer two = 2;
System.out.println(ten + two);
101
Usando as classes que correspondem a cada um dos tipos
primitivos, possvel criar objetos que armazenam este mesmo
valor. Por exemplo:

// A declarao seguinte cria um objeto de uma classe


Integer
// com o valor do tipo int 7801 (primitivo -> objeto)
Integer dataCount = new Integer(7801);

// A declarao seguinte converte um objeto Integer para


um
// tipo de dado primitivo int. O resultado o valor 7801
int newCount = dataCount.intValue();

// Uma converso comum de se fazer de String para um


tipo
// numrico (objeto -> primitivo)
String pennsylvania = "65000";
int penn = Integer.parseInt(pennsylvania);

12.6.4. Comparando Objetos

Em lies prvias, aprendemos sobre operadores para


comparar valores igualdade, negao, menor que, etc. Muitos
desses operadores trabalham apenas com dados de tipo
primitivo, no com objetos. Ao tentar utilizar outros tipos de
dados, o compilador produzir erros.
Uma exceo para esta regra so os operadores de
igualdade: == (igual) e != (diferente). Quando aplicados a objetos,
estes operadores no fazem o que se poderia supor. Ao invs de
verificar se um objeto tem o mesmo valor de outro objeto, eles
determinam se os dois objetos comparados pelo operador tm a
mesma referncia. Por exemplo:

String valor1 = new String;


Integer dataCount = new Integer(7801);

Para comparar objetos de uma classe e ter resultados


apropriados, deve-se implementar e chamar mtodos especiais
na sua classe. Um bom exemplo disso a classe String.
possvel ter dois objetos String diferentes que
contenham o mesmo valor. Caso se empregue o operador ==
para comparar objetos, estes sero considerados diferentes.
Mesmo que seus contedos sejam iguais, eles no so o mesmo
objeto.
Para ver se dois objetos String tm o mesmo contedo, um
mtodo chamado equals() utilizado. O mtodo compara cada
caractere presente no contedo das Strings e retorna true se
ambas strings tiverem o mesmo valor.

102
O cdigo seguinte ilustra essa comparao,

class EqualsTest {
public static void main(String[] args) {
String str1, str2;
str1 = "Free the bound periodicals.";
str2 = str1;
System.out.println("String1: " + str1);
System.out.println("String2: " + str2);
System.out.println("Same object? " + (str1 == str2));
Dicas de
str2 = new String(str1); programao:
1. Porque no se pode
System.out.println("String1: " + str1); ter a mesma literal
System.out.println("String2: " + str2); quando mudamos
System.out.println("Same object? " + (str1 == str2)); str2, a no ser quando
S y s t e m . o u t . p r i n t l n ( " S a m e v a l u e ? " + utilizamos o new?
str1.equals(str2)); Literais String so
} otimizadas em Java;
} se uma String
criada utilizando uma
A sada dessa classe a seguinte: literal e cria-se outra
String com os mesmos
String1: Free the bound periodicals. caracteres, Java tem
String2: Free the bound periodicals. inteligncia suficiente
Same object? true para retornar apenas a
String1: Free the bound periodicals. posio em memria
String2: Free the bound periodicals. do
Same object? false primeiro objeto String
Same value? True criado. Ou seja,
ambas strings se
Vamos entender o processo envolvido. referem ao mesmo
objeto como se fosse
String str1, str2; um apelido. Para
str1 = "Free the bound periodicals."; obrigar ao Java criar
str2 = str1; um novo objeto
String, deve-se utilizar
o operador new.

A primeira parte dessa classe declara dois atributos (str1 e


str2) e atribui a literal "Free the bound periodicals." a str1, e depois
atribui esse valor a str2. Como visto anteriormente, str1 e
str2 agora apontam para o mesmo objeto, e o teste de igualdade
prova isso.
Em seguida, temos a seguinte instruo:

str2 = new String(str1);

103
Na segunda parte da classe, cria-se um novo objeto String
com o mesmo valor de str1 e faz-se a atribuio de str2 para esse
novo objeto String. Agora temos dois diferentes tipos de objetos
na str1 e str2, ambos com o mesmo contedo. Testando para ver
se eles so o mesmo objeto usando o operador de igualdade
obtemos a resposta esperada: false eles no so o mesmo
objeto na memria. Utilizando o mtodo equals() recebemos a
resposta esperada: true eles tem o mesmo contedo.

12.6.5. Determinando a Classe de um Objeto

Existem duas maneiras de se descobrir a qual classe


determinado objeto pertence:

1. Para obter o nome da classe:


Utiliza-se o mtodo getClass() que retorna a classe do
objeto (onde Class a classe em si).
Esta, por sua vez, possui o mtodo chamado getName()
que retorna o nome da classe.
Por exemplo:

String name = key.getClass().getName();

2. Para testar se um objeto qualquer foi instanciado de uma


determinada classe:
Utiliza-se a palavra-chave instanceof. Esta palavra-chave
possui dois operadores: a referncia para o objeto esquerda e o
nome da classe direita. A expresso retorna um lgico
dependendo se o objeto uma instncia da classe declarada ou
qualquer uma de suas subclasses.
Por exemplo:

String ex1 = "Texas";


System.out.println(ex1 instanceof String); // retorna true
String ex2;
System.out.println(ex2 instanceof String); // retorna false

EXERCCIOS

1. Conceitue os termos, com suas prprias palavras,: a) Classe,


b) Objeto, c) Instanciao, e) Atributo de objeto, f) Mtodo de
objeto, g) Atributo de classe ou atributos estticas, h) Construtor, i
) Mtodo de classe ou mtodos estticos.

104
2. Identifique na figura da pgina seguinte os elementos: a)
Classe, b) Objeto, c) Instncia, e) Mtodo, f) Atributo, g)
Construtor, h) Mensagem, i) Argumento.

Class Computer Object Computer;


Processador; Processador=
Memory; PowerPc;
System_Oper; Memory=2Gb;
Computer(args); System_Oper=OS/2;
Start(time ); Computer(args);
Shutdown(time ); Start(time );
RunProgram(name); Shutdown(time );
RunProgram(name );

2. Pipoy um novato na linguagem de programao Java. Ele


apenas ouviu que existem Java APIs (Application Programming
Interface) prontas para serem usadas em suas classes e ele est
ansioso para fazer uns testes com elas. O problema que Pipoy
no tem uma cpia da documentao Java e ele tambm no tem
acesso Internet, deste modo, no h como ele ver as APIs java.
Sua tarefa ajudar Pipoy a procurar as APIs. Voc deve informar
as classes s quais os mtodos pertencem e como o mtodo
deve ser declarado com um exemplo de uso deste.
Por exemplo, se Pipoy quer saber qual o mtodo que converte
uma String para int, sua resposta deve ser:

Classe: Integer
Declarao do Mtodo: public static int parseInt( String
value )
Exemplo de Uso:
String strValue = "100";
int value = Integer.parseInt( strValue );

Tenha certeza de que o fragmento de cdigo que voc


escreveu em seu exemplo de uso compila e que produza o
resultado correto. Enfim, no deixe Pipoy confuso. (Dica: Todos
os mtodos esto no package java.lang). Caso haja mais de
um mtodo para atender
tarefa, utilize apenas um.
Agora vamos iniciar a busca! Aqui esto alguns mtodos
que Pipoy necessita:
a) Procure pelo mtodo que verifica se uma String termina com
um determinado sufixo. Por
exemplo, se a String dada "Hello", o mtodo deve retornar true
se o sufixo informado
"lo", e false se o sufixo for "alp".
b) Procure pelo mtodo que determina a representao do
caractere para um dgito e base especficos. Por exemplo, se o
dgito informado 15 e a base 16, o mtodo retornar o
caractere 'F', uma vez que 'F' a representao hexadecimal
para o nmero 15 em base 10.
105
c) Procure por um mtodo que retorna a parte inteira de um valor
double. Por exemplo, se a
entrada for 3.13, o mtodo deve retornar o valor 3.
d) Procure por um mtodo que determina se um certo caractere
um dgito. Por exemplo, se a
entrada for '3', retornar o valor true.
e) Procure por um mtodo que interrompe a execuo da Java
Virtual Machine corrente.

3. A emprea MagSoft contrata desenvolvedores para trabalhar


em projetos de software. Apresente um modelo de
implementao em objetos que possa representar o sistema de
controle de projetos da empresa. Determine as classes, atributos
e mtodos.

// classe Empresa
public class Empresa
DESAFIO public static void main(String[] args) {
// fill the staff array with three Employee objects
Employee[] staff = new Employee[3];
O cdigo seguinte cria uma lista staff[0] = new Employee("Tom", 40000);
de objetos empregados staff[1] = new Employee("Dick", 60000);
associados a uma identificao. staff[2] = new Employee("Harry", 65000);
Perceba que nas classes // print out information about all Employee objects
empregado e empresa est for (int i = 0; i < staff.length; i++)
Employee e = staff[i];
declarado o mtodo main().
e.setId();
Compile execute as duas System.out.println("name=" + e.getName()
classes. Justique a execuo. + ",id=" + e.getId()
Agora altere o cdigo para no + ",salary=" + e.getSalary());
permitir execuo da classe }
empregado e na criao de cada int n = Employee.getNextId(); // calls static method
System.out.println("Next available id=" + n);
empregado incrementar o
}
identificador automaticamente. }
// classe Empregado
class Employee {
public Employee(String n, double s) {
name = n;
salary = s;
id = 0;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public int getId() {
return id;
}
public void setId() {
id = nextId; // set id to next available id
nextId++;
}
public static int getNextId() {
return nextId; // returns static field
}

106
13. DEFINIO DE CLASSE EM JAVA

13.1. Definindo classes

Antes de escrever sua classe, primeiro pense onde e


como sua classe ser usada. Pense em um nome apropriado
para a classe e liste todas as informaes ou propriedades que
deseje que ela tenha. Liste tambm os mtodos que sero
usados para a classe.

Para definir uma classe, escrevemos:

<modificador>* class <nome> {


<declaraoDoAtributo>*
<declaraoDoConstrutor>*
<declaraoDoMtodo>*
}

onde:
Dicas de
<modificador> um modificador de acesso, que pode ser usado programao:
em combinao com outros 1. Lembre-se de
<nome> nome da sua classe que, para a
<declaraoDoAtributo> atributos definidos para a classe declarao da
<declaraoDoConstrutor> mtodo construtor classe, o nico
<declaraoDoMtodo> mtodos da classe modificador de
acesso vlido o
Nesta lio, criaremos uma classe que conter o registro de um public. De uso
estudante. Como j identificamos o objetivo da nossa classe, exclusivo para a
agora podemos nome-la. classe que possuir
Um nome apropriado para nossa classe seria StudentRecord. o mesmo nome do
arquivo externo.
Para definir nossa classe, escrevemos:

public class StudentRecord {


Dicas de
// adicionaremos mais cdigo aqui
programao:
}
1. Pense em nomes
apropriados para a
onde:
sua classe. No a
chame
public modificador de acesso e significa que qualquer classe
simplesmente de
pode acessar esta
classe XYZ ou
class palavra-chave usada para criar uma classe
qualquer outro nome
StudentRecord identificador nico que identifica a classe
aleatrio.
2. Os nomes de
classes devem
13.2. Declarando Atributos
iniciadas por letra
MAISCULA.
Para declarar um certo atributo para a nossa classe,
3. O nome do arquivo
escrevemos:
de sua classe
obrigatoriamente
<modificador>* <tipo> <nome> [= <valorInicial>];
possui o
107 MESMO NOME da
sua classe pblica.
onde:

modificador tipo de modificador do atributo


tipo tipo do atributo
nome pode ser qualquer identificador vlido
valorInicial valor inicial para o atributo

Relacionaremos a lista de atributos que um registro de estudante


pode conter. Para cada informao, listaremos os tipos de dados
apropriados que sero utilizados. Por exemplo, no seria ideal
usar um tipo int para o nome do estudante ou String para a nota
do estudante.
Abaixo, por exemplo, temos algumas informaes que podemos
adicionar ao registro do estudante:

nome - String
endereo - String
idade - int
nota de matemtica - double
nota de ingls - double
nota de cincias double

Dicas de
programao: Futuramente, possvel adicionar mais informaes. Para este
1. Declare todas exemplo, utilizaremos somente estas.
os atributos de
objeto na parte 13.2.1. Atributos de Objeto
superior da
declarao da Agora que temos uma lista de todos os atributos que queremos
classe. adicionar nossa classe, vamos adicion-los ao nosso cdigo.
2. Declare cada Uma vez que queremos que estes atributos sejam nicos para
atributo em uma cada objeto (ou para cada estudante), devemos declar-los
linha. como atributos de objeto.
3. Atributos de Por exemplo:
objeto, assim
como qualquer public class StudentRecord {
outro atributo private String name;
devem private String address;
iniciar com letra private int age;
MINSCULA. private double mathGrade;
4. Use o tipo de private double scienceGrade;
dado apropriado }
para cada atributo
declarado.
5. Declare onde:
atributos de
objetos como
private de modo private significa que os atributos so acessveis apenas de
que somente dentro da classe. Outros objetos no podem acessar
os mtodos da diretamente estes atributos.
classe possam
acess-los
diretamente.
108
13.2.2. Atributos de Classe ou Atributos Estticos

Alm das atributos de objeto, podemos tambm declarar


atributos de classe ou atributos que pertenam classe como um
todo. O valor destes atributos o mesmo para todos os objetos da
mesma classe. Suponha que queiramos saber o nmero total de
registros criados para a classe. Podemos declarar um atributo
esttico que armazenar este valor. Vamos cham-lo de
studentCount.
Para declarar um atributo esttico:

public class StudentRecord {


// atributos de objeto declarados anteriormente
private static int studentCount;
}

usamos a palavra-chave static para indicar que um atributo


esttico.

Ento, nosso cdigo completo deve estar assim:

public class StudentRecord {


private String name;
private String address;
private int age;
private double mathGrade;
private double englishGrade;
private double scienceGrade;
private static int studentCount;
}

13.3. Declarando Mtodos

Antes de discutirmos quais mtodos que a nossa classe


dever conter, vejamos a sintaxe geral usada para a declarao
de mtodos.

Para declararmos mtodos, escrevemos:

<modificador>* <tipoRetorno> <nome>(<argumento>*) {


<instrues>*
}

onde:

<modificador> pode ser utilizado qualquer modificador de


acesso
<tipoRetorno> pode ser qualquer tipo de dado (incluindo void)
<nome> pode ser qualquer identificador vlido
<argumento> argumentos recebidos pelo mtodo separados por
vrgulas. So definidos por:

<tipoArgumento> <nomeArgumento>
109
13.3.1. Mtodos assessores

Para que se possa implementar o princpio do


encapsulamento, isto , no permitir que quaisquer objetos
acessem os nossos dados de qualquer modo, declaramos
campos, ou atributos, da nossa classe como particulares.
Entretanto, h momentos em que queremos que outros
objetos acessem estes dados particulares. Para que possamos
fazer isso, criamos mtodos assessores.
Mtodos assessores so usados para ler valores de
atributos de objeto ou de classe. O mtodo assessor recebe o
nome de get<NomeDoAtributo>. Ele retorna um valor.
Para o nosso exemplo, queremos um mtodo que possa ler o
nome, endereo, nota de ingls, nota de matemtica e nota de
cincias do estudante.

Vamos dar uma olhada na implementao deste:

public class StudentRecord {


private String name;
:
:
public String getName() {
return name;
}
}

onde:

public significa que o mtodo pode ser chamado por objetos


externos classe
String o tipo do retorno do mtodo. Isto significa que o mtodo
deve retornar um valor de tipo String
getName o nome do mtodo () significa que o nosso mtodo no
tem nenhum argumento

A instruo:

return name;

no mtodo, significa que retornar o contedo do atributo name


ao mtodo que o chamou. Note que o tipo do retorno do mtodo
deve ser do mesmo tipo do atributo utilizado na declarao
return. O seguinte erro de compilao ocorrer caso o mtodo e
o atributo de retorno no tenham o mesmo tipo de dados:

StudentRecord.java:14: incompatible types


found : int
required: java.lang.String
return name;
^
1 error

110
Outro exemplo de um mtodo assessor o mtodo
getAverage:

public class StudentRecord {


private String name;
:
:
public double getAverage(){
double result = 0;
result =
(mathGrade+englishGrade+scienceGrade)/3;
return result;
}
}

O mtodo getAverage calcula a mdia das 3 notas e


retorna o resultado.

13.3.2. Mtodos modificadores

Para que outros objetos possam modificar os nossos


dados, disponibilizamos mtodos que possam gravar ou
modificar os valores dos atributos de objeto ou de classe.
Chamamos a estes mtodos modificadores. Este mtodo
escrito como set<NomeDoAtributoDeObjeto>.

Vamos dar uma olhada na implementao de um mtodo


modificador:

public class StudentRecord {


private String name;
:
:
public void setName(String temp) {
name = temp;
}
}

onde:

public significa que o mtodo pode ser chamado por


objetos externos classe
void significa que o mtodo no retorna valor
setName o nome do mtodo
(String temp) argumento que ser utilizado dentro do nosso
mtodo
A instruo:

name = temp;

atribuir o contedo de temp para name e, portanto, alterar os


dados dentro do atributo de objeto name. Mtodos modificadores
no retornam valores. Entretanto, eles devem receber um
argumento com o mesmo tipo do atributo no qual esto tratando.

111
13.3.3. Mltiplos comandos return

possvel ter vrios comandos return para um mtodo


desde que eles no pertenam ao mesmo bloco. possvel
utilizar constantes para retornar valores, ao invs de atributos.
Por exemplo, considere o mtodo:

public String getNumberInWords(int num) {


String defaultNum = "zero";
if (num == 1) {
return "one"; // retorna uma constante
} else if( num == 2) {
return "two"; // retorna uma constante
}
// retorna um atributo
return defaultNum;
}

13.3.4. Mtodos estticos

Para o atributo esttico studentCount, podemos criar um


mtodo esttico para obter o seu contedo.

public class StudentRecord {


private static int studentCount;
public static int getStudentCount(){
return studentCount;
}
}

onde:

public significa que o mtodo pode ser chamado por


Dicas de objetos externos classe
programao: static significa que o mtodo esttico e deve ser
1. Nomes de chamado digitando-se [NomeClasse].[nomeMtodo]
mtodos devem int o tipo do retorno do mtodo. Significa que o
iniciar com letra mtodo deve retornar um valor de tipo int
MINSCULA. getStudentCount nome do mtodo
2. Nomes de () significa que o mtodo no tem nenhum argumento
mtodos devem
conter verbos Por enquanto, getStudentCount retornar sempre o
3. Sempre faa valor zero j que ainda no fizemos nada na nossa classe para
documentao atribuir o seu valor. Modificaremos o valor de studentCount mais
antes da tarde, quando discutirmos construtores.
declarao do
mtodo. Use o 13.3.5. Exemplo de Cdigo Fonte para a classe
estilo javadoc StudentRecord
para isso
Na pgina seguinte est o cdigo para a nossa classe
StudentRecord:
112
public class StudentRecord {
private String name;
private String address;
private int age;
private double mathGrade;
private double englishGrade;
private double scienceGrade;
private static int studentCount;
/**
* Retorna o nome do estudante
*/
public String getName(){
return name;
}
/**
* Muda o nome do estudante
*/
public void setName( String temp ){
name = temp;
}
// outros mtodos modificadores aqui ....
/**
* Calcula a mdia das classes de ingls,
matemtica
* e cincias
*/
public double getAverage(){
double result = 0;
result =
(mathGrade+englishGrade+scienceGrade)/3;
return result;
}
/**
* Retorna o nmero de ocorrncias em
StudentRecords
*/
public static int getStudentCount(){
return studentCount;
}
}

Aqui est um exemplo do cdigo de uma classe que utiliza


a nossa classe StudentRecord.

public class StudentRecordExample {


public static void main( String[] args ){
// criar trs objetos para StudentRecord
StudentRecord annaRecord = new
StudentRecord();
StudentRecord beahRecord = new
StudentRecord();
StudentRecord crisRecord = new StudentRecord();
// enviar o nome dos estudantes
113
annaRecord.setName("Anna");
beahRecord.setName("Beah");
crisRecord.setName("Cris");
// mostrar o nome de anna
System.out.println(annaRecord.getName());
//mostrar o nmero de estudantes
System.out.println("Count=" +
StudentRecord.getStudentCount());
}
}

A sada desta classe :


Anna
Count = 0

13.4. this

O objeto this usado para acessar atributos de objeto ou


mtodos da classe. Para entender isso melhor, tomemos o
mtodo setAge como exemplo.
Suponha que tenhamos o seguinte mtodo para setAge:

public void setAge(int age){


age = age; // No uma boa prtica
}

O nome do argumento nesta declarao age, que tem o


mesmo nome do atributo de objeto age. J que o argumento age
a declarao mais prxima do mtodo, o valor do argumento
age ser usado. Na instruo:

age = age;

estamos simplesmente associando o valor do argumento age


para si mesmo!
Isto no o que queremos que acontea no nosso cdigo.
A fim de corrigir esse erro, usamos o objeto this. Para utilizar o
objeto this, digitamos:

this.<nomeDoAtributo>

O ideal reescrever o nosso mtodo do seguinte modo:


public void setAge(int age){
this.age = age;
}

Este mtodo ir atribuir o valor do argumento age para a


atributo de objeto age do objeto StudentRecord.

114
13.5. Overloading de Mtodos

Nas nossas classes, podemos necessitar de criar mtodos


que tenham os mesmos nomes, mas que funcionem de maneira
diferente dependendo dos argumentos que informamos. Esta
capacidade chamada de overloading de mtodos.
Overloading de mtodos permite que um mtodo com o
mesmo nome, entretanto com diferentes argumentos, possa ter
implementaes diferentes e retornar valores de diferentes tipos.
Ao invs de inventar novos nomes todas as vezes, o overloading
de mtodos pode ser utilizado quando a mesma operao tem
implementaes diferentes.
Por exemplo, na nossa classe StudentRecord, queremos
ter um mtodo que mostre as informaes sobre o estudante.
Entretanto, queremos que o mtodo print mostre dados
diferentes dependendo dos argumentos que lhe informamos. Por
exemplo, quando no enviamos qualquer argumento queremos
que o mtodo print mostre o nome, endereo e idade do
estudante.
Quando passamos 3 valores double, queremos que o
mtodo mostre o nome e as notas do estudante.
Temos os seguintes mtodos dentro da nossa classe
StudentRecord:

public void print(){


System.out.println("Name:" + name);
System.out.println("Address:" + address);
System.out.println("Age:" + age);
}
public void print(double eGrade, double mGrade,
double sGrade)
System.out.println("Name:" + name);
System.out.println("Math Grade:" + mGrade);
System.out.println("English Grade:" + eGrade);
System.out.println("Science Grade:" + sGrade);
}

Quando tentamos chamar estes mtodos no mtodo


main, criado para a classe StudantRecordExample:

public static void main(String[] args) {


StudentRecord annaRecord = new
StudentRecord();
annaRecord.setName("Anna");
annaRecord.setAddress("Philippines");
annaRecord.setAge(15);
annaRecord.setMathGrade(80);
annaRecord.setEnglishGrade(95.5);
annaRecord.setScienceGrade(100);
// overloading de mtodos
annaRecord.print();
annaRecord.print(
annaRecord.getEnglishGrade(),
annaRecord.getMathGrade(),
annaRecord.getScienceGrade());
} 115
teremos a sada para a primeira chamada ao mtodo print:

Name:Anna
Address:Philippines
Age:15

e, em seguida, a sada para a segunda chamada ao mtodo


print:

Name:Anna
Math Grade:80.0
English Grade:95.5
Science Grade:100.0

Lembre-se sempre que mtodos overload possuem as


seguintes propriedades:
1. o mesmo nome
2. argumentos diferentes
3. tipo do retorno igual ou diferente

13.6. Declarando Construtores

Discutimos anteriormente o conceito de construtores.


Construtores so importantes na criao de um objeto. um
mtodo onde so colocadas todas as inicializaes.
A seguir, temos as propriedades de um construtor:
1. Possuem o mesmo nome da classe
2. Construtor um mtodo, entretanto, somente as seguintes
informaes podem ser colocadas no cabealho do construtor:

Escopo ou identificador de acessibilidade (como public)


Nome do construtor
Argumentos, caso necessrio
3. No retornam valor
4. So executados automaticamente na utilizao do operador
new durante a instanciao da classe. Para declarar um
construtor, escrevemos:

[modificador] <nomeClasse> (<argumento>*) {


<instruo>*
}

13.6.1. Construtor Padro (default)

Toda classe tem o seu construtor padro. O construtor


padro um construtor pblico e sem argumentos. Se no for
definido um construtor para a classe, ento, implicitamente,
assumido um construtor padro.
Por exemplo, na nossa classe StudentRecord, o
construtor padro definido do seguinte modo:

116
public StudentRecord() {
}

13.6.2. Overloading de Construtores

Como mencionamos, construtores tambm podem sofrer


overloading, por exemplo, temos aqui quatro construtores:

public StudentRecord() {
// qualquer cdigo de inicializao aqui
}
public StudentRecord(String temp){
this.name = temp;
}
public StudentRecord(String name, String address) {
this.name = name;
this.address = address;
}
public StudentRecord(double mGrade, double eGrade,
double sGrade) {
mathGrade = mGrade;
englishGrade = eGrade;
scienceGrade = sGrade;
}

13.6.3. Usando Construtores

Para utilizar estes construtores, temos as seguintes


instrues:

public static void main(String[] args) {


// criar trs objetos para o registro do estudante
StudentRecord annaRecord = new
StudentRecord("Anna");
StudentRecord beahRecord =
new StudentRecord("Beah", "Philippines");
StudentRecord crisRecord =
new StudentRecord(80,90,100);
// algum cdigo aqui
}

Antes de continuarmos, vamos retornar o atributo esttico


studentCount que declaramos agora a pouco. O objetivo de
studentCount contar o nmero de objetos que so
instanciados com a classe StudentRecord. Ento, o que
desejamos incrementar o valor de studentCount toda vez que
um objeto da classe StudentRecord instanciado. Um bom local
para modificar e incrementar o valor de studentCount nos
construtores, pois so sempre chamados toda vez que um objeto
instanciado. Como no exemplo da pgina a seguir:

117
public StudentRecord() {
studentCount++; // adicionar um estudante
}
public StudentRecord(String name) {
studentCount++; // adicionar um estudante
this.name = name;
}
public StudentRecord(String name, String address) {
studentCount++; // adicionar um estudante
this.name = name;
this.address = address;
}
public StudentRecord(double mGrade, double eGrade,
double sGrade) {
studentCount++; // adicionar um estudante
mathGrade = mGrade;
englishGrade = eGrade;
scienceGrade = sGrade;
}

13.6.4. Utilizando o this()

Chamadas a construtores podem ser cruzadas, o que


significa ser possvel chamar um construtor de dentro de outro
construtor. Usamos a chamada this() para isso. Por exemplo,
dado o seguinte cdigo,

public StudentRecord() {
this("some string");
}
public StudentRecord(String temp) {
this.name = temp;
}
public static void main( String[] args ) {
StudentRecord annaRecord = new
StudentRecord();
}

Dado o cdigo acima, quando se executa a instruo do


mtodo main, ser chamado o primeiro construtor. A instruo
inicial deste construtor resultar na chamada ao segundo
construtor.
H algum detalhes que devem ser lembrados na utilizao
da chamada ao construtor por this():

1. A chamada ao construtor DEVE SEMPRE OCORRER NA


PRIMEIRA LINHA DE INSTRUO
2. UTILIZADO PARA A CHAMADA DE UM CONSTRUTOR.

A chamada ao this() pode ser seguida por outras


instrues.
118
Como boa prtica de programao, ideal nunca construir
mtodos que repitam as instrues. Buscamos a utilizao de
overloading com o objetivo de evitarmos essa repetio. Deste
modo, reescreveremos os construtores da classe
StudentRecord para:

public StudentRecord() {
studentCount++; // adicionar um estudante
}
public StudentRecord(String name) {
this();
this.name = name;
}
public StudentRecord(String name, String address) {
this(name);
this.address = address;
}
public StudentRecord(double mGrade, double eGrade,
double sGrade) {
this();
mathGrade = mGrade;
englishGrade = eGrade;
scienceGrade = sGrade;
}

13.7. Pacotes

So utilizados para agrupar classes e interfaces


relacionadas em uma nica unidade (discutiremos interfaces
mais tarde). Esta uma caracterstica poderosa que oferece um
mecanismo para gerenciamento de um grande grupo de classes
e interfaces e evita possveis conflitos de nome.

13.7.1. Importando Pacotes

Para utilizar classes externas ao pacote da classe,


necessrio importar os pacotes dessas classes. Por padro,
todos as suas classes Java importam o pacote java.lang. por
isso que possvel utilizar classes como String e Integer dentro da
sua classe, mesmo no tendo importado nenhum pacote
explicitamente.

A sintaxe para importar pacotes como segue:

import <nomeDoPacote>.<nomeDaClasse>;

Por exemplo, necessitar utilizar a classe Color dentro do


pacote awt, necessrio a seguinte instruo:

import java.awt.Color;
ou:

import java.awt.*;
119
A primeira linha de instruo importa especificamente a
classe Color enquanto que a seguinte importa todas as classes
do pacote java.awt.
Outra maneira de importar classes de outros pacotes
atravs da referncia explcita ao pacote. Isto feito utilizando-se
o nome completo do pacote para
declarao do objeto na classe:

java.awt.Color color;

13.7.2. Criando pacotes

Para criar os nossos pacotes, escrevemos:

package <nomeDoPacote>;

Suponha que desejamos criar um pacote onde


colocaremos a nossa classe StudentRecord juntamente com
outras classes relacionadas. Chamaremos o nosso pacote de
schoolClasses.
A primeira coisa que temos que fazer criar uma pasta
chamada schoolClasses. Em seguida, copiar para esta pasta
todas as classes que pertenam a este pacote. Adicione a
seguinte instruo no arquivo da classe, esta linha deve ser
colocada antes da definio da classe. Por exemplo:

package schoolClasses;
public class StudentRecord {
// instrues da classe
}

Pacotes podem ser aninhados. Neste caso, o


interpretador espera que a estrutura de diretrios contendo as
classes combinem com a hierarquia dos
pacotes.

13.7.3. Definindo a varivel de ambiente CLASSPATH

Suponha que colocamos o pacote schoolClasses sob o


diretrio C:\. Precisamos que a classpath aponte para este
diretrio de tal forma que quando executemos a classe, a JVM
seja capaz de enxergar onde est armazenada.
Antes de discutirmos como ajustar a varivel classpath,
vamos ver um exemplo sobre o que aconteceria se esta no
fosse ajustada.
Suponha que sigamos os passos para compilar e executar
a classe StudentRecord que escrevemos:

120
C:\schoolClasses>javac StudentRecord.java
C:\schoolClasses>java StudentRecord
Exception in thread "main" java.lang.NoClassDefFoundError:
StudentRecord
(wrong name: schoolClasses/StudentRecord)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown
Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown
Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)

Surge o erro NoClassDefFoundError, que significa que o


Java desconhece onde procurar por esta classe. A razo disso
que a sua classe StudentRecord pertence a um pacote
denominado schoolClasses. Se desejamos executar esta
classe, teremos que dizer ao Java o seu nome completo
schoolClasses.StudentRecord. Tambm teremos que dizer
JVM onde procurar pelos nossos pacotes, que, neste caso, no
C:\. Para fazer isso, devemos definir a varivel classpath.

Para definir a varivel classpath no Windows, digitamos o


seguinte na linha de comando:

C:\schoolClasses>set classpath=C:\

onde C:\ o diretrio onde colocamos os pacotes. Aps definir a


varivel classpath, poderemos executar a nossa classe em
qualquer pasta, digitando:

C:\schoolClasses>java schoolClasses.StudentRecord

Para sistemas baseados no Unix, suponha que as nossas


classes estejam no diretrio usr/local/myClasses, escrevemos:

export classpath=/usr/local/myClasses
Observe que possvel definir a varivel classpath em qualquer
lugar. possvel definir mais de um local de pesquisa; basta
separ-los por ponto-evrgula (no Windows) e dois-pontos (nos
sistemas baseados em Unix). Por exemplo:

set classpath=C:\myClasses;D:\;E:\MyPrograms\Java

e para sistemas baseados no Unix:

121
export classpath=/usr/local/java:/usr/myClasses
13.8. Modificadores de Acesso

Quando estamos criando as nossas classes e definindo


as suas propriedades e mtodos, queremos implementar algum
tipo de restrio para se acessar esses dados. Por exemplo, ao
necessitar que um certo atributo seja modificado apenas pelos
mtodos dentro da classe, possvel esconder isso dos outros
objetos que estejam usando a sua classe. Para implementar
isso, no Java, temos os modificadores de acesso.
Existem quatro diferentes tipos de modificadores de
acesso: public, private, protected e default. Os trs primeiros
modificadores so escritos explicitamente no cdigo para indicar
o acesso, para o tipo default, no se utiliza nenhuma palavra-
chave.

13.8.1. Acesso padro

Especifica que os elementos da classe so acessveis


somente aos mtodos internos da classe e s suas subclasses.
No h palavra chave para o modificador default; sendo
aplicado na ausncia de um modificador de acesso. Por
exemplo:

public class StudentRecord {


// acesso padro ao atributo
int name;
// acesso padro para o mtodo
String getName(){
return name;
}
}

O atributo de objeto name e o mtodo getName() podem


ser acessados somente por mtodos internos classe e por
subclasses de StudentRecord. Falaremos sobre subclasses
em prximas lies.

13.8.2. Acesso pblico

Especifica que os elementos da classe so acessveis


tanto internamente quanto externamente classe. Qualquer
objeto que interage com a classe pode ter acesso aos elementos
pblicos da classe. Por exemplo:
public class StudentRecord {
// acesso pblico o atributo
public int name;
// acesso pblico para o mtodo
public String getName(){
return name;
}
}

122
O atributo de objeto name e o mtodo getName() podem
ser acessados a partir de outros objetos.

18.8.3. Acesso protegido

Especifica que somente classes no mesmo pacote podem


ter acesso aos atributos e mtodos da classe. Por exemplo:

public class StudentRecord {


//acesso protegido ao atributo
protected int name;
//acesso protegido para o mtodo
protected String getName(){
return name;
}
}

O atributo de objeto name e o mtodo getName() podem


ser acessados por outros objetos, desde que o objetos pertenam
ao mesmo pacote da classe StudentRecord.
Dicas de
13.8.4. Acesso particular
programao:
Normalmente, os
Especifica que os elementos da classe so acessveis
atributos de objeto
somente na classe que o definiu. Por exemplo:
de uma classe
devem ser
public class StudentRecord {
declarados
// acesso particular ao atributo
particulares e a
private int name;
classe pode
// acesso particular para o mtodo
fornecer mtodos
private String getName(){
assessores e
return name;
modificadores
}
para estes
}

O atributo de objeto name e o mtodo getName() podem


ser acessados somente por mtodos internos classe.

EXERCCIOS

1. Sua tarefa criar uma classe que contenha um Registro de


Agenda. A tabela 1 descreve as informaes que um Registro de
Agenda deve conter:

123
Crie os seguintes mtodos:
1. Fornea todos os mtodos assessores e modificadores
necessrios para
todos os atributos.
2. Construtores.

2. Crie uma classe Agenda que possa conter entradas de objetos


tipo Registro de Agenda (utilize a classe criada no primeiro
exerccio). Devem ser oferecidos os seguintes mtodos para a
agenda:
1. Adicionar registro
2. Excluir registro
3. Visualizar registros
4. Modificar um registro

DESAFIO

A emprea MagSoft contrata desenvolvedores para trabalhar em


projetos de software. Implemente uma soluo em Java para o
controle do empregados e projetos usando pacote Java.

124
14. Herana, polimorfismo e interfaces
14.1. Herana

Todas as classes, incluindo as que compem a API Java,


so subclasses da classe Object. Um exemplo de hierarquia de
classes mostrado com a figura.
A partir de uma determinada classe, qualquer classe acima
desta na hierarquia de classes conhecida como uma
superclasse (ou classe Pai). Enquanto que qualquer classe
abaixo na hierarquia de classes conhecia como uma subclasse
(ou classe Filho).

Herana um dos principais princpios em orientao a


objeto. Um comportamento (mtodo) definido e codificado uma
nica vez em uma nica classe e este comportamento herdado
por todas suas subclasses. Uma subclasse precisa apenas
implementar as diferenas em relao a sua classe pai, ou seja,
adaptar-se ao meio em que vive.

14.1.1. Definindo Superclasses e Subclasses

Para herdar uma classe usamos a palavra-chave extends.


Ilustraremos criando uma classe pai de exemplo. Suponha que
tenhamos uma classe pai chamada Person.

public class Person {


protected String name;
protected String address;
/**
* Construtor Padro
*/
public Person(){
System.out.println("Inside
Person:Constructor");
name = "";
address = "";
}
/**
* Construtor com 2 parmetros
*/
public Person( String name, String address ){

125
this.name = name;
this.address = address;
}
/**
* Mtodos modificadores e acessores
*/
public String getName(){
return name;
}
public String getAddress(){
return address;
}
public void setName( String name ){
this.name = name;
}
public void setAddress( String add ){
this.address = add;
}
}

Os atributos name e address so declarados como


protected. A razo de termos feito isto que queremos que estes
atributos sejam acessveis s subclasses dessa classe. Se a
declararmos com o modificador private, as subclasses no
estaro aptas a us-los. Todas as propriedades de uma
superclasse que so declaradas como public, protected e
default podem ser acessadas por suas subclasses.
Vamos criar outra classe chamada Student. E, como um
estudante tambm uma pessoa, conclumos que iremos
estender a classe Person, ento, poderemos herdar todas as
propriedades existntes na classe Person. Para isto,
escrevemos:

public class Student extends Person {


public Student(){
System.out.println("Inside
Student:Constructor");
//Algum cdigo aqui
}
// Algum cdigo aqui
}

O fluxo de controle mostrado na figura da pgina


seguinte.

126
Quando a classe Student for instanciada, o construtor
padro da superclasse Person invocado implicitamente para
fazer as inicializaes necessrias. Aps isso, as instrues
dentro do construtor da subclasse so executadas. Para
ilustrar, considere o seguinte cdigo:

public static void main( String[] args ){


Student anna = new Student();
}

No cdigo, criamos um objeto da classe Student. O


resultado da execuo deste programa :

Inside Person:Constructor
Inside Student:Constructor

14.1.2. super

Uma subclasse pode, explicitamente, chamar um


construtor de sua superclasse imediata. Isso feito utilizando
uma chamada ao objeto super. Uma chamada ao super no
construtor de uma subclasse ir resultar na execuo de um
construtor especfico da superclasse baseado nos argumentos
passados.
Por exemplo, dada a seguinte instruo para a classe
Student:

public Student(){
super( "SomeName", "SomeAddress" );
System.out.println("Inside Student:Constructor");
}

Este cdigo chama o segundo construtor de sua


superclasse imediata (a classe Person) e a executa. Outro
cdigo de exemplo mostrado na prxima pgina:

127
public Student(){
super();
System.out.println("Inside Student:Constructor");
}

Este cdigo chama o construtor padro de sua


superclasse imediata (a classe Person) e o executa.
Devemos relembrar, quando usamos uma chamada ao
objeto super:

1. A instruo super() DEVE SER A PRIMEIRA INSTRUO EM


UM CONSTRUTOR.
2. As instrues this() e super() no podem ocorrer
imultaneamente no mesmo construtor.

O objeto super uma referncia aos membros da


superclasse (assim como o objeto this da sua prpria classe).
Por exemplo:

public Student() {
super.name = "person name"; // Nome da classe pai
this.name = "student name"; // Nome da classe atual
}

14.1.3. Override de Mtodos

Se, por alguma razo, uma classe derivada necessita que


a implementao de algum mtodo seja diferente da
superclasse, o polimorfismo por override pode vir a ser muito
til. Uma subclasse pode modificar um mtodo definido em sua
superclasse fornecendo uma nova implementao para aquele
mtodo.
Supondo que tenhamos a seguinte implementao para o
mtodo getName da superclasse Person:

public class Person {


...
public String getName(){
System.out.println("Parent: getName");
return name;
}
...
}

Para realizar um polimorfismo por override no mtodo


getName da subclasse Student, escrevemos:

public class Student extends Person {


...
public String getName(){
System.out.println("Student: getName");
return name;
}
...

128
}

Ento, quando invocarmos o mtodo getName de um


objeto da classe Student, o mtodo chamado ser o de Student,
e a sada ser:

Student: getName

possvel chamar o mtodo getName da superclasse,


basta para isso:

public class Student extends Person {


...
public String getName() {
super.getName();
System.out.println("Student: getName");
return name;
}
...
}

Inserimos uma chamada ao objeto super e a sada ser:


Parent: getName Student: getName

14.1.4. Mtodos final e Classes final

Podemos declarar classes que no permitem a herana.


Estas classes so chamadas classes finais. Para definir que uma
classe seja final, adicionamos a palavra-chave final na
declarao da classe (na posio do modificador). Por exemplo,
desejamos que a classe Person no possa ser herdada por
nenhuma outra classe, escrevemos:

public final class Person {


// Cdigo da classe aqui
}

Muitas classes na API Java so declaradas final para


certificar que seu comportamento no seja herdado e,
possivelmente , modificado. Exemplos, so as classes Integer,
Double e Math.
Tambm possvel criar mtodos que no possam ser
modificados pelos filhos, impedindo o polimorfismo por override.
Estes mtodos so o que chamamos de mtodos finais. Para
declarar um mtodo final, adicionamos a palavra-chave final na
declarao do mtodo (na posio do modificador). Por exemplo,
se queremos que o mtodo getName da classe Person
no possa ser modificado, escrevemos:

public final String getName(){


return name;

129
}

Caso o programador tente herdar uma classe final,


ocorrer um erro de compilao. O mesmo acontecer ao se
tentar fazer um override de um mtodo final.

14.2. Polimorfismo

Considerando a classe pai Person e a subclasse Student


do exemplo anterior, adicionaremos outra subclasse a Person,
que se chamar Employee. Abaixo est a hierarquia de classes
que
ilustra o cenrio:

Podemos criar uma referncia do tipo da superclasse para


a subclasse. Por exemplo:

public static main( String[] args ) {


Person ref;
Student studentObject = new Student();
Employee employeeObject = new Employee();
ref = studentObject; //Person ref: ponteiro para um Student
// algum cdigo aqui
}

Supondo que tenhamos um mtodo getName em nossa


superclasse Person, iremos realizar uma modificao deste nas
subclasses Student e Employee:

public class Person {


public String getName(){
System.out.println("Person Name:" + name);
return name;
}
}
public class Student extends Person {
public String getName(){
System.out.println("Student Name:" +
name);
return name;
}
}
public class Employee extends Person {
public String getName(){
System.out.println("Employee Name:" +
name);
return name;
130
}
}
Voltando ao mtodo main, quando tentamos chamar o
mtodo getName da referncia ref do tipo Person, o mtodo
getName do objeto Student ser chamado. Agora, se
atribuirmos ref
ao objeto Employee, o mtodo getName de Employee ser
chamado.

public static main(String[] args) {


Person ref;
Student studentObject = new Student();
Employee employeeObject = new Employee();
ref = studentObject; //ponteiro de referncia para um
Student
String temp = ref.getName(); //getName de Student
chamado
System.out.println(temp);
ref = employeeObject; // ponteiro de referncia Person
para um
// objeto Employee
String temp = ref.getName(); // getName de Employee
// classe chamada
System.out.println(temp);
}

A capacidade de uma referncia mudar de


comportamento de acordo com o objeto a que se refere
chamada de polimorfismo. O polimorfismo permite que
mltiplos objetos de diferentes subclasses sejam tratados como
objetos de uma nica superclasse, e que automaticamente
sejam selecionados os mtodos adequados a serem aplicados a
um objeto em particular, baseado na subclasse a que ele
pertena.
Outro exemplo que demonstra o polimorfismo realizado
ao passar uma referncia a mtodos.
Supondo que exista um mtodo esttico
printInformation que recebe como parmetro um objeto do tipo
Person, pode-se passar uma referncia do tipo Employee e do
tipo Student,
porque so subclasses do tipo Person.

public static main(String[] args) {


Student studentObject = new Student();
Employee employeeObject = new Employee();
printInformation(studentObject);
printInformation(employeeObject);
}
public static printInformation(Person p){
...

131
}

14.3. Classes Abstratas

Para criar mtodos em classes devemos,


necessariamente, saber qual o seu comportamento. Entretanto,
em muitos casos no sabemos como estes mtodos se
comportaro na classe que
estamos criando, e, por mera questo de padronizao,
desejamos que as classes que herdem desta classe possuam,
obrigatoriamente, estes mtodos.
Por exemplo, queremos criar uma superclasse chamada
LivingThing. Esta classe tem certos mtodos como breath, sleep
e walk. Entretanto, existem tantos mtodos nesta superclasse
que no podemos generalizar este comportamento. Tome por
exemplo, o mtodo walk (andar). Nem todos os seres vivos andam
da mesma maneira. Tomando os humanos como exemplo, os
humanos andam sobre duas pernas, enquanto que outros seres
vivos como os ces andam sobre quatro. Entretanto, existem
muitas caractersticas que os seres vivos tm em comum, isto o
que ns queremos ao criar uma superclasse geral.

Para realizarmos isto, teremos que criar uma superclasse


que possua alguns mtodos com implementaes e outros no.
Este tipo de classe chamada de classe abstrata.
Uma classe abstrata uma classe que no pode gerar um
objeto. Freqentemente aparece no topo de uma hierarquia de
classes no modelo de programao orientada a objetos.
Os mtodos nas classes abstratas que no tm
implementao so chamados de mtodos abstratos. Para criar
um mtodo abstrato, apenas escreva a assinatura do mtodo sem
o corpo e use a palavra-chave abstract. Por exemplo:

public abstract void someMethod();

Agora, vamos criar um exemplo de classe abstrata:

public abstract class LivingThing {


public void breath(){
System.out.println("Living Thing breathing...");
}
public void eat(){
System.out.println("Living Thing eating...");
}
/**
* mtodo abstrato walk
* Queremos que este mtodo seja criado pela
* subclasse de LivingThing
*/
132
public abstract void walk();
}

Quando uma classe estende a classe abstrata Dicas de


LivingThing, ela obrigada a implementar o mtodo abstrato programao:
Use classes
walk. Por exemplo: abstratas para definir
muitos tipos de
public class Human extends LivingThing { comportamentos no
public void walk(){ topo de uma
System.out.println("Human walks..."); hierarquia de classes
de programao
} orientada a objetos.
} Use suas subclasses
para prover detalhes
Se a classe Human no implementar o mtodo walk, ser de implementao da
mostrada a seguinte mensagem de erro de compilao: classe abstrata.

Human.java:1: Human is not abstract and does not


override abstract
method walk() in LivingThing
public class Human extends LivingThing
^
1 error

14.4. Interfaces

Uma interface um tipo especial de classe que contm


unicamente mtodos abstratos ou atributos finais. Interfaces,
por natureza, so abstratas.
Interfaces definem um padro e o caminho pblico para
especificao do comportamento de classes. Permitem que
classes, independente de sua localizao na estrutura
hierrquica, implementem comportamentos comuns.

14.4.1. Porque utilizar Interfaces?

Utilizamos interfaces quando queremos classes no


relacionadas que implementem mtodos similares. Atravs de
interfaces, podemos obter semelhanas entre classes no
relacionadas sem forar um relacionamento artificial entre elas.
Tomemos como exemplo a classe Line, contm mtodos
que obtm o tamanho da linha e compara o objeto Line com
objetos de mesma classe. Considere tambm que tenhamos
outra classe, MyInteger, que contm mtodos que comparam
um objeto MyInteger com objetos da mesma classe. Podemos
ver que ambas classes tm os mesmos mtodos similares que
os comparam com outros objetos do mesmo tipo, entretanto eles
no so relacionados. Para se ter certeza de que essas classes
implementem os mesmos mtodos com as mesmas
assinaturas, utilizamos as interfaces. Podemos criar uma
interface Relation que ter declarada algumas assinaturas de
mtodos de comparao. A interface Relation pode ser
implementada da seguinte forma:

public interface Relation {


public boolean isGreater(Object a, Object b);
133
public boolean isLess(Object a, Object b);
public boolean isEqual(Object a, Object b);
}

Outra razo para se utilizar interfaces na programao de


objetos revelar uma interface de programao de objeto sem
revelar essas classes. Como veremos mais adiante, podemos
utilizar uma interface como tipo de dados.
Finalmente, precisamos utilizar interfaces como
mecanismo alternativo para herana mltipla, que permite s
classes em ter mais de uma superclasse. A herana mltipla no
est
implementada em Java.

14.4.2. Interface vs. Classe Abstrata

A principal diferena entre uma interface e uma classe


abstrata que a classe abstrata pode possuir mtodos
implementados (reais) ou no implementados (abstratos). Na
interface, todos os mtodos so obrigatoriamente abstratos e
pblicos, tanto que para esta, a palavrachave abstract ou public
opcional.

14.4.3. Interface vs. Classe

Uma caracterstica comum entre uma interface e uma


classe que ambas so tipos. Isto significa que uma interface
pode ser usada no lugar onde uma classe esperada. Por
exemplo, dadas a classe Person e a interface PersonInterface,
as seguintes declaraes so vlidas:

PersonInterface pi = new Person();


Person pc = new Person();

Entretanto, no se pode criar uma instncia de uma


interface sem implement-la. Um exemplo disso :

PersonInterface pi = new PersonInterface(); //ERRO DE


//COMPILAO !!!

Outra caracterstica comum que ambas, interfaces e


classes, podem definir mtodos, embora uma interface no
possa t-los implementados. J uma classe pode.

14.4.4. Criando Interfaces

Para criarmos uma interface, utilizamos:

[public] [abstract] interface <NomeDaInterface> {


< [public] [final] <tipoAtributo> <atributo> = <valorInicial>;
>*

134
< [public] [abstract] <retorno>
<nomeMetodo>(<parametro>*); >*
}

Como exemplo, criaremos uma interface que define o


relacionamento entre dois objetos de acordo com a "ordem
natural" dos objetos:

interface Relation {
boolean isGreater(Object a, Object b);
boolean isLess(Object a, Object b);
boolean isEqual( Object a, Object b);
}

Para implementar esta interface, usaremos a palavra


chave "implements". Por exemplo:
/**
* Esta classe define um segmento de linha
*/
public class Line implements Relation {
private double x1;
private double x2;
private double y1;
private double y2;
public Line(double x1, double x2, double y1, double y2) {
this.x1 = x1;
this.x2 = x2;
this.y2 = y2;
this.y1 = y1;
}
public double getLength(){
double length = Math.sqrt((x2-x1)*(x2-x1)+(y2-
y1)*(y2-y1));
return length;
}
public boolean isGreater( Object a, Object b){
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen > bLen);
}
public boolean isLess( Object a, Object b){
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen < bLen);
}
public boolean isEqual( Object a, Object b){
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen == bLen);
}
}

135
Quando a classe implementa uma interface, deve-se
implementar todos os mtodos desta, caso contrrio ser
mostrado o erro:
Line.java:4: Line is not abstract and does not override
abstract
method isGreater(java.lang.Object,java.lang.Object) in
Relation
public class Line implements Relation
^
1 error

14.4.5. Relacionamento de uma Interface para uma Classe

Como vimos nas sees anteriores, a classe pode


implementar uma interface e para isso prover o cdigo de
implementao para todos os mtodos definidos na interface.
Outro detalhe a se notar na relao entre uma interface e uma
classe. A classe pode apenas estender uma nica superclasse,
mas pode implementar diversas interfaces. Um exemplo de uma
classe que implementa diversas interfaces:

public class Person


implements PersonInterface, LivingThing,
WhateverInterface {
//algumas linhas de cdigo
}

Outro exemplo de uma classe que estende de outra


superclasse e implementa interfaces:

public class ComputerScienceStudent extends Student


implements PersonInterface, LivingThing {
// algumas linhas de cdigo
}

Uma interface no parte de uma hierarquia de classes.


Classes no relacionadas podem implementar a mesma
interface.

14.4.6. Herana entre Interfaces

Interfaces no so partes de uma hierarquia de classes.


Entretanto, interfaces podem ter relacionamentos entre si. Por
exemplo, suponha que tenhamos duas interfaces,
StudentInterface e PersonInterface. Se StudentInterface
estende PersonInterface,
esta herda todos os mtodos declarados em PersonInteface.

public interface PersonInterface {


...
}
public interface StudentInterface extends PersonInterface {
... 136
}
EXERCCIOS

1. Neste exerccio, queremos criar um registro mais


especializado de Student que contm informaes adicionais
sobre um estudante de Cincia da Computao. Sua tarefa
estender a classe StudentRecord que foi implementada nas
lies anteriores e acrescentar atributos e mtodos que so
necessrios para um registro de um estudante de Cincia da
Computao. Utilize override para modificar alguns mtodos da
super

2. Crie uma classe abstrata chamada Shape com os mtodos


abstratos getArea() e getName(). Escreva duas de suas
subclasses Circle e Square. E acrescente mtodos adicionais a
estas subclasses. classe StudentRecord, caso seja necessrio.

137
15. Tratamento bsico de excees
15.1. O que so Excees (Exception)?

Uma exceo um evento que interrompe o fluxo normal


de processamento de uma classe.
Este evento um erro de algum tipo. Isto causa o trmino
anormal da classe.
Estes so alguns dos exemplos de excees que podem
ter ocorridos em exerccios anteriores:

ArrayIndexOutOfBoundsException, ocorre ao acessar um


elemento inexistente de um array.
NumberFormatException, ocorre ao enviar um parmetro
no-numrico para o mtodo Integer.parseInt().

15.2. Tratando Excees

Para tratar excees em Java utilizamos a declarao try-


catch-finally. O que devemos fazer para proteger as instrues
passveis de gerar uma exceo, inser-las dentro deste bloco.

A forma geral de um try-catch-finally :

try{
// escreva as instrues passveis de gerar uma exceo
// neste bloco
}catch (<exceptionType1> <varName1>){
// escreva a ao que o seu programa far caso ocorra
// uma exceo de um determinado
}. . .
}catch (<exceptionTypen> <varNamen>){
// escreva a ao que o seu programa far caso ocorra
// uma exceo de um determinado tipo
}finally {
// escreva a ao que o seu programa executar caso
ocorra
// ou no um erro ou exceo
}

Excees geradas durante a execuo do bloco try


podem ser detectadas e tratadas num bloco catch. O cdigo no
bloco finally sempre executado, ocorrendo ou no a exceo.

A seguir so mostrados os principais aspectos da sintaxe


da construo de um try-catchfinally:

? A notao de bloco obrigatria.


? Para cada bloco try, pode haver um ou mais blocos
catch, mas somente um bloco finally.

138
? Um bloco try deve que ser seguido de PELO MENOS um
bloco catch OU um bloco
? finally, ou ambos.
? Cada bloco catch define o tratamento de uma exceo.
? O cabealho do bloco catch recebe somente um
argumento, que a exceo (Exception) que este bloco
pretende tratar.
? A exceo deve ser da classe Throwable ou de uma de
suas subclasses.

Para um melhor entendimento, observe a figura 1 que


demonstra o fluxo seguido pelo trycatch-finally:

Tomemos, por exemplo, uma classe que imprime o


segundo argumento passado atravs da linha de comandos.
Supondo que no h verificao no cdigo para o nmero de
argumentos.

public class ExceptionExample {


public static void main( String[] args ) {
System.out.println(args[1]);
System.out.println("Finish");
}
}

Ao executar esta classe sem informar nenhum argumento


e, ao tentar acessar diretamente, conforme o exemplo descrito, o
segundo argumento args[1], uma exceo obtida que
interromper a execuo normal do programa, e a seguinte
mensagem ser mostrada:
139
E x c e p t i o n i n t h r e a d " m a i n "
java.lang.ArrayIndexOutOfBoundsException: 1
at ExceptionExample.main(ExceptionExample.java:5)

Para prevenir que isto ocorra, podemos colocar o cdigo


dentro de um bloco try-catch. O bloco finally opcional. Neste
exemplo, no utilizaremos o bloco finally.

public class ExceptionExample


{
public static void main( String[] args ){
try {
System.out.println( args[1] );
}catch (ArrayIndexOutOfBoundsException exp)
{
System.out.println("Exception caught!");
}
System.out.println("Finish");
}
}

Assim, quando tentarmos rodar o programa novamente


sem a informao dos argumentos, a sada trataria a exceo e o
fluxo do programa no seria interrompido, mostrando o resultado:

Exception caught!
Finish

EXERCCIOS

1. 1. Capturando Excees 1
Dada a seguinte classe:

public class TestException {


public static void main(String[] args) {
for (int i=0; true; i++) {
System.out.println("args["+i+"]="+ args[i]);
}
System.out.println("Quiting...");
}
}

Compile e rode a classe TestException. E como sada ser:

java TestExceptions one two three


args[0]=one
args[1]=two
args[2]=three
Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException: 3
at TestExceptions.main(1.java:4)

140
Modifique a classe TestException para tratar esta exceo. A
sada depois do tratamento da exceo dever ser:

java TestExceptions one two three


args[0]=one
args[1]=two
args[2]=three
E x c e p t i o n c a u g h t :
java.lang.ArrayIndexOutOfBoundsException: 3
Quiting...

2. Capturando Excees 2
H uma boa chance de que algumas classes escritas
anteriormentes tenham disparados excees. Como as
excees no foram tratadas, simplesmente interromperam a
execuo.
Retorne a estes programas e implemente o tratamento de
excees.

141
A01 EXERCCIOS ADICIONAIS
1. Agenda Telefnica
Escrever um programa que cria uma agenda telefnica na qual
seja possvel acrescentar, excluir, visualizar e pesquisar os
registros. O usurio deve ter a possibilidade de visualizar todos
registros por ordem alfabtica ou por ordem crescente de
nmeros de telefone. Na pesquisa por registros, o usurio deve
ter a opo de pesquisar por nome ou por nmero de telefone. Na
pesquisa pelo nome, o usurio deve ter uma opo em que possa
selecionar se a pesquisa ser efetuada com base no primeiro ou
ltimo nome.

MENU PRINCIPAL
1 Adicionar registro na agenda telefnica
2 Excluir registro da agenda telefnica
3 Visualizar todos os registros
a ordem alfabtica
b ordem numrica crescente de nmero de telefone
4 Pesquisa de registros
a por nome
1 pelo primeiro nome
2 pelo ltimo nome
b por nmero de telefone
5 Sair

Esse um exemplo da aplicao rodando:


Adicionar registro na agenda telefnica
Digite o Nome:
Digite o nmero do Telefone:
(* Se o registro j existir, avise o operador da existncia do
registro)
Visualizar todos os registros
Mostra todos os registros em ordem alfabtica
Mostra todos os registros em ordem crescente de nmero de
telefone
Pesquisa registros
Pesquisa agenda telefnica por nome
Pesquisa agenda telefnica pelo primeiro nome
Pesquisa agenda telefnica pelo ltimo nome
Pesquisa agenda telefnica por nmero do telefone
Sair
Fechar agenda telefnica

2. Caa-Minas
Este jogo uma verso simplificada do popular jogo de
computador Caa-minas (minesweeper). Inicialmente,
questionado se o usurio quer jogar numa grade de 5x5 ou
numa grade de 10x10. Voc tem 2 arrays bidimensionais que
contm informaes sobre a grade selecionada. Um registro
desse array pode conter 0 ou 1. O valor 1 significa que existe
uma bomba nessa localizao e o valor 0 se no existir.

142
Por exemplo, dado o seguinte array:
int bombList5by5[][]={{0, 0, 1, 0, 0},
{0, 0, 0, 0, 0},
{0, 1, 0, 0, 0},
{0, 0, 0, 1, 1},
{0, 1, 1, 0, 0}};

Dada a lista de bombas, temos 6 bombas nessa lista. As bombas


esto localizadas nas clulas (linha,coluna), (0,2), (2,1), (3,3),
(3,4), (4,1) e (4,2).
Se o usurio escolhe uma clula que contenha uma bomba, o jogo
acaba e todas as bombas so mostradas. Se o usurio escolhe
uma clula que no contenha uma bomba, um nmero mostrado
naquela posio indicando a quantidade de clulas vizinhas que
contm bombas. O jogo dever terminar quando todas as clulas
que no contenham bombas tiverem sido marcadas (jogador
vence) ou quando o usurio seleciona uma bomba (jogador
perde).
Segue um exemplo de tela do jogo quando selecionada uma
grade 5x5 que tenha o mesmo contedo do array bombList5by5
acima.
Benvindo ao Caa-Minas!
Escolha o tamanho da grade(Digite 1 para 5x5, Digite 2 para
10x10): 1
[][][][][]
[][][][][]
[][][][][]
[][][][][]
[][][][][]
Digite linha e coluna da clula que voc quer abrir[linha coluna]: 1
1
[][][][][]
[ ] [2] [ ] [ ] [ ]
[][][][][]
[][][][][]
[][][][][]
Digite linha e coluna da clula que voc quer abrir[linha coluna]: 3
2
[][][][][]
[ ] [2] [ ] [ ] [ ]
[][][][][]
[ ] [ ] [4] [ ] [ ]
[][][][][]
Digite linha e coluna da clula que voc quer abrir[linha coluna]: 0
2
[ ] [ ] [X] [ ] [ ]
[ ] [2] [ ] [ ] [ ]
[][][][][]
[ ] [ ] [4] [ ] [ ]
[][][][][]
Ooppps! Voc pisou numa bomba. Sinto muito, o jogo acabou e
voc perdeu!

143
3. Converso Numrica
Criar uma calculadora cientfica que converta os nmeros
digitados para as quatro representaes numricas: decimal,
binrio, octal e hexadecimal. O projeto deve gerar o seguinte
menu na tela.

MENU PRINCIPAL:
Por favor, selecione o tipo de converso:
1 Binrio para Decimal
2 Decimal para Octal
3 Octal para Hexadecimal
4 Hexadecimal para Binrio
5 Sair

A seguinte tela deve ser mostrada quando uma das opes do


menu for escolhida.
Seleo 1: Digite um nmero binrio: 11000
11000 base 2 = 24 base 10 (volta para o menu principal)
Seleo 2: Digite um nmero Decimal: 24
24 base 10 = 30 base 8 (volta para o menu principal)
Seleo 3: Digite um nmero Octal: 30
30 base 8 = 18 base 16 (volta para o menu principal)
Seleo 4: Digite um nmero Hexadecimal: 18
18 base 16 = 11000 base 2
Seleo 1: Digite um nmero Binrio: 110A
Nmero binrio invlido!
Digite um nmero binrio: 1
1 base 2 = 1 base 10 (volta para o menu principal)
Usurio selecionou 5
Tchau!

144
Bibliografia
Livros textos:
DEITEL, H. M. e DEITEL, P. J. JAVA: como programar. 6 Ed.
Porto Alegre: Pearson, 2005.

Livros de referncia:
DEITEL, H. M. e DEITEL, P. J. JAVA: como programar. 3 Ed.
Porto Alegre: Bookman, 2001.

PRESSMAN, R. Software Engineering: A Pratctitioners


Approach. 5 Ed. So Paulo, Mc Graw-Hill, 2000.

SOMMERVILLE, Ian. Engenharia de Software. 8 Ed. Pearson,


2004.

GONALVES, Edson. Dominando Netbeans Construa


Aplicativos Java Tanto em Desktop, Como para
Web.CIENCIA MODERN, 2007.

BORATTI, Isaias Camilo. Programao Orientada A Objetos


em Java. VISUAL BOOKS, 2007.

BOENTE, Alfredo. Aprendendo a Programar em Java 2:


Orientado a Objetos. Brasport. Rio de Janeiro, 2003.

ASCENCIO, Ana Fernanda Gomes e CAMPOS, Edilene


Aparecida Veneruchi. Fundamentos da Programao de
Computadores - Algoritmos, Pascal, C/C++ E Java. Pearson,
2007.

CADENHEAD, Rogers. Aprenda em 21 Dias Java 2. 4 Ed.


Campus, 2005.

RUBINSTEIN, Roberto. Certificao Java 5


SERSON, Brasport, 2006.

151
Sobre o autor

Doutorando em Biotecnologia pelo programa RENORBIO (2006).


Mestre em Cincias da Computao pela Universidade Federal de
Minas Gerais (1997). Graduado em Fsica pela Universidade
Federal do Piau (1991). Experincia em Computao e
informtica, atuando principalmente nas reas de: redes de
computadores, modelagem de sistemas e bioinformtica.

Currculo Lattes: http://lattes.cnpq.br/5095626292200565

152

Você também pode gostar