Você está na página 1de 176

Universidade Federal do Piau

Centro de Educao Aberta e a Distncia

ALGORITMOS E
PROGRAMAO
II
Magno Santos
Ministrio da Educao - MEC
Universidade Aberta do Brasil - UAB
Universidade Federal do Piau - UFPI
Universidade Aberta do Piau - UAPI
Centro de Educao Aberta a Distncia - CEAD

ALGORITMOS E PROGRAMAO II

Magno Santos
PRESIDENTE DA REPBLICA Luiz Incio Lula da Silva
MINISTRIO DA EDUCAO Fernando Haddad
GOVERNADOR DO ESTADO Wilson Nunes Martins
REITOR DA UNIVERSIDADE FEDERAL DO PIAU Luiz de Sousa Santos Jnior
SECRETRIO DE EDUCAO A DISTNCIA DO MEC Carlos Eduardo Bielshowsky
PRESIDENTE DA CAPES Jorge Almeida Guimares
COORDENADORIA GERAL DA UNIVERSIDADE ABERTA DO BRASIL Celso Costa
DIRETOR DO CENTRO DE EDUCAO ABERTA A DISTNCIA DA UFPI Gildsio Guedes Fernandes

CONSELHO EDITORIAL Prof. Dr. Ricardo Alaggio Ribeiro ( Presidente )


Des. Tomaz Gomes Campelo
Prof. Dr. Jos Renato de Arajo Sousa
Prof. Dr. Teresinha de Jesus Mesquita Queiroz
Prof. Francisca Maria Soares Mendes
Prof. Iracildes Maria de Moura F Lima
Prof. Dr. Joo Renr Ferreira de Carvalho

COORDENAO DE MATERIAL DIDTICO Cleidinalva Maria Barbosa Oliveira


COORDENAO DE REVISO Nazioznio Antonio Lacerd
PROJETO GRFICO Samuel Falco Silva
DIAGRAMAO Giselle da Silva Castro
REVISO Francisca das Dores Oliveira Arajo
REVISOR GRFICO Genuvina de Lima Melo Neta

A responsabilidade pelo contedo e imagens desta obra do autor. O contedo desta obra foi licenciado tem-
porria e gratuitamente para utilizao no mbito do Sistema Universidade Aberta do Brasil, atravs da UFPI.
O leitor se compromete a utilizar o contedo desta obra para aprendizado pessoal, sendo que a re-
produo e distribuio ficaro limitadas ao mbito interno dos cursos. A citao desta obra em trabalhos
acadmicos e/ou profissionais poder ser feita com indicao da fonte. A cpia deste obra sem autorizao
expressa ou com intuito de lucro constitui crime contra a propriedade intelectual, com sanses previstas no
Cdigo Penal.
Este livro 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) e Instituto Federal
de Educao, Cincia e Tecnologia do Piau (IFPI), com apoio do Governo
do Estado do Piau, atravs da Secretaria de Educao (SEDUC).
O texto deste compndio composto de quatro unidades,
contendo quinze sub-unidades, estruturadas de modo sequencial, nas
quais se discute sobre os fundamentos da programao de computadores
orientada a objetos.
Na Unidade 1, discutiremos sobre 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. Mostraremos 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, sero apresentadas as estruturas de controle de
um programa em Java; exemplificaremos 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, abordaremos as estruturas de dados de arranjos
homogneos e heterogneos. Trabalharemos exemplos com vetores,
matrizes e adicionalmente passagem de parmetros como argumentos
para um programa
Na Unidade 4, sero expostos contedos sobre o paradigma da
programao orientada a objetos. Focaremos nas definies e exemplos
de classe, objeto, mensagem; e ainda, apresentaremos caractersticas
UNIDADE 1
09 Fundamentos de Programao Orientada a Objetos

Introduo Engenharia de Software................................................. 11


Introduo Programao de Computadores.................................... 25
Histrico da Linguagem Java............................................................... 32
Instalao do Java e do NetBeans....................................................... 37
Primeiro Programa Java com a IDE NetBeans..................................... 42
Entrada e Sada de Dados.................................................................... 54

UNIDADE 2
62 Estruturas de Controle

Estrutura de Controle de Deciso: if-then-else, switch . .....................65


Estrutura de Controle de Repetio: while, do-while, for...................75
Estrutura de Interrupo: break, continue, return .............................82

UNIDADE 3
89 Arranjos e Argumentos

Array em Java...................................................................................... 91
Argumentos em Java........................................................................... 98

UNIDADE 4
105 Paradigma de Programao Orientada a Objetos

Classes, Objetos e Mtodos.............................................................. 107


Definio de Classe em Java.............................................................. 128
Herana, Polimorfismo e Interfaces.................................................. 149
Tratamento Bsico de Excees........................................................ 163

Referncias Bibliogrficas
UNIDADE 01

Fundamentos de Programao
Orientada a Objetos

OBJETIVOS:
Orientar na gerao de um cdigo simples, dentro dos padres
mnimos exigidos pela Engenharia de Software.
Fundamentos de
Programao
Orientada a Objetos

Introduo Engenharia de Software

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, e tambm utilizada
para avaliar e gerenciar projetos de desenvolvimento de software.
Engenharia de software vista de modo diferente pelos diversos
profissionais. Pressman tem 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.

Ferramentas

Mtodo

Processo

Foco na Qualidade

Foco na qualidade

Essa camada busca um total foco na qualidade. uma cultura em
que o compromisso com a melhoria no processo de desenvolvimento do
software sustentado, permitindo o desenvolvimento de mais abordagens

Algoritmos e Programao II 11
efetivas para engenharia de software.

Processo

Define uma estrutura, que consiste em reas de processos-chave,
que define e permite a entrega racional 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.

Mtodo

Mtodos definem procedimentos sistemticos e ordenados de
construo de software, proporcionando uma estrutura global interna
em que 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, que usa
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

12 UNIDADE 01
Ferramentas

Promovem o suporte aos processos e mtodos. Ferramentas


CASE (Computer Aided Software Engineeing) proporcionam um sistema
de suporte ao projeto de desenvolvimento, em que as informaes
criadas por uma ferramenta podem ser usadas por outras. Podem ser
automticas ou semiautomticas.
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:
Diagrama de Entidade-Relacionamento
Diagrama de fluxo de dados
Pseudocdigo
Fluxograma

Abordagem de modelo de ferramenta orientada a objeto:


Linguagem de Modelagem Unificada (UML)

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 precisa
definir explicitamente que qualidade de software ter um conjunto de
atividades assegurando 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.

Algoritmos e Programao II 13
O que qualidade?

Qualidade a caracterstica total de uma entidade para satisfazer


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

Como definimos qualidade?

Trs perspectivas so usadas na compreenso da qualidade,


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

Qualidade do produto

muito relativo analisar qualidade, pois apresenta significados


diferentes para cada pessoa. Para os usurios finais, o software possui
qualidade se fornecer-lhes o que desejam e quando desejam o tempo
todo. Tambm julgado baseado na facilidade de uso e na forma de
aprendizagem de como us-lo.
Normalmente, os usurios avaliam e categorizam o software
com base em caractersticas externas, tal como nmero de falhas por
tipo. Essas falhas podem ser categorizadas como insignificantes, ou
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.
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

14 UNIDADE 01
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.
Essa organizao 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 proporcionada 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?

Como endereamos os pontos importantes sobre qualidade?

Podemos enderear os pontos importantes sobre qualidade em:


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

Algoritmos e Programao II 15
uma perda potencial, so indevidamente otimistas em seus planos e
projees, e preferem usar julgamentos intuitivos em vez 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 so a base para definir as caractersticas da
qualidade de software.

Tcnicas e garantias de qualidade de software

Garantia de qualidade de Software um subconjunto da engenharia


de software assegurando que todos os produtos de trabalho sejam
realizados, e que cumpram com as exigncias e padres estabelecidos
pelos usurios. considerada uma das atividades mais importantes,
sendo 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.

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.
1. Requisitos de software so a base para a qualidade do software.

16 UNIDADE 01
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.

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.

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;

Algoritmos e Programao II 17
Procedimentos de erros reportados e monitorados;
Documentos que devem ser produzidos;
Conjunto de respostas que se fizer necessrio.

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


desenvolvimento de software. J o time de desenvolvedores 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.

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.
Consequentemente, 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;

18 UNIDADE 01
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, e o tom da reviso 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 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; isso
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 conduz a
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, ajudando
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.

Algoritmos e Programao II 19
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, dados etc. Isso gerenciado por um
moderador que responsvel por supervisionar a reviso e 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
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, e os materiais so inspecionados minuciosamente para que
seja encontrado o mximo nmero de possveis erros.
Estatsticas com os tipos de erros so vitais e 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,
decidindo 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. Apenas 30 minutos de apresentao
do projeto dos inspetores o suficiente, e isso pode ser omitido se todos
estiverem bem familiarizados com o projeto.

20 UNIDADE 01
Preparando. Cada inspetor ter de 1 a 2 horas sozinho para
inspecionar o produto de trabalho e ir executar as regras passadas a ele
com base na documentao provida pelo moderador, tentando descobrir
defeitos no produto de trabalho. O inspetor no dever reparar defeitos
ou criticar o desenvolvedor do produto de trabalho.
Realizando a reunio. Os participantes da reunio 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, essa pesoa 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 esse moderador deve ser inspecionado por outro inspetor.
Realizando uma reunio ocasional de anlise. Isso 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.

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 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;

Algoritmos e Programao II 21
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 desenvolvedor do produto de trabalho agenda o walkthrough,
preferivelmente, com um dia de antecedncia ou dois no mximo.
Distribuir o material necessrio para o produto de trabalho dos
revisores.
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 desenvolvedor do produto de trabalho faz uma rpida
apresentao do seu produto de trabalho. Esse passo pode ser ignorado
caso os revisores conheam bem o produto de trabalho.
Solicitar comentrios aos revisores. s vezes, problemas so
levantados e apresentados, mas no devem ser solucionados durante
o walkthrough. Esses problemas devero ser includos em uma lista de
aes.
Uma lista de aes deve ser produzida at o fim do walkthrough.
Aps o walkthrough;
O desenvolvedor do produto de trabalho recebe a lista de aes.
Pede-se para enviar os estados das aes com o objetivo de
resolver erros ou discrepncias apresentadas na lista de aes.
Possivelmente, um outro walkthrough deve ser agendado.

Documentao no esforo de desenvolvimento

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

22 UNIDADE 01
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.

Se o manual do usurio for Ento, o manual pode...


desenvolvido durante....
A definio do produto Clarear procedimentos e regras.
Identificar elementos no amigveis.
Aumentar as chances de satisfao
do cliente.
O projeto e codificao Clarear problemas e erros.
Identificar causas de inconsistncias.
Forar o projetista a tomar decises
mais cedo.

Algoritmos e Programao II 23
A distribuio e uso do sistema Ajudar os usurios a se adaptarem ao
sistema.
Alertar sobre problemas no sistema.
Negar responsabilidades.

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
infraestrutura envolvida em uma execuo de um projeto real como:
cenrios, documentao do projeto interno, relatrio de reunies e
problemas.

1. Discuta a viso em camadas, tendo em vista no gerenciamento e


desenvolvimento do software.
2. Qualidade do software a caracterstica que satisfaz as necessidades
declaradas e implcitas do contratante. Como mensurar essa caracterstica
de modo que possa ser comparada a padres conhecidos?

3. Pesquisar, 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 aanuteno 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.
5. Documente o cdigo abaixo.
public class Documento {
public static void main( String args[] ) {
System.out.println( "Cdigo documentado!" ); {
}
}

24 UNIDADE 01
Desafio:

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 o papel de cada um no processo de engneharia do software.

Introduo Programao de Computadores

O que uma linguagem de programao?

Linguagem de programao uma tcnica de comunicao


padronizada para 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 esses 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.

Categorias das linguagens de programao

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

Algoritmos e Programao II 25
Linguagens de montagem de baixo nvel

Linguagens de montagem so similares s linguagens de mquina,


so mais simples de programar, pois possuem poucos comandos e
permitem ao programador substituir nomes por nmeros. Linguagens de
montagem esto disponveis em cada famlia de CPU, e cada instruo
de montagem traduzida em uma instruo de mquina por um programa
montador.

Nota: Os termos "alto nvel" e "baixo nvel" so relativos.


Originalmente, linguagens de montagem eram consideradas
de baixo nvel e COBOL, C, etc. eram consideradas de alto
nvel. Muitos programadores, hoje em dia, podem se referir a
estas ltimas como linguagens de baixo nvel.

O ciclo de vida do desenvolvimento de programas

Programadores no sentam e simplesmente comeam a escrever


cdigo de uma vez, quando esto tentando fazer um programa de
computador. Ao invs disso, eles seguem um planejamento organizado
ou metodologia, que quebra o processo em uma srie de tarefas.
Este o ciclo de vida quando se tenta resolver um problema no
computador:

26 UNIDADE 01
Para entendermos o funcionamento desse 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.

Definir o problema

Geralmente, um programador recebe uma tarefa na forma de um


problema. Antes do programa 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.

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, esse passo se d com a quebra do problema em
subproblemas 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

Algoritmos e Programao II 27
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.
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:

28 UNIDADE 01
Expressando a soluo atravs de pseudocdigo:

Fazer NomeLista = Lista de Nomes


Fazer NomeChave = o nome a ser procurado
Fazer conta = 0
Para cada nome em NomeLista fazer
Se nome igual a NomeChave
Fazer Conta = Conta + 1
Mostrar Conta

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 sejam usados de maneira consistente.

Algoritmos e Programao II 29
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.

30 UNIDADE 01
Na maioria das vezes, depois do programador ter escrito o
programa, este poder no estar funcionando 100% no incio, mas
o programador pode corrigir o programa no caso de erros (tambm
conhecidos como Erros de Compilao) que ocorrem no programa. Esse
processo chamado de depurao de erros (debug).
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 houver um erro de sintaxe
no cdigo. Nesse caso, o compilador ir detectar o erro e o programa
nem mesmo compilar, sendo que o programador ficar 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. Assim, os compiladores no so
espertos o suficiente para pegar todos estes tipos de erro em tempo de
compilao, consequentemente, o programa compila corretamente em
um arquivo executvel.
Porm, 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.

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.

Algoritmos e Programao II 31
a) Assar po
b) Acessar o computador
c) Obter a mdia de trs nmeros
2. Com base na 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).

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.

Histrico da Linguagem Java

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

32 UNIDADE 01
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.

O que a tecnologia Java?

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.

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.

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.

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.

Algoritmos e Programao II 33
Algumas caractersticas do Java

Mquina Virtual Java

A Mquina Virtual Java uma mquina imaginria eque


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.

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 maneira para desalocar o bloco

34 UNIDADE 01
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 de 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.

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 nesses fragmentos por cdigos ilegais que possam violar o
direito de acesso aos objetos. Depois que tudo isso tiver sido feito, o
cdigo finalmente executado.

Fases do programa Java

A figura seguinte descreve o processo de compilao e execuo


de um programa Java.

Algoritmos e Programao II 35
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.
Tarefa Ferramenta utilizada Sada
Escrever o programa Qualquer editor de texto Arquivo com extenso .java
Compilar o programa Compilador Java Arquivo com extenso .class
(Java bytecode)
Executar o programa Interpretador Java Sada do programa

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.

36 UNIDADE 01
Instalao do Java e do NetBeans

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.

Algoritmos e Programao II 37
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.

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 isso, 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/* .

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

38 UNIDADE 01
Permissions, e marque a opo Execute.
Encerre a janela.

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, os termos da licena sero mostrados; caso

Algoritmos e Programao II 39
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 >.

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.

40 UNIDADE 01
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 .

possvel executar o NetBeans a partir de qualquer pasta,


digitando:
netbeans &

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.

Algoritmos e Programao II 41
Primeiro Programa Java com a IDE NetBeans

Antes de explicar o que o programa significa, vamos escrev-lo e


execut-lo.

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

42 UNIDADE 01
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.
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 essa pasta.
Para entrar nessa 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 compil-lo.
Certifique-se de que o arquivo est realmente dentro desta,

Algoritmos e Programao II 43
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:

java Hello

Veremos na mesma tela, em que foi executado o comando, a


seguinte mensagem:

Hello world!

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.

44 UNIDADE 01
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
maisculas por minsculas (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:

A primeira mensagem de erro sugere que existe um erro na linha


6 do programa apontado para a palavra void, entretanto, essa 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

Algoritmos e Programao II 45
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 tentar novamente compilar o programa.
Desse 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.

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.

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 (IDE - Integrated 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:

Depois de abrir a IDE NetBeans, ser mostrada a interface grfica


GUI, conforme a Figura:

46 UNIDADE 01
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.

Algoritmos e Programao II 47
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 MYJAVAPROGRAMS e depois d um clique no boto
"Open".

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

Passo 3: Escrever os detalhes do programa

Antes de escrever o programa, descreveremos a janela principal.


Como mostrado na prxima figura, automaticamente o NetBeans

Algoritmos e Programao II 49
cria um cdigo bsico para o programa Java. Poderemos adicionar
as declaraes nesse 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!");

Isso significa que voc deseja que seja mostrada a mensagem


"Hello world!" na sada padro do computador, e em seguida seja
feito um salto de linha. Poderamos substituir essa 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, e

50 UNIDADE 01
utilizaremos para este exemplo a primeira instruo. Insira esta instruo
aps a linha de comentrio (que ser desprezada pelo compilador):
//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.

Algoritmos e Programao II 51
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.

52 UNIDADE 01
O resultado final do programa, ser mostrado na janela de sada.

1. Baixe e instale o 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 pelos


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.

Algoritmos e Programao II 53
Entrada e Sada de Dados

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 o 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 = "";

54 UNIDADE 01
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;

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. Essas 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).

Algoritmos e Programao II 55
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.


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.

56 UNIDADE 01
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. }

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.
Veja a seguir o programa completo utilizando essa classe:

import java.util.Scanner;
public class GetInputFromScanner
{

Algoritmos e Programao II 57
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 esse servio.
Os principais mtodos que podemos utilizar, nesse caso, so:

58 UNIDADE 01
Mtodo Finalidade
next() Aguarda uma entrada em formato String
nextInt() Aguarda uma entrada em formato Inteiro
nextByte() Aguarda uma entrada em formato Inteiro
nextLong() Aguarda uma entrada em formato Longo
nextFloat() Aguarda uma entrada em formato Nmero Fracionrio
nextDoublet() Aguarda uma entrada em formato Nmero Fracionrio

Por fim, mostramos o resultado e encerramos o mtodo main e a


classe:

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


{
{

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);
{
{

esta classe apresentar o seguinte resultado:

Algoritmos e Programao II 59
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 acima. O resultado ser armazenado

60 UNIDADE 01
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 acima.

JOptionPane.showMessageDialog(null, msg;

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:

3. Execute o programa abaixo e veja o que aparece. Comente a

Algoritmos e Programao II 61
linhas do cdigo.

4. 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. }

Estrutura de Controle de Deciso: if-then-else switch

62 UNIDADE 01
UNIDADE 02

Estruturas de Controle

OBJETIVOS:
Desenvolver a capacidade e abstrao na especificao ds algoritmos
de acordo com os problemas apresentados.
Estruturas de
Controle

Estruturas de controle de deciso so instrues em linguagem


Java que permitem que blocos especficos de cdigo sejam escolhidos
para serem executados, redirecionando determinadas partes do fluxo do
programa.

Declarao if

Dicas de programao:
1. Expresso lgica uma declarao que possui um valor lgico.
Isso significa que
a execuo desta expresso deve resultar em um valor true ou false.
2. Coloque as instrues de forma que elas faam parte do bloco if.
Por exemplo:
if (expresso_lgica) {
// instruo1;
// instruo2;
}

A declarao if especifica que uma instruo ou bloco de instrues


seja executado se, e somente se, uma expresso lgica for verdadeira. A
declarao if possui a seguinte forma:

if (expresso_lgica)
instruo;

ou:

if (expresso_lgica) {

Algoritmos e Programao II 65
instruo1;
instruo2
...
}

onde, expresso_lgica representa uma expresso ou varivel


lgica.

true false
Condio
Lgica

Instruo
Caso TRUE

Por exemplo, dado o trecho de cdigo:

Instruo int grade = 68;


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

ou:

int grade = 68;


Instrues if (grade > 60) {
em bloco System.out.println("Congratulations!");
System.out.println("You passed!");
}

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:

66 UNIDADE 02
if (expresso_lgica)
instruo_caso_verdadeiro;
else
instruo_caso_falso;

Tambm podemos escrev-la na forma abaixo:

if (expresso_lgica) {
instruo_caso_verdadeiro1;
instruo_caso_verdadeiro2;
...
} else {
instruo_caso_falso1;
instruo_caso_falso2;
...
}

Dicas de programao:
1. Para evitar confuso, sempre coloque a instruo ou instrues
contidas no
bloco if ou if-else entre chaves {}.
2. Pode-se ter declaraes if-else dentro de declaraes if-else, por
exemplo:
if (expresso_lgica) {
if (expresso_lgica) {
...
} else {
...
}
} else {
...
}

Por exemplo, dado o trecho de cdigo:

int grade = 68;


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

Algoritmos e Programao II 67
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");
}

true false
Condio
Lgica

Instruo Instruo
Caso TRUE Caso FALSE

Declarao if-else-if

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


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

68 UNIDADE 02
instruo1 e salta as outras instrues. Caso contrrio, se a expresso_
lgica1 falsa,o fluxo de controle segue para a anlise lgica 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 {

Algoritmos e Programao II 69
System.out.println("Sorry, you failed.");
}
}
}

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) {
// algumas instrues aqui
}

3. Escrever elseif em vez de else if.

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

70 UNIDADE 02
Declarao switch

Notas:
1. Ao contrrio da declarao if, mltiplas instrues so executadas sem
a necessidade das chaves que determinam o incio e trmino de bloco {}.
2. Quando um case for selecionado, todas as instrues vinculadas ao
case sero executadas. Alm disso, as instrues dos case seguintes
tambm sero executadas.
3. Para prevenir que o programa execute instrues dos outros case
subsequentes, utilizamos a declarao break aps a ltima instruo de
cada case.

Outra maneira de indicar uma condio atravs de uma


declarao switch. A construo switch permite que uma nica varivel
inteira tenha mltiplas possibilidades de finalizao.

A declarao switch possui a seguinte forma:

switch (varivel_inteira) {
case valor1:
instruo1; //
instruo2; // bloco 1
... //
break;
case valor2:
instruo1; //
instruo2; // bloco 2
... //
break;
default:
instruo1 ; //
instruo2; // bloco n
... //
break;
}

Algoritmos e Programao II 71
Dicas de 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 valor de cada
clusula case seja nico.subsequentes; utilizamos a declarao
break aps a ltima instruo de cada case 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. Esse um bloco opcional. O bloco default no obrigatrio
na declarao switch.

72 UNIDADE 02
Exemplo para switch

public class Grade {


public static void main(String[] args) {
int grade = 92;
switch(grade) {
case 100:
System.out.println("Excellent!");
break;
case 90:
System.out.println("Good job!");
break;
case 80:
System.out.println("Study harder!");
break;
default:
System.out.println("Sorry, you failed.");
}

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.

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.

Algoritmos e Programao II 73
2. Solicite ao usurio para digitar um nmero, e mostre-o por extenso.
Esse nmero dever variar entre 1 e 10. Se o usurio introduzir um nmero
que no est nesse 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 1a 50 Kw, computa-se R$ 0,50 por Kw consumido
b) de 51a 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 );
}
}

74 UNIDADE 02
Estrutura de Controle de Repetio: while, do-while, for

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.

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;

Algoritmos e Programao II 75
...
}
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

76 UNIDADE 02
// a instruo do lao no ser executada
while (false)
System.out.println("hello");

Declarao do-while

A declarao do-while similar ao while. As instrues dentro do
lao do-while sero executadas pelo menos uma vez.
A declarao do-while possui a seguinte forma:

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

Dicas de programao:
1. Erro comum de programao ao utilizar o lao do-while
esquecer o ponto-e vrgula (;) aps a declarao while.
do {
...
} while (boolean_expression) // ERRADO -> faltou ;
2. Como visto para a declarao while, tenha certeza que a
declarao do-while

poder terminar em algum momento

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

Algoritmos e Programao II 77
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!

Experimente executar os trechos de cdigo abaixo. Analise o que


ocorre.

Exemplo 1

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

Este exemplo ter 0123456789 escrito na tela.

Exemplo 2

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

Exemplo 3

// Um lao executado uma vez


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

Este exemplo mostrar a palavra hello escrita na tela infinitas


vezes.

Declarao for

A declarao for, como nas declaraes anteriores, permite a


execuo do mesmo cdigo uma quantidade determinada de vezes.

78 UNIDADE 02
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.
Este mesmo exemplo, utilizando a declarao while, mostrado
abaixo:

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

Algoritmos e Programao II 79
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

2. Digite o programa abaixo e estude com ele funciona. Remova


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

80 UNIDADE 02
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

Algoritmos e Programao II 81
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 esse


nmero elevado ao expoente. Faa trs verses desse programa:
a) Use uma declarao while
b) Use uma declarao do-while
c) Use uma declarao for
3. O que o programa abaixo faz:

Desafio
Encontre e faa a devida correo dos erros em cada um dos
fragmentos de cdigo abaixo.
// Cod B
switch ( n ) {
case 1:
// Cod A
System.out.println("The number is 1");
x = 1;
case 2:
while ( x <= 10 );
System.out.println("The number is 2");
x++;
break;
}
default:
System.out.println("The number is not 1 or 2");
break;
}

// Cod C imprime valores de


1 a 10 // Cod D
n = 1; for ( y = .1; y != 1.0; y += .1
while ( n < 10 ) )
System.out.println( n++ ); System.out.println( y );

82 UNIDADE 02
Estrutura de Controle de Interrupo: break, continue e return

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.

Declarao break

A declarao break possui duas formas: unlabeled (no
identificada - vimos esta forma com a declarao switch) e labeled
(identificada).

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.");
}

Algoritmos e Programao II 83
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.

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.

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 imediatamentepara a declarao for
marcada com o label, neste caso, interrompendo o lao controlado pela
varivel i.

84 UNIDADE 02
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.

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");

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

Algoritmos e Programao II 85
atingir o valor 2 do lao interno.
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.

Praticando!
Digite o programa abaixo. Veja que brincadeira legal com o uso do
continue.

86 UNIDADE 02
Algoritmos e Programao II 87
1. Execute o programa abaixo. Se faz o lao de 1 a 10 vezes, por que
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 );
}
}

2. Execute o programa abaixo. Se faz 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 + " ";
}
output += "\nUsed continue to skip printing 5";
JOptionPane.showMessageDialog( null, output );
System.exit( 0 );
}
}

88 UNIDADE 02
Esta unidade apresentou as estruturas de controles bsicas como
desvios condicionais simples (IF/then) e compostos (IF/tem/else); e
repeties condicionais com teste no incio (while/for) e no final (do/while)
das estruturas da programao Java. Essas estruturas so importantes
na especificao de algoritmos, pois de acordo com as entradas, o fluxo
de execuo do algoritmo pode ser alterado.

Algoritmos e Programao II 89
90 UNIDADE 03
UNIDADE 03

Arranjos e Argumentos

OBJETIVOS:
Conhecer as estruturas de dados bsicas constantes nos programas e
saber empregl-as no momento da especificao do modo que o cdigo
fique mais claro e otimizvel.
Arranjos e
argumentos

Array em Java

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 tornar-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. Esse tipo de varivel chamado de
array.

Algoritmos e Programao II 93
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.

Declarando array

Array precisa ser declarado 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[];

Depois da declarao, precisamos criar o array e especificar


seu tamanho. Esse 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

94 UNIDADE 03
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
String days[] = {"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.

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
sequencialmente por todas as posies at o fim do array. Lembre-se que
os elementos dentro do array possuem ndice de 0 a tamanhoDoArray-1.

Dicas de programao:
1. Normalmente, melhor inicializar, ou instanciar, um array logo aps declar-
lo.
Por exemplo, a 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 tm ndices de 0 a n-1. Note que
no existe o elemento arr[n]. A tentativa de acesso a esse elemento causar
uma exceo do tipo ArrayIndexOutOfBoundsException, pois o ndice deve ser
at n-1.
3. No possvel modificar o tamanho de um array.

Algoritmos e Programao II 95
Por exemplo, dado o array ages que declaramos anteriormente,
temos:
// atribuir 10 ao primeiro elemento do array
ages[0] = 10;

// imprimir o ltimo elemento do array


System.out.print(ages[99]);

Lembre-se que o array, uma vez declarado e construdo, ter o


valor de cada membro inicializado automaticamente, conforme a seguinte
tabela:

Tipo Primitivo Iniciado com


boolean false
byte, short e int 0
char '\u0000'
long 0L
float 0.0F
double 0.0

Entretanto, tipos de dados por referncia, como as Strings, no


sero inicializados caracteres em branco ou com uma string vazia "",
sero inicializados com o valor null. Deste modo, o ideal preencher os
elementos do arrays de forma explcita antes de utiliz-los. A manipulao
de objetos nulos pode causar a desagradvel surpresa de uma exceo
do tipo NullPointerException, por exemplo, ao tentar executar algum
mtodo da classe String, conforme o exemplo a seguir:

Dicas de programao:
1. Quando criar laos com for para o processamento de um array, utilize o
campo
length como argumento da expresso lgica. Isso ir permitir ao lao ajustar-se,
automaticamente para tamanhos de diferentes arrays.
2. Declare o tamanho dos arrays, utilizando variveis do tipo constante para
facilitar
alteraes posteriores. Por exemplo:
final int ARRAY_SIZE = 1000; // declarando uma constante
...
int[] ages = new int[ARRAY_SIZE];

96 UNIDADE 03
public class ArraySample {
public static void main(String[] args){
String [] nulls = new String[2];
System.out.print(nulls[0]);
// Linha correta, mostra null
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]);
}
}
}

Tamanho de array

Para se obter o nmero de elementos de um array, pode-se utilizar
o atributo length. O atributo length de um array retorna seu tamanho,
ou seja, a quantidade de elementos. utilizado como no cdigo abaixo:
nomeArray.length

Por exemplo, dado o cdigo anterior, podemos reescrev-lo como:

public class ArraySample {


public static void main (String[] args) {
int[] ages = new int[100];
for (int i = 0; i < ages.length; i++) {
System.out.print(ages[i]);
}
}
}

Algoritmos e Programao II 97
Arrays multidimensionais

Arrays multidimensionais so implementados como arrays dentro
de arrays. So declarados ao atribuir um novo conjunto de colchetes
depois do nome do array. Por exemplo:

// 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] + " ");
}
}

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


semana. Por exemplo:
String days[] = {"Monday", "Tuesday", "Wednesday", "Thursday",

98 UNIDADE 03
"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 desses
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

Desafio:
1. O programa abaixo ler os argumentos na linha de comando e coloca no
array de args. Altere esse programa 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("!");
}
}

Algoritmos e Programao II 99
2. Escreva um programa para ler um conjuto de elementos, armazenar em
arrays, classificar em ordem crescente e imprimir os elementos do array.

Argumentos em Java

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:

Dicas de programao:
1. Antes de usar os argumentos de linha de comando, observe a quantidade
de argumentos passados para a aplicao. Deste modo, nenhuma exceo
ser disparada.

public static void main(String[] args) {


}

Os argumento que so passados para o programa so salvos em


um array de String com o identificador args. No exemplo anterior, os
argumentos de linha de comando passados para a aplicao Sort estaro
em um array que conter cinco strings: "5", "4", "3", "2" e "1". possvel
conhecer o nmero de argumentos passados pela linha de comando,

100 UNIDADE 03
utilizando-se o atributo length do array.
Por exemplo:
int numberOfArgs = args.length;

Se o programa precisa manipular argumento de linha de comando


numrico, ento, deve-se converter o argumento do 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]);
}

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

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.

Algoritmos e Programao II 101


D um clique com o boto direito do mouse no cone
CommandLineExample, conforme destacado na figura acima. Um menu
aparecer, conforme a figura abaixo. Selecione a opo "Properties".

102 UNIDADE 03
A janela "Project Properties" ir aparecer, conforme a figura
abaixo:

Acesse a opo Run Running Project.

Algoritmos e Programao II 103


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

Execute o projeto.

104 UNIDADE 03
Como pode-se ver, a sada do projeto a quantidade de
argumentos, que 5, e o primeiro argumento passado, que tambm 5.

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:

Algoritmos e Programao II 105


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 +
". Next year, you'll be " + (age + 1));
System.exit(0);
}
}

Nesta unidade discutimos sobre 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. Tambm foram apresentados argumentos como forma
de transferncias de dados para os aplicativos.

106 UNIDADE 03
UNIDADE 04

Paradigma de Programao
Orientada a Objetos

OBJETIVOS:
Conhecer fundamentalmente os recursos de programao orientada
por objetos como uma ferramenta poderosa que pode gerar cdigos
sofisticados e complexos.
Implementar os algoritmos de interesse do aprendiz, usando a
linguagem Java, para solidificar os conhecimentos adquiridos nas sub-
unidades anteriores.
Paradigma de
Programao Orientada
a Objetos

Classes, Objetos e Mtodos

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. Esses 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:

Objeto Propriedades Comportamentos


carro tipo de cmbio virar
fabricante frear
cor acelerar
leo peso rugir
cor dormir
apetite (faminto ou saciado) caar
temperamento (dcil ou selvagem)

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. Esses 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

Algoritmos E Programao II 109


'carro' numa competio de corrida ou um objeto de 'leo' num aplicativo
educacional de zoologia para crianas.

Classes e Objetos

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 esse 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. 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.
Classe Carro Objeto Carro A Objeto Carro B
Nmero da placa ABC 111 XYZ 123
Atributos de Cor Azul Vermelha
Objeto
Fabricante Mitsubishi Toyota
Velocidade 50 km/h 100 km/h
Mtodo Acelerar
Modelos de Mtodo Girar
Objeto
Mtodo Frear

110 UNIDADE 04
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 da 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.

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.

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 e, tambm, so chamados de atributos estticos. Para melhor
descrever os atributos de classe, vamos voltar ao exemplo da classe
Carro.
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.

Classe Carro Objeto Carro A Objeto Carro B


Nmero da placa ABC 111 XYZ 123
Atributos de Cor Azul Vermelha
Objeto
Fabricante Mitsubishi Toyota
Velocidade 50 km/h 100 km/h
Atributos de Contador = 2
Classe

Algoritmos E Programao II 111


Mtodo Acelerar
Modelos de Mtodo Girar
Objeto
Mtodo Frear

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.

Mtodos

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.
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

112 UNIDADE 04
retornado a quem o chamou.
O que necessrio para se criar mtodos? Por que no colocamos
todas as instrues dentro de um grande mtodo? O foco dessas
questes chamado de decomposio. Conhecido o problema, ns o
separamos em partes menores, que torna menos crtico o trabalho de
escrever grandes classes.

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);

Envio de argumentos para mtodos

Algoritmos E Programao II 113


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.

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:

No exemplo dado, o mtodo test foi chamado e o valor de i foi


enviado como argumento. O valor de i copiado para o atributo do
mtodo j. J que j o atributo modificado no mtodo test, no afetar o
valor do atributo i, o que significa uma cpia diferente do atributo.
Como padro, todo tipo primitivo, quando enviado para um mtodo,
utiliza a forma de envio por valor.

114 UNIDADE 04
Envio por referncia
Dicas de
programao:
Quando ocorre um envio por referncia, a referncia de um
objeto enviada para o mtodo chamado. Isso significa que o mtodo 1. Um erro comum
faz uma cpia da referncia do objeto enviado. sobre envio por
referncia acontece
Entretanto, diferentemente do que ocorre no envio por valor, o
quando criamos
mtodo pode modificar o objeto para o qual a referncia est apontando. um mtodo para
Mesmo que diferentes referncias sejam usadas nos mtodos, a fazer trocas (swap)
localizao do dado para o qual ela aponta a mesma. Por exemplo: usando referncia.
Note que Java
manipula objetos
'por referncia',
entretanto envia-se
a referncia para um
mtodo 'por valor'.
Como consequncia,
no se escreve um
mtodo padro para
fazer troca de valores
(swap) entre objetos.

Algoritmos E Programao II 115


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)

Escopo de um atributo

Alm do atributo ter um nome e um tipo, ele tambm 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 atributos 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

116 UNIDADE 04
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.

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

Algoritmos E Programao II 117


Para o mtodo main, os escopos dos atributos so:

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. Isso significa que se voc tiver a seguinte declarao:

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

Dicas de programao:
1. Evite ter atributos declarados com o mesmo nome dentro de um mtodo para
no causar confuso.

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


para o atributos dentro do bloco. Entretanto, possvel ter atributos
definidos com o mesmo nome, se no estiverem declarados no mesmo
bloco. Por exemplo:

public class TestBlock {


int test = 10;
public void test() {
System.out.print(test);
int test = 20;
System.out.print(test);
}
public static void main(String[] args) {
TestBlock testBlock = new TestBlock();
testBlock.test();
}
}

118 UNIDADE 04
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.

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.

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.

Algoritmos E Programao II 119


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 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

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 consequncia 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 chamada do
mtodo. Para um objeto definido como uma classe Window, possvel
atribuir objetos dessa classe ou qualquer uma de suas subclasses para

120 UNIDADE 04
esse objeto sem o casting.


O contrrio tambm verdadeiro, pois uma superclasse pode
ser 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.
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.

Algoritmos E Programao II 121


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

Convertendo tipos primitivos para objetos e vice-versa

Dicas de programao:
1. A classe Void representa vazio em Java. Desse modo, no existem motivos
para essa classe ser usada na converso de valores primitivos e objetos. Ela
um tratador para a palavra-chave void, que utilizada na assinatura de mtodos
indicando que estes no retornam valor.

No se pode fazer, sob qualquer circunstncia, um casting de um


objeto para um tipo de dado primitivo, ou vice-versa. Tipos primitivos
e objetos so muito diferentes em Java e no se pode fazer o casting
automaticamente entre os dois ou intercambiar o seu uso.
Como alternativa, o pacote java.lang oferece classes que fazem
a correspondncia para cada tipo primitivo: Float, Boolean, Byte, dentre
outros. Muitas dessas classes tm o mesmo nome dos tipos de dados
primitivos, exceto pelo fato que o nome dessas classe comeam com
letra maiscula (Short ao invs de short, Double ao invs de double, etc).
H duas classes que possuem nomes que diferem do correspondente
tipo de dado primitivo: Character usado para o tipo char e Integer usado
para o tipo int. Estas classes so chamadas de Wrapper Class.
Verses anteriores a 5.0 de Java tratam os tipos de dados e
suas Wrapper Class de forma muito diferente, e uma classe no ser
compilada com sucesso se for utilizada uma quando deveria usar a outra.
Por exemplo:

Integer ten = 10;


Integer two = 2;
System.out.println(ten + two).

122 UNIDADE 04
Usando as classes que correspondem a cada um dos tipos
primitivos, possvel criar objetos que armazenam esse 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);

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 essa regra so os operadores de igualdade:
== (igual) e != (diferente). Quando aplicados a objetos, esses 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.

Algoritmos E Programao II 123


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.
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));

str2 = new String(str1);

System.out.println("String1: " + str1);


System.out.println("String2: " + str2);
System.out.println("Same object? " + (str1 == str2));
System.out.println("Same value? " + str1.equals(str2));
}
}

Dicas de programao:
1. Por que no se pode ter a mesma literal quando mudamos str2, a no ser
quando utilizamos o new? Literais String so otimizadas em Java; se uma String
criada utilizando uma literal e cria-se outra String com os mesmos caracteres,
Java tem inteligncia suficiente para retornar apenas a posio em memria do
primeiro objeto String criado. Ou seja, ambas strings se referem ao mesmo objeto
como se fosse um apelido. Para obrigar ao Java criar um novo objeto String,
deve-se utilizar o operador new.

A sada dessa classe a seguinte:

String1: Free the bound periodicals.


String2: Free the bound periodicals.
Same object? true

124 UNIDADE 04
String1: Free the bound periodicals.
String2: Free the bound periodicals.
Same object? false
Same value? True

Vamos entender o processo envolvido.



String str1, str2;
str1 = "Free the bound periodicals.";
str2 = str1;

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);

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.

Algoritmos E Programao II 125


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

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.

2. Identifique, na figua abaixo, os elementos: a) Classe, b) Objeto,


c) Instncia, e) Mtodo, f) Atributo, g) Construtor, h) Mensagem, i)
Argumento.

126 UNIDADE 04
3. 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, tambm, no tem acesso Internet, desse
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 desse mtodo.
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.

Algoritmos E Programao II 127


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 especfica. 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.
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.

4. 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.

Desafio:

O cdigo seguinte cria uma lista de objetos empregados,


associados a uma identificao. Perceba que, nas classes empregado e
empresa, est declarado o mtodo main(). Compile e execute as duas
classes. Justique a execuo. Agora altere o cdigo para no permitir
execuo da classe empregado e na criao de cada empregado
incrementar o identificador automaticamente.

128 UNIDADE 04
// classe Empresa
public class Empresa
public static void main(String[] args) {
// fill the staff array with three Employee objects
Employee[] staff = new Employee[3];
staff[0] = new Employee("Tom", 40000);
staff[1] = new Employee("Dick", 60000);
staff[2] = new Employee("Harry", 65000);
// print out information about all Employee objects
for (int i = 0; i < staff.length; i++)
Employee e = staff[i];
e.setId();
System.out.println("name=" + e.getName()
+ ",id=" + e.getId()
+ ",salary=" + e.getSalary());
}
int n = Employee.getNextId(); // calls static method
System.out.println("Next available id=" + n);
}
}
// 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
}
public static void main(String[] args) // unit test {
Employee e = new Employee("Harry", 50000);
System.out.println(e.getName() + " " + e.getSalary());
}
private String name;
private double salary;
private int id;

Algoritmos E Programao II 129


Definio de Classe em Java

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 programao:
1. Lembre-se de que, para a declarao da classe, o nico modificador de acesso
vlido o public. De uso exclusivo para a classe que possuir o mesmo nome do
arquivo externo.

<modificador> um modificador de acesso, que pode ser usado


em combinao com outros
<nome> nome da sua classe
<declaraoDoAtributo> atributos definidos para a classe
<declaraoDoConstrutor> mtodo construtor
<declaraoDoMtodo> mtodos da classe

Dicas de programao:
1. Pense em nomes apropriados para a sua classe. No a chame simplesmente
de classe XYZ ou qualquer outro nome aleatrio.
2. Os nomes de classes devem ser iniciadas por letra maiscula.
3. O nome do arquivo de sua classe obrigatoriamente possui o mesmo nome da
sua classe pblica.

Nesta lio, criaremos uma classe que conter o registro de um


estudante. Como j identificamos o objetivo da nossa classe, agora
podemos nome-la. Um nome apropriado para nossa classe seria
StudentRecord.

130 UNIDADE 04
Para definir nossa classe, escrevemos:

public class StudentRecord {


// adicionaremos mais cdigo aqui
}

onde:

public modificador de acesso e significa que qualquer classe


pode acessar esta
class palavra-chave usada para criar uma classe
StudentRecord identificador nico que identifica a classe

Declarando atributos

Para declarar um certo atributo para a nossa classe, escrevemos:

<modificador>* <tipo> <nome> [= <valorInicial>];

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

Algoritmos E Programao II 131


Futuramente, possvel adicionar mais informaes. Para este
exemplo, utilizaremos somente estas.

Atributos de objeto

Dicas de programao:
1. Declare todas os atributos de objeto na parte superior da declarao da classe.
2. Declare cada atributo em uma linha.
3. Atributos de objeto, assim como qualquer outro atributo devem iniciar com letra
minscula.
4. Use o tipo de dado apropriado para cada atributo declarado.
5. Declare atributos de objetos como private de modo que somente os mtodos
da classe possam acess-los diretamente.

Agora que temos uma lista de todos os atributos que queremos


adicionar nossa classe, vamos adicion-los ao nosso cdigo. Uma vez
que queremos que estes atributos sejam nicos para cada objeto (ou
para cada estudante), devemos declar-los como atributos de objeto.
Por exemplo:

public class StudentRecord {


private String name;
private String address;
private int age;
private double mathGrade;
private double scienceGrade;
}

onde:
private significa que os atributos so acessveis apenas de dentro
da classe. Outros objetos no podem acessar diretamente estes atributos.

Atributos de classe ou atributos estticos



Alm dos atributos de objeto, podemos tambm declarar atributos
de classe ou atributos que pertenam classe como um todo. O valor
desses 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.

132 UNIDADE 04
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;
}

Declarando mtodos

Antes de discutirmos quais mtodos 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:

Algoritmos E Programao II 133


<tipoArgumento> <nomeArgumento>

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 esses 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;

134 UNIDADE 04
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

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.

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 esses mtodos modificadores.
Esse mtodo escrito como set<NomeDoAtributoDeObjeto>.
Vamos dar uma olhada na implementao de um mtodo
modificador:

public class StudentRecord {


private String name;

Algoritmos E Programao II 135


:
:
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;

atribui o contedo de temp para name e, portanto, altera 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.

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, em vez 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;
}

136 UNIDADE 04
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;
}
}

Dicas de programao:
1. Nomes de mtodos devem iniciar com letra MINSCULA.
2. Nomes de mtodos devem conter verbos
3. Sempre faa documentao antes da declarao do mtodo. Use o estilo
javadoc para isso.

onde:
public significa que o mtodo pode ser chamado por objetos
externos classe.
static significa que o mtodo esttico e deve ser chamado
digitando-se [NomeClasse].[nomeMtodo].
int o tipo do retorno do mtodo. Significa que o mtodo deve
retornar um valor de tipo int.
getStudentCount nome do mtodo.
() significa que o mtodo no tem nenhum argumento.

Por enquanto, getStudentCount retornar sempre o valor zero j


que ainda no fizemos nada na nossa classe para atribuir o seu valor.
Modificaremos o valor de studentCount mais tarde, quando discutirmos
construtores.

Exemplo de cdigo fonte para a classe StudentRecord

Aqui est o cdigo para a nossa classe StudentRecord:

public class StudentRecord {


private String name;
private String address;
private int age;
private double mathGrade;

Algoritmos E Programao II 137


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
annaRecord.setName("Anna");
beahRecord.setName("Beah");

138 UNIDADE 04
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 dessa classe :


Anna
Count = 0

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.
Isso 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){

Algoritmos E Programao II 139


this.age = age;
}

Esse mtodo ir atribuir o valor do argumento age para a atributo


de objeto age do objeto StudentRecord.

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. Essa 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. Em vez 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 esses mtodos no mtodo main, criado

140 UNIDADE 04
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());
}

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

Declarando construtores

Discutimos anteriormente o conceito de construtores. Construtores


so importantes na criao de um objeto. um mtodo onde so

Algoritmos E Programao II 141


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>*
}

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:

public StudentRecord() {
}

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;

142 UNIDADE 04
this.address = address;
}
public StudentRecord(double mGrade, double eGrade,
double sGrade) {
mathGrade = mGrade;
englishGrade = eGrade;
scienceGrade = sGrade;
}

Usando Construtores

Para utilizar esses 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. Por exemplo:

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;

Algoritmos E Programao II 143


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

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.


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. Desse modo, reescreveremos os
construtores da classe StudentRecord para:

public StudentRecord() {
studentCount++; // adicionar um estudante

144 UNIDADE 04
}
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;
}

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.

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, para a classe Color dentro do pacote awt,


necessrio a seguinte instruo:

import java.awt.Color;

Algoritmos E Programao II 145


ou:

import java.awt.*;

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;

Criando pacotes

Para criar os nossos pacotes, escrevemos:

package <nomeDoPacote>;

Suponha que desejamos criar um pacote em que colocaremos


a nossa classe StudentRecord juntamente com outras classes
relacionadas. Chamaremos o nosso pacote de schoolClasses.
A primeira coisa que temos a fazer criar uma pasta chamada
schoolClasses. Em seguida, copiar para essa pasta todas as classes
que pertenam a esse 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. Nesse caso, o interpretador


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

Definindo a varivel de ambiente CLASSPATH

Suponha que coloquemos o pacote schoolClasses sob o diretrio

146 UNIDADE 04
C:\. Precisamos que a classpath aponte para este diretrio de tal forma
que, quando executemos a classe, a JVM seja capaz de enxergar o local
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:

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 essa classe. A razo disso que a sua classe
StudentRecord pertence a um pacote denominado schoolClasses. Se
desejamos executar essa classe, teremos que dizer ao Java o seu nome
completo schoolClasses.StudentRecord. Tambm teremos que dizer
JVM onde procurar pelos nossos pacotes, que, nesse 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 em que colocamos os pacotes. Aps definir


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

C:\schoolClasses>java schoolClasses.StudentRecord

Algoritmos E Programao II 147


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:

export classpath=/usr/local/java:/usr/myClasses

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.

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;

148 UNIDADE 04
// 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.

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;
}
}

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


acessados a partir de outros objetos.

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;
}
}

Algoritmos E Programao II 149


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.

Acesso particular

Especifica que os elementos da classe so acessveis somente


na classe que o definiu. Por exemplo:

Dicas de programao:
Normalmente, os atributos de objeto de uma classe devem ser declarados
particulares e a classe pode fornecer mtodos assessores e modificadores para
esses atributos.

public class StudentRecord {


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

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


acessados somente por mtodos internos classe.

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:

150 UNIDADE 04
Crie os seguintes mtodos:
a. Fornea todos os mtodos assessores e modificadores
necessrios para
todos os atributos.
b. 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:
a. Adicionar registro
b. Excluir registro
c. Visualizar registros
d. Modificar um registro

Desafio
A empresa MagSoft contrata desenvolvedores para trabalhar em
projetos de software. Implemente uma soluo em Java para o controle
do empregados e projetos, usando pacote Java.

Herana, Polimorfismo e Interfaces

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, abaixo.
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)

Algoritmos E Programao II 151


definido e codificado uma nica vez em uma nica classe, e esse
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.

Definindo superclasses e subclasses

Para herdar uma classe, usamos a palavra-chave extends.


Ilustraremos criando uma classe pai como 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 ){
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.

152 UNIDADE 04
A razo de termos feito isso que queremos que esses 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 existentes na classe
Person. Para isso, 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.

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

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

Algoritmos E Programao II 153


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 abaixo:

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
simultaneamente 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
{

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

154 UNIDADE 04
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;
{
...
{

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;
{
...
{

Algoritmos E Programao II 155


Inserimos uma chamada ao objeto super, e a sada ser:
Parent: getName Student: getName

Mtodo final e classe final

Podemos declarar classes que no permitem a herana. Essas


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. Esses 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;
}

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.

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:

156 UNIDADE 04
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 desse mtodo 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;
}
}

Voltando ao mtodo main, quando tentamos chamar o mtodo


getName da referncia ref do tipo Person, o mtodo getName do objeto

Algoritmos E Programao II 157


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){
...
}

Classes abstratas

Para criar mtodos em classes, devemos, necessariamente, saber

158 UNIDADE 04
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 dessa classe possuam, obrigatoriamente, esses 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 esse 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, isso o que ns queremos ao criar uma superclasse geral.

Para realizarmos isso, 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.
Frequentemente 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...");

Algoritmos E Programao II 159


}
/**
* mtodo abstrato walk
* Queremos que esse mtodo seja criado pela
* subclasse de LivingThing
*/
public abstract void walk();
}

Quando uma classe estende a classe abstrata LivingThing, ela


obrigada a implementar o mtodo abstrato walk. Por exemplo:

public class Human extends LivingThing {


public void walk(){
System.out.println("Human walks...");
}
}

Dicas de programao:
Use classes abstratas para definir muitos tipos de comportamentos no topo
de uma hierarquia de classes de programao orientada a objetos. Use suas
subclasses para prover detalhes de implementao da classe abstrata.

Se a classe Human no implementar o mtodo walk, ser


mostrada a seguinte mensagem de erro de compilao:

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


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

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

160 UNIDADE 04
comportamentos comuns.

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);
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, permitindo que as classes tenham
mais de uma superclasse. A herana mltipla no est implementada em
Java.

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

Algoritmos E Programao II 161


obrigatoriamente abstratos e pblicos, tanto que para essa classe, a
palavrachave abstract ou public opcional.

Interface vs. classe

Uma caracterstica comum entre uma interface e uma classe


que ambas so tipos. Isso 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.

Criando interfaces

Para criarmos uma interface, utilizamos:

[public] [abstract] interface <NomeDaInterface> {


< [public] [final] <tipoAtributo> <atributo> = <valorInicial>; >*
< [ p u b l i c ] [ a b s t r a c t ] < r e t o r n o >
<nomeMetodo>(<parametro>*); >*
}

Como exemplo, criaremos uma interface que defina o


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

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

162 UNIDADE 04
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);
}

Dicas de programao:
Use interface para criar uma definio padro de mtodos em classes diferentes.
Uma vez que o conjunto de definies de mtodos criado, pode ser escrito um
mtodo simples para manipular todas as classes que implementam a interface.

public boolean isEqual( Object a, Object b){


double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();

Algoritmos E Programao II 163


return (aLen == bLen);
}

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

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 que a classe no 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 outra superclasse e


implementa interfaces:

public class ComputerScienceStudent extends Student


implements PersonInterface, LivingThing {
// algumas linhas de cdigo

Uma interface no parte uma hierarquia de classes. Classes


no relacionadas podem implementar a mesma interface.

164 UNIDADE 04
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 {

}

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.

Tratamento Bsico de Excees

O que so excees (Exception)?

Uma exceo um evento que interrompe o fluxo normal de


processamento de uma classe. Esse evento um erro de algum tipoe e
isso causa o trmino anormal da classe.

Algoritmos E Programao II 165


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().

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.
Um bloco try deve ser seguido de PELO MENOS um bloco catch

166 UNIDADE 04
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:

Algoritmos E Programao II 167


Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at ExceptionExample.main(ExceptionExample.java:5)

Para prevenir que isso 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

Nesta unidade, apresentamos fundamentos do paradigma de


programao orientada a objetos, caracterizando com exemplos uma
linguagem orientada a objetos com Java; e os elementos inerentes como
classes, objetos e mtodos. Mostramos, com exemplos, caractersticas
que podem ser exploradas como herana polimorfismo e interface e,
ainda, como feito o tratamento de exeres em linguagem OO como
Java, apresentando exemplos ilustrativos e exerccios propostos a serem
vencidos pelos aprendizes.

168 UNIDADE 04
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)

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
Exception caught: 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 esses programas e implemente o tratamento de
excees.

Algoritmos E Programao II 169


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

170 UNIDADE 04
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.

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]:

Algoritmos E Programao II 171


11
[][][][][]
[ ] [2] [ ] [ ] [ ]
[][][][][]
[][][][][]
[][][][][]
Digite linha e coluna da clula que voc quer abrir[linha coluna]:
32
[][][][][]
[ ] [2] [ ] [ ] [ ]
[][][][][]
[ ] [ ] [4] [ ] [ ]
[][][][][]
Digite linha e coluna da clula que voc quer abrir[linha coluna]:
02
[ ] [ ] [X] [ ] [ ]
[ ] [2] [ ] [ ] [ ]
[][][][][]
[ ] [ ] [4] [ ] [ ]
[][][][][]
Ooppps! Voc pisou numa bomba. Sinto muito, o jogo acabou e
voc perdeu!

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.

172 UNIDADE 04
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!

Algoritmos E Programao II 173


ASCENCIO, Ana Fernanda Gomes e CAMPOS, Edilene Aparecida
Veneruchi. Fundamentos da Programao de Computadores -
Algoritmos, Pascal, C/C++ E Java. Pearson, 2007.

BOENTE, Alfredo. Aprendendo a programar em Java 2: Orientado a


Objetos. Brasport. Rio de Janeiro, 2003.

BORATTI, Isaias Camilo. Programao Orientada a Objetos em Java.


Visual books, 2007.

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


2005.

DEITEL, H. M. e DEITEL, P. J. Java: como programar. 3 Ed. Porto Alegre:


Bookman, 2001.

______. Java: como programar. 6 Ed. Porto Alegre: Pearson, 2005.

GONALVES, Edson.Cincia modern, 2007.

PRESSMAN, R. Software Engineering: A Pratctitioners Approach. 5


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

RUBINSTEIN, Roberto. Certificao Java 5 SERSON, Brasport, 2006.

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

Magno Santos

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

174 UNIDADE 04