Vous êtes sur la page 1sur 109

Java

Fundamentos

Paulo Henrique Cayres

Rio de Janeiro
Escola Superior de Redes
2013
Java Fundamentos

Java Fundamentos

Sumrio
Lgica de Programao ............................................................................................1
Conceito de Algoritmo .............................................................................2
Mtodo para a Construo de Algoritmos ................................................2
Instrues..................................................................................................4
Histrico da linguagem de programao Java .........................................................9
Caractersticas da Linguagem ................................................................12
Similaridade com C, C++ ...................................................................12
Compilao .........................................................................................12
Portabilidade .......................................................................................12
Orientao a Objetos ..........................................................................13
Segurana ...........................................................................................13
Concorrncia ......................................................................................13
Eficincia ............................................................................................14
Suporte para Programao de Sistemas Distribudos .........................14
Fundamentos de Programao em Java .................................................................15
O que Java? ..........................................................................................15
Recursos da Linguagem Java .................................................................16
Mquina Virtual Java .........................................................................16
Coleta de Lixo ....................................................................................17
Segurana de Cdigo ..........................................................................17
Comparao de Java com outras Linguagens.....................................18
Formato geral de um programa Java ......................................................18
Primeiro Programa .................................................................................19
Alguns cuidados ao escrever e executar programas Java .......................20
Comentrios............................................................................................21
Variveis .................................................................................................24
Tipos de Dados .......................................................................................24
Inteiros ................................................................................................25
Ponto Flutuante...................................................................................25
Tipo Caractere, char ...........................................................................26
Tipo boolean .......................................................................................26
Atribuies e Inicializaes................................................................26
Converses entre Tipos Numricos ....................................................27
Constantes ..............................................................................................28
Operadores..............................................................................................28
Tipo String ..............................................................................................30
Concatenao......................................................................................30
Substrings ...............................................................................................31
Tamanho .............................................................................................31
Teste de Igualdade ..............................................................................31
Manipulando dados em Java ..................................................................32
Exerccios de Fixao 4 Variveis ......................................................33
Atividade 2 Variveis e manipulao de dados (Complementar) .......34
Controle de Fluxo ...................................................................................................35
Java Fundamentos
i

Escopo de um bloco de comandos .........................................................35


Expresso Lgica ...................................................................................36
Operadores Lgicos ................................................................................37
Tabela Verdade.......................................................................................37
Estruturas de Deciso .............................................................................38
Comando if .........................................................................................38
Comando switch .................................................................................39
Estruturas de Repetio ..........................................................................41
Definio ............................................................................................41
Comando while...................................................................................41
Comando do ... while..........................................................................42
Comando for .......................................................................................42
Quebra de fluxo ......................................................................................43
Comando Break ..................................................................................43
Comando continue ..............................................................................44
Comando return ..................................................................................44
Arrays .....................................................................................................................47
Exerccio de nivelamento 6 Arrays .....................................................47
Definio ................................................................................................47
Utilizao de Arrays ...............................................................................48
Tamanho de uma array ...........................................................................50
Cpia de Arrays ......................................................................................51
Arrays como Argumentos ......................................................................51
Arrays como Valores de Retorno ...........................................................51
Arrays Multidimensionais ......................................................................51
Classes Especializadas ...........................................................................................53
Wrappers de Objetos ..............................................................................53
Date, DateFormat e Calendar .................................................................54
Date 54
DateFormat .........................................................................................55
Calendar..............................................................................................56
NumberFormat .......................................................................................57
DecimalFormat .......................................................................................57
Padro de Caracteres Especiais ..........................................................58
Math........................................................................................................58
Classes e Objetos....................................................................................................61
Programao Orientada a Objetos ..........................................................61
Classe......................................................................................................63
Relaes entre Classes........................................................................64
Objetos....................................................................................................64
Objetos como Argumentos .................................................................65
Autoreferncia a um objeto ................................................................65
Atributos .............................................................................................66
Mtodos ..............................................................................................67
Getters e Setters..................................................................................68
Sobrecarga ..........................................................................................68
Java Fundamentos
ii

Construtores........................................................................................69
Blocos de Inicializao .......................................................................70
Mtodos e Atributos static ......................................................................70
Pacotes ....................................................................................................74
Usando pacotes ...................................................................................75
Adicionando uma classe em um pacote .............................................76
Herana ...................................................................................................77
Hierarquia de Heranas ......................................................................79
Evitar Herana ....................................................................................80
Polimorfismo ..........................................................................................81
Classes Abstratas ....................................................................................83
Mtodos Abstratos ..................................................................................83
Ligao ...................................................................................................84
Classe Class ............................................................................................84
Reflexo..............................................................................................85
Anlise de Recursos das Classes ........................................................86
Anlise de Objetos em Tempo de Execuo ..........................................86
Superclasse abstrata ............................................................................86
Interfaces ............................................................................................87
Propriedades .......................................................................................90
Classes Internas ......................................................................................90
Collections..............................................................................................................95
Exerccio de nivelamento 9 Collections ..............................................95
Definio ................................................................................................95
Interface Collection ................................................................................95
O que o Java Collections Framework? ................................................95
Benefcios do Java Collections Framework ...........................................96
Listas ......................................................................................................97
Conjuntos................................................................................................98
Mapas ...................................................................................................100
Exerccio de Fixao 11 Collections .................................................101
Bibliografia ..........................................................................................................103

Java Fundamentos
iii

Java Fundamentos
iv

1
Lgica de Programao
Exerccio de nivelamento 1 Lgica de Programao
O que voc entende por lgica de programao?

Voc poderia descrever a sequncia de passos necessrios para realizar a troca de um pneu
furado de um carro?

A lgica de programao uma tcnica desenvolvida para auxiliar as pessoas que desejam
trabalhar com desenvolvimento de programas e sistemas. Ela permite definir e encadear
pensamentos numa sequncia lgica de passos necessrios para o desenvolvimento de uma
soluo computacional para atingir um determinado objetivo ou soluo de um problema
(FARRER, 1999).
O resultado da sequncia lgica de passos necessrios para o desenvolvimento de uma
soluo computacional servir de base para a escrita de programas que sero
implementados utilizando-se uma linguagem de programao. Por sua vez, os programas
sero armazenados nos computadores, equipamentos responsveis por receber, manipular e
armazenar dados, tendo como principal atividade o processamento de dados.
Quando queremos escrever um software para realizar qualquer tipo de processamento de
dados, vamos escrever um programa ou vrios programas interligados, mas para que o
Java Fundamentos
1

computador consiga compreender e executar esse programa ele deve estar escrito em uma
linguagem entendida pelo computador e pelo desenvolvedor de software, o que chamamos
de linguagem de programao.
As etapas para o desenvolvimento de um programa sa o: Ana lise, onde o enunciado do
problema sera estudado para a definia o dos dados de entrada, do processamento e dos
dados de sada; Algoritmo, onde ferramentas do tipo descria o narrativa, fluxograma ou
portugue s estruturado sa o utilizadas para descrever o problema com suas soluo es; e
Codificaa o, onde o algoritmo e transformado em co digos da linguagem de programaa o
escolhida para se trabalhar (ASCENCIO,
).

Conceito de Algoritmo
A seguir sero apresentados alguns conceitos de algoritmos.
Algoritmo uma sequncia de passos que visam atingir um objetivo bem definido
(Forbellone, 1999).
Algoritmo a descrio de uma sequncia de passos que deve ser seguida para a
realizao de uma tarefa (Ascncio, 1999).
Algoritmo uma sequncia finita de instrues ou operaes cuja execuo, em tempo
finito, resolve um problema computacional, qualquer que seja sua instncia (Salvetti,
2001).
Algoritmos so regras formais para obteno de um resultado ou da soluo de um
problema, englobando frmulas de expresses aritmticas (Manzano, 1997).
Ao um acontecimento que, a partir de um estado inicial, aps um perodo de tempo
finito, produz um estado final previsvel e bem definido. Portanto, um algoritmo a
descrio de um conjunto de comandos que, obedecidos, resultam numa sucesso finita
de aes (Farrer, 1999).

Mtodo para a Construo de Algoritmos


Podemos utilizar os passos a seguir para analisar e apresentar uma soluo para qualquer
tipo de problema que se deseja implementar um soluo baseada em um programa de
computador.
Anlise preliminar: entenda o problema com a maior preciso possvel. Identifique os
dados e os resultados desejados.
Soluo: desenvolva um algoritmo para resolver o problema.
Teste de qualidade: execute o algoritmo desenvolvido com dados para os quais o
resultado seja conhecido. O ideal que o universo dos dados tenha todas as combinaes
possveis.
Alterao: se o resultado do teste de qualidade no for satisfatrio, altere o algoritmo e
submeta-o a um novo teste de qualidade.

Java Fundamentos
2

Produto final: algoritmo concludo e testado, pronto para ser traduzido em programa de
computador.

Figura 1.1 Passos lgicos para o desenvolvimento de programas.


Para a construo de qualquer tipo de algoritmo so necessrios os passos descritos a seguir:
1. Ler atentamente o enunciado, destacando os pontos mais importantes;
2. Definir os dados de entrada, ou seja, quais dados sero fornecidos;
3. Definir o processamento, ou seja, quais clculos sero efetuados e quais as restries para
esses clculos. O processamento responsvel por transformar os dados de entrada em
dados de sada;
4. Definir os dados de sada, ou seja, quais dados sero gerados depois do processamento;
5. Construir o algoritmo;
6. Testar o algoritmo realizando simulaes.

Java Fundamentos
3

De posse deste mtodo, ns podemos observar vrias situaes do dia-a-dia e imaginarmos


uma sequncia de passos lgicos para solucionarmos, conforme os exemplos descritos a
seguir:
Soma de dois nmeros inteiros
Passo 1 ler os dois nmeros
Passo 2 somar os dois nmeros
Passo 3 escrever o resultado do somatrio dos dois nmeros
Sacar dinheiro no caixa eletrnico
Passo 1 Ir at um caixa eletrnico
Passo 2 Inserir o carto no leitor de cartes
Passo 3 Informar a quantia que deseja sacar
Passo 4 Retirar a quantia informada caso tenha saldo disponvel
Passo 5 Retirar o carto
Passo 6 Sair do caixa eletrnico

Instrues
Na linguagem comum, entende-se por instrues um conjunto de regras ou normas
definidas para a realizao ou emprego de algo. Em informtica, instruo a informao
que indica a um computador uma ao elementar a executar (GUIMARES, 1994) (FARRER,
1999) (ASCENCIO, 2005).
Convm ressaltar que uma ao isolada no permite realizar o processo por completo, sendo
necessrio um conjunto de instrues colocadas em ordem sequencial lgica para
implementar uma soluo computacional adequada para um determinado problema.
Por exemplo, se quisermos trocar o pneu de um carro, precisaremos colocar em prtica uma
srie de instrues: parar o carro, desligar o motor, pegar o pneu reserva, macaco e chave de
rodas, etc...
evidente que essas instrues tm que ser executadas em uma ordem adequada, ou seja,
no se pode tirar o pneu furado sem antes erguer o carro com o macaco, por exemplo. Dessa
maneira, uma instruo tomada em separado no tem muito sentido, ficando claro que, para
obtermos um determinado resultado, precisamos colocar em prtica um conjunto de
instrues numa ordem lgica correta.
Instrues so um conjunto de regras ou normas definidas para a realizao ou emprego
de algo. Em informtica, o que indica a um computador uma ao elementar a executar.

Java Fundamentos
4

Exerccios de Fixao 1 Lgica de Programao


Desenvolva algoritmos para dar soluo a cada um dos problemas apresentados a seguir:
Calcular e escrever a mdia de trs nmeros inteiros.

Dadas 4 notas de um aluno, informar se ele est aprovado ou reprovado, considerando a


mdia de aprovao igual ou superior a 7.

Calcular e escrever o resultado da multiplicao de trs nmeros.

Uma empresa possui 10 funcionrios com as seguintes caractersticas: cdigo, nmero de


horas trabalhadas no ms, turno de trabalho (M= matutino, V=vespertino ou N=noturno),
categoria (O=operrio ou G=gerente), valor da hora trabalhada. Sabendo-se que esta
empresa deseja informatizar sua folha de pagamento, faa um programa que: leia as
informaes dos funcionrios, exceto o valor da hora trabalhada, no permitindo que sejam
informados turnos nem categorias inexistentes. Trabalhe sempre com a digitao de letras
maisculas e calcule o valor da hora trabalhada, conforme a tabela seguinte.
Categoria

Turno

Valor hora trabalhada

18% do salrio mnimo

M ou V

15% do salrio mnimo

13% do salrio mnimo

M ou V

10% do salrio mnimo

Java Fundamentos
5

Adote o valor de R$ 150,00 para o salrio mnimo;


Calcule o salrio inicial dos funcionrios com base no valor da hora trabalhada e no
nmero de horas trabalhadas;
Calcule o valor do auxlio alimentao recebido por cada funcionrio de acordo com o seu
salrio inicial, conforme a tabela abaixo.

Salrio inicial

Auxlio alimentao

At R$ 300,00

20% do salrio inicial

Entre R$ 300,00 e R$ 600,00

15% do salrio inicial

De R$ 600,00 para cima

5% do salrio inicial

Mostre o cdigo, nmero de horas trabalhadas, valor da hora trabalhada, salrio inicial,
auxlio alimentao e o salrio final (salrio inicial + auxlio alimentao).

ALGORITMO
DECLARE cont, codigo, nht, valor, sal_min, sal_inicial, aux, sal_final NUMRICO
DECLARE turno, categoria LITERAL
sal_min 150
PARA cont 1 AT 10 FAA
INICIO
LEIA codigo, nht, turno, categoria
ENQUANTO (turno z M) E (turno z V) E (turno zN) FAA
INICIO
LEIA turno
FIM
ENQUANTO (categoria z G) E (categoria z O) FAA
INICIO
LEIA categoria
FIM
SE categoria = G
Java Fundamentos
6

ENTO INICIO
SE turno = N
ENTO valor 18% * sal_min
SENO valor 15% * sal_min
FIM
SENO INICIO
SE turno = N
ENTO valor 13% * sal_min
SENO valor 10% * sal_min
FIM
sal_inicial nht * valor
SE sal_inicial <= 300
ENTO aux 20% * sal_inicial
SENO SE sal_inicial < 600
ENTO aux 15% * sal_inicial
SENO aux 5% * sal_inicial
sal_final sal_inicial + aux
ESCREVA codigo, nht, valor, sal_inicial, aux, sal_final
FIM
FIM_ALGORITMO

Uma empresa contratou 15 funcionrios temporrios. De acordo com o valor das vendas
mensais, os funcionrios adquirem pontos que determinaro seus salrios ao final de cada
ms. Sabe-se que estes funcionrios trabalharo nos meses de novembro a janeiro do ano
subsequente. Faa um programa que:
a. Leia as pontuaes nos trs meses de cada funcionrio;
b. Calcule e mostre a pontuao geral de cada funcionrio nos trs meses;
c. Calcule e mostre a mdia das pontuaes de cada funcionrio nos trs meses;
d. Determine e mostre a maior pontuao atingida entre todos os funcionrios nos trs meses.

Java Fundamentos
7

Java Fundamentos
8

2
Histrico da linguagem de programao Java
A linguagem Java comeou em 1991, quando um grupo de engenheiros da Sun, liderados por
Patrick Naughton, Sun Fellow e James Gosling, quiseram projetar uma pequena linguagem de
programao que pudesse ser usada em equipamentos de consumo como caixas de
comutao de TV a cabo. Com esses dispositivos no tinham uma grande capacidade de
processamento ou memria, a linguagem tinha de ser pequena para gerar um cdigo bem
limitado em tamanho. Alm disso, como fabricantes diferentes podiam escolher CPUs
diferentes, era importante no ficar preso a uma nica arquitetura. O projeto recebeu o nome
de Green (HORSTMANN, 2003).

Figura 2.1 Breve histrico da linguagem Java.


As exigncias de um cdigo pequeno e compacto levaram a equipe a ressuscitar o modelo de
uma linguagem chamada UCSD Pascal que havia tentado nos primrdios dos PCs e da qual
Niklaus Wirth havia sido pioneiro. O que Wirth havia desbravado, que o UCSD Pascal fez
comercialmente e que os engenheiros do projeto Green tambm adoraram foi projetar uma
linguagem portvel que gerava cdigo intermedirio para uma linguagem hipottica. (Estas
so frequentemente chamadas de mquinas virtuais). Esse cdigo intermedirio poderia
ento ser usado em qualquer mquina que tivesse o interpretador correto. O cdigo
intermedirio gerado nesse modelo sempre pequeno e os interpretadores de cdigo
intermedirio podem ser bastante pequenos, de modo que isso resolvia o problema principal
que eles tinham.
J o pessoal da Sun, que tinha experincia com UNIX, baseou sua linguagem no C++ em vez do
Pascal. Em particular, eles fizeram a linguagem orientada a objetos em vez de orientada a
procedimentos. Porm, como Gosling diz na entrevista, Desde o incio, a linguagem era uma
Java Fundamentos
9

ferramenta, no o fim. Gosling decidiu chamar essa linguagem de Oak (presumivelmente


porque ele gostava da aparncia de um carvalho, oak em ingls, que ficava bem frente de
sua janela na Sun). O pessoal da Sun, mais tarde descobriu que Oak era o nome de uma
linguagem de computador j existente, de modo que trocaram o nome para Java.
Em 1992, o projeto Green apresentava seu primeiro produto, chamado *7. Ele era um
controle remoto extremamente inteligente. (Tinha o poder de uma SPARC station numa caixa
de 15 x 10 x 10 cm). Infelizmente, ningum estava interessado em produzi-lo na Sun e o
pessoal do projeto Green teve que procurar outras formas de comercializar a tecnologia.
Mesmo assim, nenhuma das empresas de equipamentos eletrnicos de consumo estava
interessada. O grupo ento ofereceu um projeto de construo de uma caixa de TV a cabo que
pudesse lidar com novos servios de cabo como vdeo sob demanda. Eles no conseguiram o
contrato. (Ironicamente, a empresa que o fez era liderada por Jim Clark, que comeou a
Netscape uma empresa que fez muito pelo sucesso da linguagem Java).
O projeto Green (com o novo nome de First Person Inc.) gastou todo o ano de 1993 e a
metade de 1994 procurando quem comprasse sua tecnologia. Ningum quis. (Patrick
Naughton, um dos fundadores do grupo e a pessoa que acabou fazendo a maior parte da
comercializao, afirma que acumulou mais de 300000 milhas em viagens areas tentando
vender a tecnologia). A First Person foi dissolvida em 1994.
Enquanto tudo isso ocorria na Sun, a parte World Wide Web da internet estava crescendo
cada vez mais. A chave para a Web o navegador (browser) que converte a pgina de
hipertexto para a tela. Em 1994, a maioria usava Mosaic, um navegador Web no comercial
que surgiu no centro de supercomputao da Universidade de Illinois, em 1993. (O Mosaic
foi parcialmente escrito por Marc Andreessen por U$ 6.85 a hora como estudante de psgraduao em um projeto acadmico. Ele passou para a fama e a fortuna como um dos cofundadores e cabea do grupo Netscape.)
Em uma entrevista para a SunWorld, Gosling disse que na metade de 1994 os
desenvolvedores de linguagem perceberam que Ns podamos elaborar um navegador bom
de verdade. Isso era uma das poucas coisas do processo cliente/servidor que precisava de
algumas das coisas esquisitas que havamos feito: neutralidade de arquitetura, tempo real,
confiabilidade, segurana questes que no eram terrivelmente importantes no mundo das
estaes de trabalho. Assim, construmos um navegador.
O navegador em si foi elaborado por Patrick Naughton e Jonathan Payne e evoluiu at o
navegador HotJava existente hoje em dia. Este foi escrito em Java para mostrar seu poder.
Mas os responsveis pela sua elaborao tambm tiveram em mente o poder do que agora
chamamos de applets, de modo que eles fizeram o navegador capaz de interpretar os
bytecodes intermedirios. Essa demonstrao de tecnologia foi exibida na SunWorld 95 em
23 de maio de 1995 e inspirou a moda Java que continua at hoje.
A grande jogada que espalhou a utilizao da linguagem Java ocorreu na primavera de 1995
(hemisfrio sul), quando a Netscape decidiu fazer a verso 2.0 do navegador Netscape com
capacidade Java. O Netscape 2.0 foi lanado em janeiro de 1996 e tinha capacidade Java
(assim como todas as verses posteriores). Outros licenciados incluram empresas IBM,
Symantec, Inprise e outras. At mesmo a Microsoft foi licenciada e deu suporte linguagem
Java Fundamentos
10

Java. O Internet Explorer tem capacidade Java e o Windows contm uma mquina virtual
Java. (Note-se, porm que a Microsoft no suporta a verso mais recente da linguagem Java, e
que sua implementao difere do Java padro).
A Sun lanou a primeira verso da linguagem Java no incio de 1996. Ela foi seguida pelo Java
1.02 alguns meses depois. As pessoas rapidamente perceberam que o Java 1.02 no seria
usado no desenvolvimento de aplicativos srios. Certamente algum poderia usar o Java 1.02
para fazer um applet de texto nervoso (que move o texto ao acaso na tela). Mas no era
possvel sequer imprimir em Java 1.02! Para ser franco, o Java 1.02 no estava pronto para o
horrio nobre.

Figura 2.2 Linha do tempo: verses da linguagem Java.


Os grandes anncios sobre os futuros recursos da linguagem Java apareceram nos primeiros
meses de 1996. Somente a conferncia JavaOne, ocorrida em San Francisco em maio de 1996,
apresentou um quadro completo mais claro de para onde o Java estava indo. No JavaOne, o
pessoal da Sun Microsystems esboou sua viso do futuro da linguagem Java com uma srie
aparentemente sem fim de aprimoramentos e novas bibliotecas. Havia a desconfiana de que
isso levaria anos para acontecer. No foi o que aconteceu porque num prazo relativamente
curto a maioria das coisas prometidas tinham sido implementadas.
A grande novidade da conferncia JavaOne de 1998 foi o anncio do futuro lanamento do
Java 1.2, que substitui a interface grfica com o usurio e as ferramentas grficas no
profissionais por verses sofisticadas e expansveis que se aproximaram muito mais da
promessa de escreva uma vez, rode em qualquer lugar de seus antecessores. Trs dias aps
seu lanamento, em dezembro de 1998, o nome foi alterado para Java 2. Novamente, no se
acreditava que tudo seria implementado rapidamente. Surpreendentemente, grande parte
foi implementada num tempo curto.

Java Fundamentos
11

Caractersticas da Linguagem
Similaridade com C, C++
Java tem a aparncia de C ou de C++, embora a filosofia da linguagem seja diferente. Por este
motivo estaremos frequentemente fazendo comparaes alguma destas linguagens. O
programador em qualquer uma delas, ou em uma linguagem orientada a objetos, se sentir
mais a vontade e se tornar um bom programador Java em menos tempo.
Tambm possui caractersticas herdadas de muitas outras linguagens de programao:
Objective-C, Smalltalk, Eiffel, Modula-3 etc. Muitas das caractersticas desta linguagem no
so totalmente novas. Java uma unio de tecnologias testadas por vrios centros de
pesquisa e desenvolvimento de software.

Compilao
Um programa em Java compilado para o chamado bytecode, que prximo s instrues de
mquina, mas no de uma mquina real. O bytecode um cdigo de uma mquina virtual
idealizada pelos criadores da linguagem. Por isso Java pode ser mais rpida do que se fosse
simplesmente interpretada.
Alm disso, existem compiladores de cdigo nativo para Java (Asymetrix, Symantec, IBM etc).
H tambm outra forma de compilao, just-in-time (JIT). Esses compiladores trabalham
compilando os bytecodes em cdigo nativo uma vez, guardando o resultado e utilizando nas
outras chamadas.

Figura 2.3 Principais caractersticas do Java.

Portabilidade
Java foi criada para ser portvel. O bytecode gerado pelo compilador para a sua aplicao
especfica pode ser transportado entre plataformas distintas que suportam Java (Solaris 2.3 ,
Windows, Mac/Os etc). No necessrio recompilar um programa para que ele rode numa
Java Fundamentos
12

mquina e sistema diferentes, ao contrrio do que acontece, por exemplo, com programas
escritos em C e outras linguagens.
Esta portabilidade importante para a criao de aplicaes para a heterognea Internet.
Muitos dos programas aqui apresentados foram escritos e compilados numa plataforma
Windows 98 e rodaram perfeitamente quando simplesmente copiados para uma
plataforma Linux. Em Java um inteiro, por exemplo, tem sempre 32 bits, independentemente
da arquitetura. O prprio compilador Java escrito em Java, de modo que ele portvel para
qualquer sistema que possua o interpretador de bytecodes. Um exemplo de programa escrito
em Java o browser Hot Java.

Orientao a Objetos
A portabilidade uma das caractersticas que se inclui nos objetivos almejados por uma
linguagem orientada a objetos. Em Java ela foi obtida de maneira inovadora com relao ao
grupo atual de linguagens orientadas a objetos.
Java suporta herana, mas no herana mltipla. A ausncia de herana mltipla pode ser
compensada pelo uso de herana e interfaces, onde uma classe herda o comportamento de
sua superclasse alm de oferecer uma implementao para uma ou mais interfaces.
Java tambm permite a criao de classes abstratas. Outra caracterstica importante em
linguagens orientadas a objetos a segurana. Dada a sua importncia o tpico foi
considerado separadamente.

Segurana
A presena de coleta automtica de lixo (garbage collection), evita erros comuns que os
programadores cometem quando so obrigados a gerenciar diretamente a memria (C , C++,
Pascal). A eliminao do uso de ponteiros, em favor do uso de vetores, objetos e outras
estruturas substitutivas, traz benefcios em termos de segurana. O programador proibido
de obter acesso memria que no pertence ao seu programa, alm de no ter chances de
cometer erros comuns tais como reference aliasing e uso indevido de aritmtica de ponteiros.
Estas medidas so particularmente teis quando pensarmos em aplicaes comerciais
desenvolvidas para a internet.
Ser strongly typed tambm uma vantagem em termos de segurana, que est aliada a
eliminao de converses implcitas de tipos de C++.
A presena de mecanismos de tratamento de excees torna as aplicaes mais robustas, no
permitindo que elas abortem, mesmo quando rodando sob condies anormais. O
tratamento de excees ser til na segunda parte na modelagem de situaes tais como
falhas de transmisso e formatos incompatveis de arquivos.

Concorrncia
A linguagem permite a criao de maneira fcil, de vrios threads de execuo. Este tpico
ser til quando voc estudar animaes, e particularmente poderoso nos ambientes em
Java Fundamentos
13

que aplicaes Java so suportadas, ambientes estes que geralmente podem mapear os
threads da linguagem em processamento paralelo real.

Eficincia
Como Java foi criada para ser usada em computadores pequenos, ela exige pouco espao,
pouca memria. muito mais eficiente que grande parte das linguagens de scripting
existentes, embora seja muitas vezes mais lenta que C, o que no um marco definitivo. Com
a evoluo da linguagem, existem geradores de bytecodes cada vez mais otimizados que
levam as marcas de performance da linguagem mais prximas das de C++ e C. Alm disso, um
dia Java permite a possibilidade de gerar cdigo executvel de uma particular arquitetura on
the fly, tudo a partir do bytecode. So os compiladores JIT vistos acima que chegam a acelerar
10 a 20 vezes a execuo de um programa.

Suporte para Programao de Sistemas Distribudos


Java fornece facilidades para programao com sockets, remote method call, tcp-ip etc.

Exerccios de Fixao 2 Histrico da linguagem de programao


Java
Liste as principais caractersticas da linguagem de programao Java.

Java Fundamentos
14

3
Fundamentos de Programao em Java
Exerccio de nivelamento 2 Fundamentos de Programao em
Java
O que voc entende por linguagem de programao?

Voc j desenvolveu programas? Que linguagem de programao utilizou?

O que Java?
Java resulta da busca por uma linguagem de programao que englobe todas as
caractersticas da linguagem C++, com a segurana de uma linguagem como SmallTalk.
Java vista com uma linguagem de programao, um ambiente de desenvolvimento e um
ambiente de aplicativos conforme ilustrao da figura 01.
Existem duas grandes categorias de programas Java, os aplicativos, que rodam
independentemente de um navegador e os applets, que dependem de um navegador para ser
executado.

Java Fundamentos
15

Figura 3.1 Estrutura da linguagem Java.

Recursos da Linguagem Java


A arquitetura Java foi desenvolvida para atingir trs objetivos atravs da implementao dos
seguintes recursos: JVM (Mquina Virtual Java), Coleta de Lixo e Segurana de Cdigo.

Mquina Virtual Java


A especificao da Mquina Virtual Java definida como:
Uma mquina imaginria que implementada atravs de emulao em um software
executado em uma mquina real. O cdigo da Mquina Virtual Java est armazenado nos
arquivo .class, que contm, cada, um cdigo para, no mximo, uma classe pblica.
A especificao da Mquina Virtual Java fornece as especificaes da plataforma de
Hardware para a qual todo o cdigo Java est compilado. Essa especificao permite que os
programas Java sejam independentes de plataforma, j que a compilao feita para uma
mquina imaginria. Cabe ao interpretador Java de cada plataforma de hardware especfica
assegurar a execuo do cdigo compilado para a JVM. A figura seguinte ilustra o
funcionamento da JVM.

Java Fundamentos
16

Figura 3.2 Especificao da JVM Java.

Coleta de Lixo
A coleta de lixo realizada automaticamente atravs de uma thread de segundo plano sendo
executada no sistema operacional atravs da JVM especfica desta plataforma de hardware.
Nela os endereos de memria com referncia 0 (zero) so removidos. Esta remoo ocorre
durante o tempo de vida do programa em execuo e tem como objetivo eliminar o
vazamento de endereos de memria.

Segurana de Cdigo
A segurana de cdigo em Java e obtida atravs do processo de compilao e de verificao e
execuo de bytecodes.
A compilao tem como produto final um bytecode, independente de plataforma. A
verificao e execuo de bytecodes so feitas por interpretadores em tempo de execuo.
Este processo realiza trs tarefas:
Carregar o cdigo: executado pelo utilitrio de carga de classe.
Verificar o cdigo: executado pelo verificador de bytecode.
Executar o cdigo: executado pelo interpretador de tempo de execuo.

Java Fundamentos
17

Figura 3.3 Segurana de cdigo em Java.

Comparao de Java com outras Linguagens

Figura 3.4 Comparao de Java com outras linguagens.

Formato geral de um programa Java


Um arquivo .java (unidade de compilao) formado de uma classe ou mais.
Uma nica classe pblica deve ter nome igual ao arquivo que a contm.
Um programa em Java pode ser composto de um ou mais arquivos-fonte .java (unidades
de compilao)
Se for a classe de incio do aplicativo (classe principal ou executvel), contm o mtodo
main.

Java Fundamentos
18

Primeiro Programa
Segue um programa simples em Java:
public class PrimeiroExemplo {
public static void main(String[] args) {
System.out.println(Meu primeiro Programa em Java!!!);
}
}
A primeira coisa a ser observada que Java case sensitive, isto , diferencia entre caracteres
maisculos e minsculos.
Analisando o programa acima, a palavra chave public chamada modificador de acesso.
Esses modificadores controlam o que outras partes do programa podem usar desse cdigo. A
outra palavra chave class diz que tudo est dentro de uma classe, como tudo em Java, e essa
classe tm o nome de PrimeiroPrograma. Existe uma conveno para que os nomes das
classes comecem sempre com letra maiscula.
necessrio que o nome do arquivo tenha o mesmo nome da classe pblica, nesse caso
PrimeiroPrograma.java. Novamente no se pode trocar letras maisculas por
minsculas.

Figura 3.5 Cdigo-fonte em Java.


Ao ser compilado (javac NomeDaClasse) esse cdigo gera um arquivo de bytecodes que
renomeado para .class. Para executar, basta dar o seguinte comando: java NomeDaClasse.

Java Fundamentos
19

Figura 3.6 Compilando e executando um programa Java.


Note que para executar o programa Java no necessrio informar a extenso .class. A
execuo comea com o cdigo contigo na funo main, portanto sendo necessria sua
presena. Os blocos de comandos so delimitados por chaves ({ e }), assim como C/C++ e
PHP.
O mais importante aqui que todo programa em Java deve ter um mtodo main com o
cabealho apresentado na classe PrimeiroExemplo.
Dentro do mtodo, existe uma linha de comando, terminada com ponto e vrgula (;). Todos
os comandos terminam com esse sinalizador. Nessa linha, est sendo usado o objeto
System.out e sendo executado o mtodo println, que simplesmente imprime umo
conjunto de caracteres desejado na tela do computador. A forma geral de chamada de
mtodos de objetos em Java : Objeto.metodo.(parametros);. Se o mtodo no possui
parmetros, usam-se parnteses vazios.

Alguns cuidados ao escrever e executar programas Java


Muitos erros podem ocorrer no momento que voc rodar seu primeiro programa escrito em
Java. Vamos ver alguns deles:
Cdigo:
public class PrimeiroExemplo {
public static void main(String[] args) {
System.out.println(Faltando ; no final da linha de comando!)
}
}
Erro:
PrimeiroExemplo.java:3: ';' expected
}
^
1 error
Java Fundamentos
20

Esse o erro de compilao mais comum. Lembre de que uma linha de comando em Java
dever terminar com o ponto e vrgula ;. Repare que o compilador explcito em dizer que
a linha 3 esta com problemas. Outros erros de compilao podem ocorrer se voc escrever de
forma equivocada alguma palavra chave (que indicam comandos da linguagem), se esquecer
de abrir e fechar chaves {}, dentre outros.
Durante a execuo, outros erros podem aparecer:
- Se voc declarar a classe Exemplo (primeira letra maiscula), compil-la e depois tentar
us-la como e minsculo (java exemplo), o Java te avisa:
Exception in thread "main" java.lang.NoClassDefFoundError:
Exemplo (wrong name: exemplo)
- Se tentar acessar uma classe no diretrio ou classpath errado, ou se o nome estiver errado,
ocorrer o seguinte erro:
Exception in thread "main" java.lang.NoClassDefFoundError: Exemplo
- Se esquecer de colocar static ou o argumento String[] args no mtodo main:
Exception in thread "main" java.lang.NoSuchMethodError: main
- Se no colocar o mtodo main como public:
Class Exemplo doesnt have a main method.

Comentrios
Os comentrios podem ser ou de uma linha (//) ou de vrias linhas (/* e */). Por exemplo:
// imprime na tela comentrio de uma linha
System.out.printl(Hello World!!!);
/* Aqui sera impresso uma linha de texto na
tela: Hello World!!!
*/
System.out.printl(Hello World!!!);
Existe ainda um terceiro tipo de comentrio, utilizado para documentao automtica do
programa em desenvolvimento pela ferramenta javadoc do Java. Neste caso, devemos
utilizar /** para comear e */ para terminar os textos que sero utilizados no processo de
criao dos arquivos de documentao do programa em desenvolvimento.
Os comentrios devem estar localizados imediatamente antes da definio da classe ou
membro comentado. Cada comentrio pode conter uma descrio textual sobre a classe ou
membro, possivelmente incluindo tags HTML, e diretrizes para javadoc. As diretrizes para
javadoc so sempre precedidas por @, como em:
@see nomeClasseOuMembro: gera na documentao um link para a classe ou membro
especificado, precedido pela frase "See also ".
Java Fundamentos
21

A documentao de uma classe pode incluir as diretrizes:


@author: inclui informao sobre o autor na documentao.
@version: inclui informao sobre a verso na documentao.
A documentao de um mtodo pode incluir as diretrizes:
@param nome descrio para a descrio de argumentos.
@return descrio para a descrio do valor de retorno.
@exception nomeClasseExceo: descrio para a descrio de excees lanadas pelo
mtodo.
Apresentamos, a seguir, um exemplo de cdigo java com comentrios para gerao de
documentao pelo javadoc:
/**
* @(#)PrimeiroExemplo.java
*
*
* @author Paulo Henrique Cayres
* @version 1.00 2010/3/2
*/

public class PrimeiroExemplo {


public static void main(String args[]) {
System.out.println("Meu primeiro Programa em Java.");
}
}
Como resultado o javadoc ir gerar arquivos html com a estrutura de classes presente nos
pacotes de classes do projeto em desenvolvimento. A figura seguinte apresenta o resultado
da documentao de uma classe aps a execuo do javadoc.

Java Fundamentos
22

Figura 3.7 Documentao de classes Java pelo javadoc.

Exerccio de Fixao 3 Linguagem de Programao


1. Crie uma classe executvel Java para imprimir uma mensagem com o seu nome completo.
2. Crie uma classe executvel Java para imprimir duas linhas de texto usando duas linhas de
cdigo System.out.
3. Crie a documentao das classes implementadas nos itens a e b utilizando o gerador de
documentao do Java.
4. Qual a primeira impresso que voc teve da linguagem de programao Java?

Java Fundamentos
23

Variveis
Exerccios de nivelamento 3 Variveis
Voc sabe como o computador armazena informaes na memria?

Em Java necessria a declarao de variveis para que possa us-las. Eis alguns exemplos:
byte b;
int umaVariavelInteira;
long umaVariavelLong;
char ch;
Deve-se prestar ateno ao ponto e vrgula no final das declaraes, porque so comandos
completos em Java.
Regras para nomeao de variveis:
Sequncia de letras e dgitos;
Letras: A Z, a z, _ e qualquer caractere Unicode que denote uma
letra em um idioma, por exemplo, em Alemo pode-se usar nos nomes de variveis,
ou P em grego. Apesar de em portugus se poder usar as vogais acentuadas ou cedilha,
no aconselhvel, caso se abra o programa em outro sistema operacional, que pode
gerar algum tipo de confuso;
Dgitos: 0 9 e qualquer caractere Unicode que denote um dgito em uma linguagem;
O comprimento do nome das variveis essencialmente ilimitado;
No se pode utilizar uma palavra reservada (como if, switch, etc).

Tipos de Dados
Java fortemente tipada, o que significa que cada varivel precisa ter seu tipo declarado para
que possa ser usada. H oito tipos primitivos. Seis numricos (4 inteiros e 2 de ponto
flutuante), um o tipo char usado para caracteres no formato Unicode, e o outro boolean
para valores verdadeiro ou falso. No existe nenhum tipo de dados equivalente ao Variant,
que armazena qualquer tipo de dados bsicos. Outros tipos mais elaborados, como String,
no so tipos bsicos e so objetos em Java.

Java Fundamentos
24

Figura 3.8 Tipos da dados primitivos em Java.

Inteiros
So nmeros sem parte fracionria. Veja a tabela a seguir:
Tipo

Armazenamento

Intervalo

Byte

8 bits 1 byte

-128 a 127

short

16 bits 2 bytes

-32.768 a 32.767

Int

32 bits 4 bytes

-2.147.483.648 a 2.147.483.687

Long

64 bits 8 bytes

-9.223.372.036.854.775.808L a 9.223.372.036.854.775.807L

A parte mais interessante dos tipos em Java que eles no dependem de plataforma, isto ,
um valor int sempre ter 4 bytes, seja em Windows, seja em SPARC.

Ponto Flutuante
Os nmeros de ponto flutuante denotam nmeros com partes fracionrias. H dois tipos:
Tipo

Armazenamento

Intervalo

Float

32 bits 4 byte

Aproximadamente r 3.40282347E+38F
(6-7 dgitos decimais significativos)

Double

64 bits 8 bytes

Aproximadamente r
1.79769313486231570E+308
(15 dgitos significativos)

Esses nmeros seguem o formato IEEE 754. O tipo float chamado de preciso simples. E
o double de preciso dupla.

Java Fundamentos
25

Tipo Caractere, char


Apstrofes, ou aspas simples, so usadas para denotar constantes char. Deve-se tomar
cuidado com a diferena:
H : caractere H
H : string contendo um s caractere
Em Java, o tipo caractere representado em Unicode. Normalmente no se precisa saber
como funciona o Unicode, exceto se for necessrio escrever aplicativos internacionais. Isto ,
o Unicode foi desenvolvido para poder representar todos os caracteres de todos os idiomas
possveis do planeta. Para isso possui 2 bytes, sendo assim, permitindo representar at
65536 caracteres, mas atualmente cerca de 35000 somente esto sendo usados.
No formato ASCII/ANSI, somente 1 byte utilizado, com um total de 256 caracteres. Em
Unicode, isso representado pelos primeiros 255 caracteres.
Os caracteres Unicode seguem uma codificao em hexadecimal que vai de \u0000 a
\uffff, sendo os caracteres de \u0000 at \u00ff os caracteres ASCII j
conhecidos. O prefixo \u significa a codificao Unicode. Alm dessa codificao, existe um
conjunto de caracteres de controle vlidos, conforme apresentado na tabela a seguir:
Sequncia

Nome

Valor Unicode

\b

Backspace

\u0008

\t

Tabulao

\u0009

\n

Linefeed

\u000A

\r

Carriage return

\u000D

Aspas duplas

\u0022

Apostrofe (aspas simples)

\u0027

\\

Barra invertida

\u005c

\b

Backspace

\u0008

Em Java, valores do tipo char no so nmeros, ento sua converso necessita uma
converso explcita de tipos.

Tipo boolean
O tipo lgico boolean tem dois valores: falso (false) e verdadeiro (true). utilizado em
testes lgicos.

Atribuies e Inicializaes
Depois da declarao deve-se inicializar as variveis. No se deve ter variveis no
inicializadas, e o compilador geralmente avisa quando uma varivel no foi inicializada.
Java Fundamentos
26

Uma inicializao pode ser feita ou na hora da declarao ou depois, usando-se o nome da
varivel seguido do sinal de igual (=) e depois seguido do valor da inicializao. Por exemplo:
int teste;
char ch;
long i = 0;
teste = 10;
ch = S;
Outro ponto importante que se pode declarar variveis em qualquer lugar no cdigo, mas
cada varivel (identificada por seu nome) somente uma vez em cada trecho.

Converses entre Tipos Numricos


Quaisquer operaes em valores numricos de tipos diferentes so aceitveis e tratadas da
seguinte maneira:
Se qualquer um dos operandos for do tipo double ento o outro ser convertido para
double;
Caso contrrio, se qualquer um dos operandos for float, o outro ser convertido para
float;
Caso contrrio, se qualquer um dos operando for long, o outro ser convertido para
long.
Essa regra funciona tambm para int, short e byte.
s vezes, converses levam perda de informao, como quando se quer transformar um
double para int. Essas converses so feitas atravs de casts, ou seja, converses
explcitas. A sintaxe atravs de parnteses:
double x = 9.997;
int nx = (int) x;
Com isso a varivel ter o valor 9, pois a converso de um valor de ponto flutuante para um
inteiro descarta a parte fracionria (e no arredondado, como em VB). Quando se quer
arredondar (round) um nmero fracionrio para o inteiro mais prximo, usa-se
Math.round:
double x = 9.997;
int nx = (int) Math.round(x);
No exemplo acima o valor 10 ser retornado.
Outro ponto importante que no se pode converter tipos boolean para outros tipos
numricos.

Java Fundamentos
27

Constantes
Para se definir uma constante em Java, usa-se a palavra chave final:
public class UsaConstantes {
public static void main(String[] args) {
final double CM_POR_SOL = 2.54;
double largPapel = 8.5;
double altPapel = 11;
System.out.println(Tamanho papel em cm: +
largPapel * CM_POR_SOL + por +
altPapel * CM_POR_SOL);
}
}
A palavra chave final significa que a varivel s pode receber valor uma vez, e fica definido
para sempre. costume dar nomes totalmente em maisculas para constantes.
O mais comum em Java declarar uma constante e fazer com que ela fique disponvel para
vrios mtodos dentro de uma classe. So geralmente chamadas de constantes de classe.
Pode-se defini-las atravs das palavras-chave static final.
public UsaConstante2 {
public static final double G = 9.81;
public static void main(String[] args) {
System.out.println(G + metros por Segundo ao quadrado.);
}
}

Operadores
Segue uma tabela com os operadores aritmticos:
Operador

Significado

Exemplo

Soma

x = 5 + 10;

+=

Soma com atribuio

x += 10; // x = x + 1

Incremento de 1, aps

x++; // x = x + 1

Incremento de 1, antes

++x; // x = x + 1

Subtrao

x = 5 10;

-=

Subtrao com atribuio

x -= 10; // x = x 10

Decremento de 1, aps

x--;. // x = x 1

Decremento de 1, antes

--x;. // x = x 1

Multiplicao

x = 5 * 10;

++

-*

Java Fundamentos
28

Operador

Significado

Exemplo

*=

Multiplicao com atribuio

x *= 10; // x = x * 10

Diviso, inteira

x = 5 / 10;

Diviso com ponto flutuante

x = 5.0 / 10.5;

/=

Diviso com atribuio

x /= 10; // x = x / 10

Resto da diviso

x = 5 % 10;

%=

Resto da diviso com atribuio

x %= 10; // x = x % 10

A exponenciao feita atravs da funo pow da classe Math, encontrada em java.lang.


Exemplo:
double y = Math.pow(x, a);
O mtodo pow recebe parmetros double e retorna um double tambm.
Segue uma tabela com os operadores Lgicos e Relacionais:
Operador

Significado

Exemplo

==

Igual

if (x == 10) ...

!=

Diferente

if (x != 10) ...

>

Maior

if (x > 10) ...

>=

Maior ou igual

if (x >= 10) ...

<

Menor

if (x < 10) ...

<=

Menor ou igual

if (x <= 10) ...

&&

E lgico

if (x > 10) && (x < 20) ...

||

Ou lgico

if (x > 10) || (x < 20) ...

No lgico

if (!(x > 10)) ...

?:

Condicional ternrio

x = (y==10) ? 0 : 1; // se
y==10, x recebe 0, seno
recebe 1

Segue uma tabela com os operadores de bit a bit:


Operador

Significado

Exemplo

&

E bit a bit

x = y & 32;

&=

E bit a bit com atribuio

x &= 32; // x = x & 32

Java Fundamentos
29

Operador

Significado

Exemplo

Ou bit a bit

x = y | 32;

|=

Ou bit a bit com atribuio

x |= 32; // x = x | 32

Ou exclusivo (XOR)

x = y ^ 32;

^=

Ou exclusivo com atribuio

x ^= 32; // x = x ^ 32

Negao bit a bit

x = ~y;

>>

Deslocamento de bits direita,


estendendo o sinal

x = y >> 3; // desloca 3 bits


direita

>>=

Deslocamento de bits direita,


estendendo o sinal, com atribuio

x >>= 3; // x = x >> 3

<<

Deslocamento de bits esquerda

x = y << 3; // desloca 3 bits


esquerda

<<=

Deslocamento de bits esquerda,


com atribuio

x <<= 3; // x = x << 3

>>>

Deslocamento de bits direita,


com preenchimento de zeros

x = y >>> 3;

>>>=

Deslocamento de bits direita,


com preenchimento de zeros, com
atribuio

x = >>>= 3; // x = x >>> 3

Tipo String
Strings so sequncias de caracteres, como ola. O Java no possui um tipo nativo para o
tratamento de strings, ao invs, possui uma classe pr-definida, chamada String. Cada string
entre aspas uma instncia da classe String.
String e = ;
// string vazia
String ola = Ola;

Concatenao
A linguagem Java permite que o sinal de + seja o operador para concatenao de strings.
String cur = Curso;
String j = Java;
String curso = cur + j;
O resultado do trecho acima a atribuio de CursoJava para a varivel curso. Perceba
que nada inserido nessa concatenao, por isso que no h nenhum espao no resultado.

Java Fundamentos
30

Ao concatenar uma string com um valor que no uma string, este convertido para string
automaticamente:
String censura = 18 + anos;

Substrings
Para se extrair uma substring de uma string, usa-se o mtodo substring da classe
String:
String saudacao = Bem-vindo;
String s = saudacao.substring(0, 3);
Esse cdigo cria uma string (s) que possui os caracteres Bem. No comando substring
acima, o primeiro parmetro o primeiro caractere a ser copiado (o primeiro caractere de
uma string est na posio 0) e o segundo parmetro o ndice do primeiro caractere que
no se quer copiar. No exemplo, o caractere na posio 3 o -.
Para se retornar somente um caractere da string usa-se:
String saudacao = Bem-vindo;
char c = saudacao.charAt(2);
Que retornar o caractere 'm'.

Tamanho
O mtodo length retorna o tamanho de uma string.
String saudacao = ola;
int n = saudacao.length();

// retorna 3

Teste de Igualdade
Para testar a igualdade de duas strings, usa-se o mtodo equals. Por exemplo:
s.equals(t)
Retorna true se as strings s e t forem iguais e false caso contrrio. Outra construo
vlida :
Ola.equals(comando)
Para testar se as strings so idnticas, sem levar em conta a diferenciao entre maisculas e
minsculas usa-se:
Ola.equalsIgnoreCase(ola)
No use o operador == para teste de igualdade, pois ele s compara se duas strings esto no
mesmo local. E claro, se elas estiverem no mesmo local so idnticas.
Pode-se usar tambm o mtodo compareTo:
Java Fundamentos
31

if (saudacao.comparesTo(Ola) == 0) ...

Manipulando dados em Java


O desenvolvimento de programas deve possibilitar, no mnimo, as funes bsicas de
entrada e sada de dados. Devemos nos preocupar em como iremos solicitar os dados aos
usurios de um programa, bem como iremos imprimir os resultados que sero produzidos e
que devero ser mostrados aos usurios para que possam utiliz-los.
O Java possibilita o uso do console (uma janela DOS, por exemplo) ou o uso de interface
grfica (caixas de dilogos na plataforma Windows, por exemplo) para manipulao de
dados.
Por exemplo, podemos lanar mo da classe Scanner para disponibilizar um canal de entrada
de dados via console ou utilizarmos a classe JOptionPane para possibilitar a entrada de
dados com o uso de ambiente visual grfico. Outra classe muito til neste processo a
System que nos possibilita um canal direto para os consoles padro de entrada (teclado) e
sada (tela do computador). Por exemplo, podemos utilizar System.in para obter os dados
que esto sendo digitados no teclado e System.out.print para enviarmos uma mensagem para
a tela do computador. Estas classes foram desenvolvidas para possibilitar interao entre o
usurio e o programa que o mesmo necessita utilizar. O cdigo Java a seguir ilustra o uso da
classe Scanner e JOptionPane para possibilitar a entra e sada de dados em modo texto ou
visual grfico.
Uso da classe Scanner:
Scanner sc = new Scanner(System.in);
String frase = sc.nextLine();
System.out.println(frase);
int i = sc.nextInt();
System.out.println(i);
double temperatura = sc.nextDouble();
System.out.println(temperatura);

Java Fundamentos
32

Figura 3.9 Entrada e Sada em modo texto.


Uso da classe JOptionPane:
String nome = JOptionPane.showInputDialog("Digite seu Nome: ");
JOptionPane.showMessageDialog(null, nome, "Mensagem",
JOptionPane.INFORMATION_MESSAGE);
Pode-se imprimir o resultado esperado como resposta a um problema apresentado no
console (uma janela DOS, por exemplo) usando a instruo System.out.print(x).
Tambm podemos lanar mo de funcionalidades da classe JOptionPane presente no pacote
swing do Java. O pacote swing do Java possibilita o uso de interface grfica para
desenvolvimento de aplicaes. Neste curso iremos utilizar o JOptionPane apenas para nos
auxiliar na construo de interfaces grficas que necessitam interagir com o usurio.

Figura 3.10 Entrada e Sada em modo grfico.

Exerccios de Fixao 4 Variveis


Liste os conceitos e recursos de programao que aprendeu at agora.

Java Fundamentos
33

Quais so as trs principais funcionalidades que um programa deve apresentar para


possibilitar a manipulao e gerao de informaes tendo como base um conjunto de dados
fornecidos?

Atividade 1 Variveis e manipulao de dados


1. Faa uma classe executvel que dados o valor do depsito em uma poupana e a taxa de
juros, informe a valor do rendimento (lucro) e o valor final (saldo resultante).
2. Faa uma classe executvel que dados a distncia percorrida (em Km) e o tempo gasto em
uma viagem (em horas) e calcule e informe a velocidade mdia do carro, sabendo que
Velocidade = 'S / 'T (variao de distncia / variao do tempo).
3. Faa uma classe executvel que dado o salrio de um funcionrio, informe o valor de
imposto de renda a ser pago, sabendo que o imposto equivale a 5% do salrio.

Atividade 2 Variveis e manipulao de dados (Complementar)


1. Faa uma classe executvel que dado o total de despesas realizadas em um restaurante,
informe o valor total a ser pago com gorjeta, considerando a taxa de 10%.
2. Faa uma classe executvel que dado o valor de um produto, informe o novo valor de
venda sabendo-se que este sofreu um aumento de 25%.
3. Faa uma classe executvel que dados o peso atual de uma pessoa e o peso desejado aps
processo de emagrecimento, informe o percentual do peso que dever ser eliminado.
4. Faa uma classe executvel que dados a quantidade de fitas que uma vdeo locadora
possui e o valor que ela cobra por cada aluguel, informe:
Sabendo que um tero das fitas so alugadas por ms, o seu faturamento anual.
Sabendo que quando o cliente atrasa a entrega, cobrada uma multa de 10% sobre o
valor do aluguel e que um dcimo das fitas alugadas no ms so devolvidas com
atraso, o valor ganho com multas por ms.

Java Fundamentos
34

4
Controle de Fluxo
Exerccio de nivelamento 4 Controle de Fluxo
Voc poderia fazer uma breve descrio de como toma decises para solucionar problemas
do seu dia a dia?

Como voc imagina que os computadores tomam decises para solucionar nossos problemas
do dia a dia?

Cite alguns problemas de que voc necessita do auxlio do computador para solucionar.

Escopo de um bloco de comandos


Um bloco de comandos consiste de vrios comandos agrupados com o objetivo de relacionlos com determinado comando ou funo em busca da soluo de um problema. Podemos
utilizar blocos de comandos em instrues como if, for, while, switch e em declaraes
de funes para permitir que instrues faam parte de um contexto desejado que permita
solucionar um problema. Blocos de comandos em Java so delimitados pelos caracteres { e
}. A utilizao dos delimitadores de bloco em uma parte qualquer do cdigo no relacionada
com os comandos citados ou funes no produzir efeito algum, e ser tratada
normalmente pelo interpretador. Pode-se inclusive aninhar blocos, isto , blocos dentro de
blocos. A restrio que no se pode declarar variveis com mesmo nome dentro de blocos
aninhados. Exemplo:
Java Fundamentos
35

public static void main(String[] args) {


int n;

{
int k;
int n;
// erro!!! Variveis com mesmo nome

}
}

Expresso Lgica
Formada por operadores lgicos e operandos que so relaes entre constantes e/ou
variveis ou ainda outras expresses lgicas. Alguma ao durante a execuo do programa
pode estar sujeita a uma condio. Esta condio representada por uma expresso lgica.

Figura 4.1 Operadores Relacionais.

Java Fundamentos
36

Operadores Lgicos
Conectores que tambm so operadores em expresses lgicas.

Figura 4.2 Operadores Lgicos.

Tabela Verdade
Representao do resultado lgico da conexo de 2 ou mais relaes em uma mesma
expresso lgica.

Figura 4.3 Tabela verdade.

Java Fundamentos
37

Estruturas de Deciso
Uma estrutura condicional empregada quando a ao a ser executada (sequncia de
comandos) depender de uma condio.
Estas condies representam expresses lgicas que so satisfeitas ou no. Uma
estrutura condicional tambm conhecida como estrutura de desvio.
Tambm chamadas de estruturas condicionais, os comandos de seleo permitem executar
instrues ou blocos de comandos tendo como base o resultado expresses lgicas
realizadas durante a execuo de um programa.

Comando if
O mais trivial das estruturas condicionais o if. Ele testa uma determinada condio e
executa o bloco de comandos indicado se o resultado da anlise de uma condicao for true.
O comando if possui a seguinte sintaxe:
if (expresso)
comando;
if (expresso) {
comando_1;
...
comando_n;
}
Para incluir mais de um comando na instruo if preciso utilizar a marcao de bloco
comandos, demarcando por chaves o incio e fim das instrues a serem executadas caso o
resultado da anlise de uma condio for verdadeira (true).
O else um complemento opcional para a instruo if. Se utilizado, o comando ser
executado se o resultado da analise de uma condio retornar o valor false. Suas duas
sintaxes so:
if (expresso)
comando_1;
else
comando_2;
ou:
if (expresso)
comando;
else {
comando;
...
comando;
}
Java Fundamentos
38

A seguir, temos um exemplo do comando if/else:


int a, b, maior;
...
if (a > b)
maior = a;
else
maior = b;
O exemplo acima armazena na varivel maior o maior valor entre a e b. Devido a um
processo interno do Java o seguinte cdigo:
if (x!=0 && 1/x + y > x)

no avalia 1/x caso x seja igual a 0 (diviso por 0).

Comando switch
O comando switch atua de maneira semelhante a uma srie de comandos if na mesma
expresso. Frequentemente o programador pode querer comparar uma varivel com
diversos valores, e executar um cdigo diferente a depender de qual valor igual ao da
varivel. Quando isso for necessrio, deve-se usar o comando switch. O exemplo seguinte
mostra dois trechos de cdigo que fazem a mesma coisa, sendo que o primeiro utiliza uma
srie de ifs e o segundo utiliza switch:
if (i == 0)
System.out.print("i igual a zero");
else if (i == 1)
System.out.print("i igual a um");
else if (i == 2)
System.out.print("i igual a dois");
switch (i) {
case 0:
System.out.print("i
break;
case 1:
System.out.print("i
break;
case 2:
System.out.print("i
break;
default:
System.out.print("i
break;
}

igual a zero");

igual a um");

igual a dois");

diferente de tudo");

A clusula default serve para tratar valores que no esto em nenhum case. opcional.
Java Fundamentos
39

importante compreender o funcionamento do switch para no cometer enganos. O


comando switch testa linha a linha dos cases encontrados, e a partir do momento que
encontra um valor igual ao da varivel testada, passa a executar todos os comandos
seguintes, mesmo os que fazem parte de outro teste, at o fim do bloco. Por isso usa-se o
comando break, quebrando o fluxo e fazendo com que o cdigo seja executado da maneira
desejada. Segue outro exemplo:
switch (i) {
case 0:
System.out.print("i igual a zero");
case 1:
System.out.print("i igual a um");
case 2:
System.out.print("i igual a dois");
}
No exemplo acima, se i for igual a zero, os trs comandos System.out.print sero
executados. Se i for igual a 1, os dois ltimos System.out.print sero executados. O
comando s funcionar da maneira desejada se i for igual a 2.

Exerccio de Fixao 5 Estruturas de Deciso


1. Crie uma classe executvel Java que leia dois nmero e imprima o menor.
2. Crie uma classe executvel Java que receba dois nmeros e execute as operaes listadas
abaixo de acordo com a escolha do usurio.
Escolha do usurio

Operao

Mdia entre os nmeros digitados

Diferena do maior pelo menor

Produto entre os nmeros digitados

Diviso do primeiro pelo segundo

Se a opo digitada for invlida, mostrar uma mensagem de erro e terminar a execuo do
programa. Lembre-se que na operao 4 o segundo nmero deve ser diferente de zero.
3. Uma empresa decide dar um aumento de 30% aos funcionrios com salrios inferiores a
R$ 500,00. Crie uma classe executvel Java que receba o salrio do funcionrio e mostre o
valor do salrio reajustado ou uma mensagem caso o funcionrio no tenha direito ao
aumento.

Java Fundamentos
40

Estruturas de Repetio
Exerccio de nivelamento 5 Estruturas de Repetio
Ns j vimos que necessitamos de variveis para armazenar valores para possibilitar
processamento de dados e impresso de resultados? Imagine que voc tenha que
desenvolver um programa para ler e imprimir notas de 5000 alunos. Que ideia voc
apresentaria para solucionar este problema com os recursos que voc aprendeu at agora?

Definio
Estruturas de repetio so estruturas que repetem um bloco de instrues at que uma
condio de parada especificada seja satisfeita. No Java, trabalharemos com as seguintes
estruturas:
while
do while
for

Comando while
O while o comando de repetio (lao) mais simples. Ele testa uma condio lgica e
executa um comando, ou um bloco de comandos, at que a condio testada seja falsa.
Sintaxe:
while (<expressao>)
<comando>;
while (<expressao>) {
comando_1;
...
comando_n;
}
A expresso s testada a cada vez que o bloco de instrues termina, alm do teste inicial.
Se o valor da expresso passar a ser false no meio do bloco de instrues, a execuo segue
at o final do bloco. Se no teste inicial a condio for avaliada como false, o bloco de
comandos no ser executado.
Java Fundamentos
41

O exemplo a seguir mostra o uso do while para imprimir os nmeros de 1 a 10:


i = 1;
while (i <=10)
System.out.print(i++);

Comando do ... while


O lao do...while funciona de maneira bastante semelhante ao while, com a simples
diferena que a expresso testada ao final do bloco de comandos. O lao do...while
possui apenas uma sintaxe, que a seguinte:
do {
comando_1
...
comando_n
} while (<expressao>);
O exemplo utilizado para ilustrar o uso do while pode ser feito da seguinte maneira
utilizando o do...while:
i = 0;
do {
System.out.print(++i);
} while (i < 10);

Comando for
O tipo de lao mais complexo o for. Para os que programam em C, C++, a assimilao do
funcionamento do for natural. Mas para aqueles que esto acostumados a linguagens como
Pascal, h uma grande mudana para o uso do for. As duas sintaxes permitidas so:
for (<inicializacao>; <condicao>; <incremento>)
comando;
for (<inicializacao>; <condicao>; <incremento>) {
comando_1;
...
comando_n;
}
As trs expresses que ficam entre parnteses tm as seguintes finalidades:
Inicializao: Comando ou sequncia de comandos a serem realizados antes do inicio do
lao. Serve para inicializar variveis;
Condio: Expresso booleana que define se os comandos que esto dentro do lao
sero executados ou no. Enquanto a expresso for verdadeira (valor diferente de zero)
os comandos sero executados;
Incremento: Comando executado ao final de cada execuo do lao.
Java Fundamentos
42

Um comando for funciona de maneira semelhante a um while escrito da seguinte forma:


<inicializacao>
while (<condicao>) {
comandos
...
<incremento>
}
Exemplo:
for (i=1; i<=10; i++)
System.out.print(i);

Quebra de fluxo
Os comandos de quebra de fluxo servem para sair dos laos incondicionalmente, ou para
executar o prximo passo.

Comando Break
O comando break pode ser utilizado em laos do, for e while, alm do uso j visto no
comando switch. Ao encontrar um break dentro de um desses laos, o interpretador Java
para imediatamente a execuo do lao, seguindo normalmente o fluxo do cdigo:
while (x > 0) {
...
if (x == 20) {
System.out.println("erro! x = 20");
break;
}
...
}
No trecho de cdigo acima, o lao while tem uma condio para seu trmino normal (x <=
0), mas foi utilizado o break para o caso de um trmino no previsto no incio do lao.
Assim o interpretador seguir para o comando seguinte ao lao.
Existe outra modalidade de break que o break rotulado. Eles so usados quando se
necessita sair de blocos aninhados e no se quer inserir um monte de condies de sada, em
cada um dos nveis dos laos. Por exemplo:
int n;
ler_dados:
while (...) {
for (...) {
n = Console.readInt(...);
if (n < 0)
// nunca deveria ocorrer
Java Fundamentos
43

break ler_dados;
...
}
}
// verifica se a entrada de dados foi bem sucedida
if (n<0) {
// situao invlida
}
else {
// entrada de dados normal
}

Comando continue
O comando continue tambm deve ser utilizado no interior de laos, e funciona de
maneira semelhante ao break, com a diferena que o fluxo ao invs de sair do lao volta
para o incio dele, executando a prxima iterao. Vejamos o exemplo:
for (i = 0; i < 100; i++) {
if (i % 2)
continue;
System.out.println(i);
}
O exemplo acima uma maneira ineficiente de imprimir os nmeros pares entre 0 e 99. O
que o lao faz testar se o resto da diviso entre o nmero e 2 0. Se for diferente de zero
(valor lgico true) o interpretador encontrar um continue, que faz com que os
comandos seguintes do interior do lao sejam ignorados, seguindo para a prxima iterao.
Pode-se usar o comando continue dentro de laos for, while e do...while.

Comando return
O comando return usado para sair do mtodo corrente, e tambm para retornar valores
de mtodos que tm retorno. Exemplo:
return ++cont;
return;

Java Fundamentos
44

Exerccios de Fixao 6 Controle de fluxo


Liste os recursos de programao utilizados para implementar estruturas para tomada de
deciso e de repetio de bloco de comandos disponveis na linguagem de programao Java.

Voc acredita que as estruturas de repetio facilitam o desenvolvimento de programas que


manipulam grandes volumes de dados? Justifique sua resposta.

Atividade 1 Controle de fluxo


1. Faa uma classe executvel que calcule e imprima o somatrio de todos os nmeros
inteiros existentes entre 200 e 400.
2. Faa uma classe executvel que calcule e imprima a mdia do somatrio dos nmeros
inteiros existentes entre 500 e 700.
3. Faa uma classe executvel que dado um nmero inteiro, calcule e imprima o seu fatorial.
O fatorial de um nmero n n * n-1 * n-2 ... at n = 1. Por exemplo, o fatorial de 4 24 ( 4 * 3 *
2 * 1).
4. Faa uma classe executvel que calcule e imprima o somatrio dos nmeros pares
existentes entre 100 e 500.

Atividade 2 Controle de fluxo (complementar)


1. Faa uma classe executvel que calcule e imprima o somatrio dos nmeros impares
existentes em 300 e 700.
2. Faa uma classe executvel que dado um nmero, informe se ele divisvel por 5.

Java Fundamentos
45

3. Uma prefeitura abriu uma linha de crdito para seus funcionrios. O valor mximo da
prestao no poder ultrapassar 25% do salrio bruto. Faa uma classe executvel que
dados o valor do salrio bruto e o valor da prestao, informe se o emprstimo pode ou no
ser concedido.
4. Faa uma classe executvel que dados os limites de um intervalo [a; b], informe a soma de
todos os nmeros naturais neste intervalo. Exemplo: [4, 7] => 4+5+6+7=22.

Java Fundamentos
46

5
Arrays
Estrutura de dados que armazena um nmero fixo de elementos do mesmo tipo.
Vetor ou Matriz.
Uni e Multidimencional.

Exerccio de nivelamento 6 Arrays


No incio do captulo anterior voc pensou numa soluo para resolver o problema de
implementar um programa para ler e imprimir notas de 5000 alunos. Agora necessitamos da
mesma soluo sendo que todas as notas lidas devem ser armazenadas na memria do
computador. Que soluo voc apresentaria para solucionar este problema com os recursos
que voc aprendeu at agora?

Definio
Um array uma varivel composta homognea uni ou multidimensional formada por uma
sequncia de valores, todas do mesmo tipo, com o mesmo identificador (mesmo nome) e
alocadas sequencialmente na memria. Uma vez que os valores so alocados
sequencialmente e tem o mesmo nome, a forma utilizada para acess-los e atravs de um
ndice, que referencia a localizao de um valor dentro da estrutura onde ele est
armazenado.
Arrays so objetos em Java que possibilitam o armazenamento de dados primitivos. Arrays
servem para manipular uma grande quantidade de dados sem que se precise declarar vrias
variveis do mesmo tipo.

Java Fundamentos
47

Figura 5.1 Representao grfica de array.


Aprender a usar arrays sempre um problema em qualquer linguagem de programao. Isso
porque envolve uma srie de conceitos, sintaxe e outras definies de manipulao de
endereo de memria no computador. No Java, muitas vezes utilizamos outros recursos em
vez de arrays, em especial os pacotes de colees do Java, que veremos mais a frente neste
curso. Portanto, fique tranquilo caso no consiga digerir toda sintaxe dos arrays num
primeiro momento.

Utilizao de Arrays
Devemos seguir 3 passos durante a escrita de um programa Java:
Declarao diz ao compilador o nome do array e o tipo de elemento que ser
armazenado.
Construo Quando o array construdo, seus elementos so automaticamente
inicializados para os valores padro.
Posies de vetores numricos 0 (zero)
Posies de vetores booleanos false
Posies de vetores de objetos null
Inicializao durante a construo ou utilizar cdigo Java para faz-la.

Figura 5.2 Utilizao de Arrays.


Java Fundamentos
48

Um array uma estrutura de dados que armazena um conjunto de valores de mesmo tipo.
Voc acessa cada valor individual atravs de um ndice inteiro. Por exemplo, se x um array
de inteiros, ento x[i] o i-simo inteiro no array.

Figura 5.3 Manipulao de array na memria do computador.


Voc declara uma varivel de array especificando o tipo primitivo de dados que ele
armazenar seguido de [] (abre e fecha colchetes) e o nome da varivel do tipo array. Por
exemplo, a representa a declarao de um array de inteiros:
int[] a;
Entretanto, essa instruo apenas declara a varivel a como sendo um array. Ela ainda no
foi inicializa como um array, no sendo possvel, ainda, armazenar valores em a. O operador
new utilizado para criar o array na memria do computador. Utilize a instruo abaixo para
informar o total de endereos de memria que sero referenciados pelo identificador a.
int[] a = new int[100];
Essa instruo configura um array que pode conter no mximo 100 nmeros inteiros. As
entradas do array so numeradas de 0 a 99 (e no de 1 a 100). Uma vez que o array foi
criado, voc pode preencher suas entradas (endereos de memria) usando, por exemplo,
uma estrutura de repetio:
int[] a = new int[100];
for (int i = 0; i < 100; i++)
a[i] = i; // preenche o array com 0 a 99
Ateno: Se voc construir um array com 100 elementos e depois tentar acessar o elemento
a[100] (ou qualquer outro ndice fora do intervalo 0 . . . 99), o seu programa terminar com
uma exceo array index out of bounds que indica que voc esta tentando acessar um
endereo de memria que no pode ser referenciado pela varivel a.
Voc pode utilizar o Para encontrar o nmero de elementos de um array, use
arrayName.length. Por exemplo,
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);

Java Fundamentos
49

Uma vez que voc crie um array, voc no poder mudar seu tamanho, embora voc possa,
claro, mudar um elemento especfico do array.

Voc pode definir uma varivel de array, como segue:


int[] a;
ou como:
int a[];
A maioria dos programadores Java prefere o primeiro estilo, pois ele separa corretamente o
tipo int[] (array de inteiros) do nome da varivel.

Tamanho de uma array


Uma vez criado o array, complicado alterar o seu tamanho. A partir do momento que uma
array foi criada num programa em execuo ela no pode mudar de tamanho. A alterao
poder ser feita antes de se iniciar a execuo do programa, durante o processo de criao do
mesmo.
Vale lembrar que j tivemos um exemplo de array em Java, na clssica funo
main(String[] args). Esse array referencia um conjunto de strings, que so os
parmetros passados para um programa na linha de comando quanto iniciamos sua chamada
para ser executada.
Arrays so o primeiro exemplo de objetos cuja criao o programador precisa lidar
explicitamente, usando o operador new.
int[] arrayDeInts = new int[100];
A linha de comando acima define um array de inteiros de 100 elementos, indexados de 0 a
99. Uma vez criado, pode-se preencher esse array da seguinte forma:
int[] arrayDeInts = new int[100];
for (int i=0; i<100; i++)
arrayDeInts[i] = i;
Existe ainda uma forma simplificada:
int[] smallPrimes = {2, 3, 5, 7, 11, 13};
Nesse caso no se usa o comando new que cria um array de inteiros e preenche com os dados
dentro das chaves. Isso usado quando se quer passar um array como parmetro e no se
quer criar uma varivel para isso, por exemplo:
printLabels(new String[] {Regiao, Vendas});
Utilize o atributo length para se descobrir o tamanho de um array da seguinte forma:
arrayName.length.

Java Fundamentos
50

Cpia de Arrays
Pode-se copiar uma varivel de array em outra, fazendo com que as duas variveis faam
referncia ao mesmo array.
int [] luckyNumbers = smallPrimes;
Nesse exemplo os dois arrays iro acessar os mesmos elementos. Caso se queira realmente
copiar os elementos de um para o outro, fazendo com que os elementos sejam duplicados,
usa-se o mtodo arraycopy da classe System. A sintaxe :
System.arraycopy(de, indiceDe, para, indicePara, contagem);

Arrays como Argumentos


Os arrays podem ser usados como argumentos de um mtodo definido pelo usurio,
exatamente como qualquer outro tipo. Deve-se saber, contudo, que os mtodos que recebem
arrays como parmetros podem alterar os elementos do array.

Arrays como Valores de Retorno


O tipo de retorno de um mtodo pode tambm ser um array. Isso til quando se deseja
retornar uma sequncia de valores. Por exemplo:
public static int[] drawing(int high, int number)

Arrays Multidimensionais
Arrays multidimensionais, ou matrizes, para simplificar, so fceis de declarar:
int[][] Tabuleiro;
Uma vez inicializada:
Tabuleiro = new int[8][8];
Pode-se utilizar cada um dos elementos da seguinte forma:
Tabuleiro[3][2] = 10;
Nota-se que a sintaxe e manipulao dos elementos muito similar usada em outras
linguagens de programao. Mas um aspecto deve ser visto com calma. Os arrays
multidimensionais so implementados com arrays de arrays.
No exemplo acima, Tabuleiro na verdade um array com 8 elementos, cada um desses
elementos sendo um array de oito elementos inteiros.
A expresso Tabuleiro[3] se refere ao subarray de ndice 3, e Tabuleiro[3][2] se
refere ao elemento (int) de ndice 2 desse subarray.
Para inicializar uma matriz na declarao, usa-se como no exemplo:

Java Fundamentos
51

int [][] vendas = {{1998, 1998}, {10000, 20000}};

Exerccios de Fixao 7 Arrays


Voc poderia descrever os ganhos e limitaes que temos quanto implementamos programas
utilizando array?

Voc acredita que arrays facilitam o desenvolvimento de programas que manipulam grandes
volumes de dados? Justifique sua resposta.

Atividade 1 Arrays
1. Faa uma classe executvel que dado um conjunto de 20 elementos numricos, informe a
soma de todos os nmeros pares.
2. Faa uma classe executvel que dado um conjunto com a idade de 50 pessoas, informe a
percentual em cada faixa etria: de 0 a 15 anos, de 16 a 30 anos, de 31 a 45 anos, de 46 a 60
anos e mais que 60 anos.
3. Faa uma classe executvel que receba por meio da linha de comando do programa
(prompt) um nmero natural (de 1 a 10) e informe a sua tabuada.

Atividade 2 Arrays (Complementar)


1. Faa uma classe executvel que leia a altura, a idade e o sexo de 50 pessoas e fornea as
seguintes informaes:
a. A maior altura e a menor altura;
b. A mdia de altura de mulheres;
c. A idade do homem mais velho.
2. Faa uma classe executvel que leia uma matriz quadrada de ordem 4x4 e fornea as seguintes
informaes:
a. Imprima os elementos da diagonal principal;
b. Imprima os elementos da diagonal secundria;
c. Imprima a mdia aritmtica de todos os elementos da matriz.

Java Fundamentos
52

6
Classes Especializadas
Exerccio de nivelamento 7 Classes Especializadas
Listar padres de formatao de informaes que voc consegue identificar no seu dia a dia?
Voc conhece padres de formatao que so diferentes entre continentes ou pases?

Utilizado para manipulao de dados primitivos.


Todo tipo bsico tem correspondentes de Classe Wrapper.
Conjunto de classes especializadas para formatao:
Data, calendrio.
Nmeros.

Wrappers de Objetos
Ocasionalmente necessrio converter um tipo bsico como int, para um objeto. Todos os
tipos bsicos tm correspondentes de classe. Por exemplo, existe um correspondente da
classe Integer para o tipo bsico int. Esses tipos de classes so normalmente chamadas
de wrappers de objeto. As classes wrapper tm nomes bvios: Integer, Long, Float,
Double, Short, Byte, Character, Void e Boolean. As seis primeiras herdam do
wrapper comum Number. As classes wrapper so final. Portanto, voc no pode sobrepor
o mtodo toString em Integer, para exibir nmeros usando algarismos romanos, por
exemplo. Voc tambm no pode alterar os valores que armazena no wrapper de objeto
(HORSTMANN, 2003).
Frequentemente, voc ver os wrappers de nmero por outro motivo. Os projetistas da
linguagem Java acharam os wrappers um lugar conveniente para colocar certos mtodos
bsicos, como aqueles para converter strings de dgitos para nmeros.
Para converter uma string em um inteiro, voc precisa usar a instruo a seguir:
int x = Integer.parseInt(s);

Java Fundamentos
53

Analogamente, voc pode usar o mtodo Double.parseDouble para analisar nmeros de


ponto flutuante. A tabela abaixo apresenta as classes wrappers e seus tipos de dado
primitivo correspondente.
Tipo primitivo

Classe wrapper

Parmetro para o construtor

Byte

Byte

byte ou String

Short

Short

short ou String

Int

Integer

int ou String

Long

Long

long ou String

Float

Float

float, double ou String

Double

Double

double ou String

Char

Character

char

Boolean

Boolean

boolean ou String

Outro uso importante dos wrappers ser um lugar interessante para agrupar
funcionalidades referentes ao tipo bsico que ele empacota, como alguns tipos de converses
suportados pela linguagem Java.

Date, DateFormat e Calendar


Date
A classe Date representa um instante especfico no tempo, com preciso de milissegundos.
Embora a classe Date pretenda reproduzir o tempo universal coordenado (UTC), ela no o
faz exatamente. O processo de reproduo dependente do ambiente onde a mquina virtual
Java esta hospedado. Quase todos os sistemas operacionais modernos assumem que 1 (um)
dia igual a 86400 segundos (24 horas 60 minutos 60 segundos). No UTC, no entanto,
cerca de uma vez a cada ano ou dois, h um segundo extra, chamada de "segundo bissexto". O
saldo de um segundo sempre adicionado como o ltimo segundo do dia, e sempre em 31 de
dezembro ou 30 de junho de um determinado ano. Por exemplo, o ltimo minuto do ano de
1995 foi de 61 segundos de durao, graas ao salto de um segundo. A maioria dos relgios
de computadores no precisa o suficiente para ser capaz de acrescentar o salto de segundo
previsto no UTC.
Alguns padres de computador so definidos em termos do meridiano de Greenwich (GMT),
o que equivale hora universal (UT). GMT o nome "civil" para o padro; UT o nome
"cientfico" para o mesmo padro. A distino entre o UTC e UT que UTC baseado em um
relgio atmico e UT baseado em observaes astronmicas, que para todos os efeitos
prticos, um fino de cabelo invisvel para se dividir, devido rotao da Terra no ser
uniforme (que desacelera e acelera de maneiras complicadas), UT nem sempre flui de
maneira uniforme. Os saltos de segundos so introduzidos conforme a necessidade em UTC,
Java Fundamentos
54

de modo a manter dentro de 0,9 segundo UTC de UT1, que uma verso de UT com
determinadas correes aplicadas. H outra hora e sistemas de datas, bem como, por
exemplo, a escala de tempo utilizado pelo sistema de posicionamento por satlite (GPS), que
sincronizada para UTC, mas no est ajustada para os segundos bissextos.
Em todos os mtodos da classe Date que aceitar ou voltar ano, ms, dia, hora, minuto,
segundo e os valores, as representaes seguintes so utilizados:
Um ano y representado pelo nmero inteiro y - 1900.
Um ms representado por um nmero inteiro de 0 a 11; 0 de Janeiro, 1 de Fevereiro,
e assim por diante, assim 11 de Dezembro.
A data (dia do ms) representada por um inteiro de 1 a 31.
Uma hora representada por um nmero inteiro de 0 a 23. Assim, a hora a partir de
meia-noite s 01:00 horas 0, e na hora do meio-dia s 01:00 de 12 horas.
Um minuto representado por um inteiro de 0 a 59.
Um segundo representado por um inteiro de 0 a 61; os valores 60 e 61 ocorrem apenas
durante segundos bissextos e mesmo assim apenas em implementaes Java que
efetivamente controlam segundos intercalados corretamente.

DateFormat
DateFormat uma classe abstrata para formatao de data/hora. Subclasses de formatao
de data/hora, como SimpleDateFormat, permite a formatao (de data para texto), anlise
(de texto para data), dentre outras funcionalidades. A data representada como um objeto
Date ou como os milissegundos desde 1 de Janeiro de 1970, 00:00:00 GMT.
DateFormat fornece mtodos de classe para a obteno de muitos formatadores padro de
data/hora com base no padro ou uma localidade especfica e uma srie de estilos de
formatao. Os estilos de formatao incluem FULL, LONG, MEDIUM e SHORT.
DateFormat ajuda a formatar e analisar as datas para qualquer localidade. Seu cdigo pode
ser completamente independente das convenes de localizao de meses, dias da semana,
ou at mesmo o formato do calendrio: lunar versus solar.
Para formatar uma data para a localidade atual, use um dos mtodos de fbrica estticos:
myString = DateFormat.getDateInstance().format(myDate).;
Se voc estiver formatando vrias datas, o mais eficiente para obter o formato e us-lo vrias
vezes para que o sistema no tenha que buscar as informaes sobre o idioma local e
convenes do pas vrias vezes.
DateFormat df = DateFormat.getDateInstance();
for (int i = 0; i < a.length; i++) {
output.println (df.format(myDate [i]) + ";");
Java Fundamentos
55

}
Utilize a chamada para o mtodo getDataInstance para formatar uma data para uma
localidade diferente.
DateFormat df = DateFormat.getDateInstance (DateFormat.LONG, Locale.FRANCE);
Voc pode usar um DateFormat para converter uma string em data tambm.
myDate = df.parse (myString);
Use getDateInstance para obter o formato da data para uma determinada localidade. Existem
outros mtodos disponveis que podem ser utilizados. Por exemplo, use getTimeInstance
para obter o formato de tempo de um determinado pas. Use getDateTimeInstance para
obter um formato de data e hora. Voc pode passar em opes diferentes para estes mtodos
de fbrica para controlar o comprimento do resultado; de curto a mdio e longo para FULL. O
resultado exato depende da localidade, mas em geral:
SHORT completamente numrica, como 12.13.52 ou 15:30
MEDIUM mais longo, como 12 de janeiro de 1952
LONG mais longo, como 12 janeiro de 1952 ou 03:30:32
FULL mais completo, como tera-feira, 12 de abril, 1952 AD ou 03:30:42 PST.

Calendar
Calendar uma classe abstrata de base para a converso entre um objeto Date e um conjunto
de campos inteiros, tais como ano, ms, dia, hora, e assim por diante. Um objeto Date
representa um momento especfico no tempo com preciso de milissegundos.
Subclasses de Calendar interpretam uma data de acordo com as regras de um sistema de
calendrio especfico. A plataforma Java fornece uma subclasse concreta de Calendar:
GregorianCalendar. Subclasses futuras poderiam representar os vrios tipos de calendrios
lunares em uso em muitas regies do mundo.
A classe Calendar utiliza o mtodo getInstance(), para obter um objeto. O mtodo
getInstance() de Calendar retorna um objeto Calendar com campos inicializados com a data e
hora atual:
Calendar agora = Calendar.getInstance();
Um objeto Calendar pode produzir todos os valores de um instante na linha do tempo em
sesu campos, necessrios para implementar a formatao de data e hora para um
determinado idioma e estilo de calendrio, como, por exemplo, japons-gregoriano, japons
tradicional. Calendar define o intervalo de valores devolvidos por certos campos, bem como
o seu significado. Por exemplo, o primeiro ms do ano tem o valor para o campo MONTH
igual a janeiro para todos os calendrios.

Java Fundamentos
56

NumberFormat
NumberFormat a classe base abstrata para todos os formatos de nmero. Essa classe
fornece a interface para formatao e anlise de nmeros. NumberFormat tambm fornece
mtodos para determinar quais locais tm formatos de nmeros.
NumberFormat ajuda a formatar e analisar os nmeros para qualquer localidade (Locale).
Seu cdigo pode ser completamente independente das convenes Locale para pontos
decimais, milhares-separadores, ou at mesmo para a particularidade do uso de dgitos
decimais, ou se o formato do nmero esta na base decimal.
Para formatar um nmero para o Locale atual, use um dos mtodos de classe:
myString = NumberFormat.getInstance().format(myNumber);
Para formatar um nmero para uma localidade diferente, especific-lo na chamada para
getInstance.
NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
Voc tambm pode usar um NumberFormat para analisar nmeros:
myNumber = nf.parse(myString);
Use getInstance ou getNumberInstance para obter o formato do nmero normal. Use
getIntegerInstance para obter um formato de nmero inteiro. Use getCurrencyInstance para
obter o formato de nmero de moeda. E usar getPercentInstance para obter um formato para
apresentar porcentagens. Com getPercentInstance, por exemplo, a fraco 0,53 ser
mostrada como 53%.

DecimalFormat
DecimalFormat uma subclasse concreta de NumberFormat utilizada para formatar
nmeros com casas decimais. Ela tem uma variedade de caractersticas projetadas para
tornar possvel a analise e formatao de nmeros em qualquer localidade (Locale),
incluindo suporte para o idioma rabe e dgitos snscritos (lngua antiga utilizada na ndia).
Ele tambm suporta diferentes tipos de nmeros, incluindo inteiros (123), de ponto fixo
nmeros (123,4), notao cientfica (1.23E4), porcentagens (12%), e quantidade monetria
(R$ 123).
Para obter um NumberFormat para uma localidade especfica, incluindo a localidade padro
definida no sistema operaiconal, chame um dos mtodos da classe NumberFormat, tal como
getInstance(). Em geral, no chame os construtores DecimalFormat diretamente, j que os
mtodos de NumberFormat pode retornar outras subclasses de DecimalFormat.
Um DecimalFormat compreende um padro e um conjunto de smbolos. O padro pode ser
definido diretamente utilizando o mtodo applyPattern(), ou indirectamente, utilizando os
mtodos de API. Os smbolos so armazenados em um objeto DecimalFormatSymbols.

Java Fundamentos
57

Padro de Caracteres Especiais


Symbol

Significado

Dgito

Dgito. Suprime a impresso de zeros esquerda

Separador de casas decimais para nmeros fracionrios e


valores monetrios

Sinal de menos

Separador de agrupamento

Separa mantissa e expoente em nmeros com em notao


cientfica

Separa subpadres positivos e negativos

Multiplica por 100 e mostra como presencial

\u2030

Multiplica por 1000 e mostra como por milhagem

'

Usado para incluir caracteres especiais em um prefixo


ou sufixo, por exemplo, "'#' #" formatos de 123 para "#
123".

Math
A classe Math contm uma variedade de funes matemticas que voc pode precisar
ocasionalmente, dependendo do tipo de programao que realize.
Para extrair a raiz quadrada de um nmero, voc usa o mtodo sqrt:
double x = 4;
double y = Math.sqrt(x);
System.out.println(y); // imprime 2.0

A linguagem de programao Java no tem nenhum operador para elevar uma quantidade a
uma potncia: voc deve usar o mtodo pow da classe Math. A instruo
double y = Math.pow(x, a);
Configura y como sendo x elevado potncia a (xa). O mtodo pow tem parmetros que so
de tipo double e tambm retorna um valor double.
A classe Math fornece as funes trigonomtricas normais: Math.sin, Math.cos, Math.tan,
Math.atan, Math.atan2 e a funo exponencial e sua inversa, o logartmo natural: Math.exp,
Math.log. Finalmente, existem duas constantes: Math.PI e Math.E
Java Fundamentos
58

Exerccios de Fixao 8 Classes Especializadas


Para que servem as classes especializadas?

Atividade 1 Classes Especializadas


1. Faa uma classe executvel que dada uma string, informe:
a. Quantos espaos em branco existem.
b. A quantidade de vogais que aparecem e qual o percentual em relao aos caracteres
digitados.
2. Faa uma classe executvel que dada uma string, construa outra string substituindo a
letra S por $, E por 3, A por 4, G por 6, B por 8, O por * U por #.
3. Faa uma classe executvel que verifique se uma cadeia de caracteres um palndromo.
Uma cadeia de caracteres um palndromo se a inverso da ordem de seus caracteres resulta
na mesma cadeia. Suponha que todas as letras da cadeia estejam em letras minsculas.
Exemplos: ovo, 1991, amor me ama em roma.
Ateno: Em alguns casos necessrio desconsiderar caracteres de pontuao, acentuao e
espao e, ainda, maiscula de minscula, para verificar se uma cadeia um palndromo.
Exemplo: Socorram-me, subi no nibus em Marrocos..

Atividade 2 Classes Especializadas (Complementar)


1. Faa uma classe executvel que leia uma senha de no mnimo 6 caracteres e no mximo
12 caracteres, sendo que o primeiro caractere deve ser uma letra e deve conter pelo menos 2
nmeros (em qualquer posio, exceto na primeira). Caso o usurio no fornea uma senha
com estas especificaes, mostrar a mensagem senha no vlida e solicitar que digite uma
senha novamente (at ser vlida).
2. Faa uma classe executvel que informe uma das mensagens a seguir, de acordo com a
hora do sistema. 0h at 5:59h, Boa madrugada 6h at 11:59h, Bom dia 12h at
17:59h, Boa tarde e das 18h at 23:59h, Boa noite.
3. Faa uma classe executvel que dado a data de nascimento de uma pessoa (dia, ms e
ano), informe quantos anos ela tem.
Java Fundamentos
59

4. Faa uma classe executvel que dado a data de vencimento de uma fatura (dia, ms, ano)
que j venceu (fatura em atraso) e seu valor, informe o nmero de dias em atraso,
considerando a data atual para pagamento, e tambm o novo valor a pagar, considerando
0,5% de juros por dia de atraso.
5. Para evitar erros de digitao de sequncias de nmeros de importncia fundamental,
como a matrcula de um aluno, o CPF, o nmero de conta bancria, etc., geralmente se
adiciona ao nmero um dgito verificador. Por exemplo, o nmero de matrcula 811057
usado como 8110573, onde 3 o dgito verificador, calculado da seguinte maneira:
a. Cada algarismo do nmero multiplicado por um peso comeando de 2 e crescendo
de 1, da direita para a esquerda: 8 x 7 , 1 x 6 , 1 x 5 , 0 x 4 , 5 x 3 , 7 x 2
b. Somam-se as parcelas obtidas: 56 + 6 + 5 + 0 + 15 + 14 = 96
c. Calcula-se o resto da diviso desta soma por 11: 96 / 11 d resto 8 (96 = 8 x 11 + 8)
d. Subtrai-se de 11 o resto obtido: 11 8 = 3
e. Se o valor encontrado for 10 ou 11, o dgito verificador ser 0; nos outros casos, o
dgito verificador o prprio valor encontrado.
Faa uma classe executvel que leia uma string representando o nmero seguido de seu
respectivo dgito verificador e informe se o nmero est correto.

Java Fundamentos
60

7
Classes e Objetos
Exerccio de nivelamento 8 Classes e Objetos
Voc poderia fazer uma breve descrio sobre o que voc entende por objetos do mundo
real? Cite alguns objetos que voc consegue identificar dentro da sala de treinamento.

O paradigma de programao predominante inverte o pensamento de programao:


primeiro a abstrao de objetos do mundo real, depois as funcionalidades que eles
disponibilizaro.

Programao Orientada a Objetos


A POO o paradigma de programao predominante nos dias atuais, vindo substituir os
paradigmas estruturados. Java totalmente orientada a objetos. Ela surgiu da ideia de
distribuio de funcionalidades e de certas propriedades que so comuns em unidades do
mesmo tipo.
Um programa feito de objetos com certas propriedades e operaes que os objetos podem
executar. O estado atual, ou seu interior pode variar, mas deve-se tomar cuidado para que os
objetos no interajam de forma no documentada. Na POO voc s se preocupa com o que o
objeto expe.
A POO inverte a maneira de pensar dos antigos programadores, que sempre pensavam
primeiro nos algoritmos e depois nas estruturas de dados. Agora, as estruturas so mais
importantes e depois sua manipulao.
A chave da produtividade em POO tornar cada objeto responsvel pela realizao de um
conjunto de tarefas relacionadas. Se um objeto depender de uma tarefa que no seja de sua
responsabilidade, mas sim de outro, deve ento pedir para o outro objeto, cujas
responsabilidades incluam essa tarefa, realiz-la. Isso feito por uma verso mais

Java Fundamentos
61

generalizada da chamada de funes usada na programao estruturada: a chamada de


mtodos.

Figura 7.1 Conceito de produtividade.


Em particular, um objeto nunca deveria manipular diretamente dados internos de outro
objeto. Isso chamado de Encapsulamento (tambm diz respeito ao ocultamento da
implementao de alguma tarefa, sendo essa somente visvel atravs da sua interface, o
mtodo que a dispara). Toda comunicao deve ser atravs de mensagens, ou seja, chamada
de mtodos. Com isso, obtm-se um alto grau de reusabilidade e pouca dependncia entre os
objetos.

Figura 7.2 Conceito de reusabilidade.

Java Fundamentos
62

Classe
Utilizada para definir novos tipos de dados.
uma abstrao de um conjunto de objetos do mundo real.
Possui um conjunto de atributos (caractersticas) e mtodos (funcionalidades).
Libera o usurio da necessidade de como a classe foi implementada.
Basta conhecimento dos mtodos disponveis para acess-la (funcionalidades).
Sua utilizao atravs da instncia de objetos.
Objetos sero manipulados pelos processos da aplicao a ser desenvolvida
(interface).

Figura 7.3 Representao de uma classe em Orientao a Objetivos.


Uma classe um conjunto de variveis e funes relacionadas a essas variveis. Uma
vantagem da utilizao de programao orientada a objetos poder usufruir o recurso de
encapsulamento de informao. Com o encapsulamento o usurio de uma classe no precisa
saber como ela implementada, bastando para a utilizao conhecer a interface, ou seja, os
mtodos disponveis. Uma classe um tipo, e, portanto no pode ser atribuda a uma
varivel. Para definir uma classe, deve-se utilizar a seguinte sintaxe:
<modificador_acesso> class Nome_da_classe {
<atributos>;
<mtodos>;
}
Onde <modificador_acesso> uma palavra reservada que indica se a classe visvel em
todos os sistemas ou no. Podendo ser pblica ou privada.

Java Fundamentos
63

Quando se cria um objeto a partir de uma classe, diz-se que foi criada uma instncia da
classe. Exemplo:
CursoJava curso = new CursoJava();
Como visto, tudo em Java est dentro de classes. Ento, existem disponveis vrias classes em
Java para realizar diversas tarefas, como por exemplo, formatao de nmeros para o
usurio. Mas mesmo assim, quando se est desenvolvendo um sistema, o programador deve
desenvolver suas prprias classes, particulares, para realizar as tarefas prprias da aplicao
que est desenvolvendo.
Outro recurso da POO poder criar classes atravs de outras. Isso chamado Herana, e em
Java diz-se que uma classe estende a outra, quando ela herda seus dados e mtodos. Todas as
classes em Java estendem a classe bsica Object. Inicialmente a classe nova contm todos
os mtodos e atributos da classe bsica, e pode-se escolher por manter ou modificar esses
objetos, e adicionar outros novos.

Relaes entre Classes


As relaes mais comuns entre classes so:
Uso: mais genrica e mais bvia, por exemplo, uma classe Pedido usa (precisa
consultar) uma classe Conta, para consulta de crdito;
Incluso (tem-um): por exemplo, usando os pedidos, um objeto Pedido contm Itens;
Herana (-um): denota especializao, por exemplo, uma classe Ranger ser herdeira
da classe Automovel. A classe Ranger tem os mesmos mtodos que a classe
Automovel (porque um automvel), e outros especializados para o caso da Ranger,
que ele representa.

Objetos
Como foi dito anteriormente, classes so tipos, e no podem ser atribudas a variveis.
Variveis do tipo de uma classe so chamadas de objetos, e devem ser criadas utilizando o
operador new, seguindo o exemplo abaixo:
variavel = new nome_da_classe;
Por exemplo:
CursoJava curso = new CursoJava();
Onde curso uma varivel, uma instncia, um objeto da classe CursoJava.
Para se trabalhar em POO, deve-se saber identificar trs caractersticas-chave dos objetos:
Qual o comportamento do objeto?
Informaes de como ele num determinado momento.
Qual o estado do objeto?

Java Fundamentos
64

Cada objeto nico, representa uma informao do mundo real num determinado
momento.
Qual a identidade do objeto?
Revelada pelas mensagens que ele aceita.

Todos os objetos, que so instncias da mesma classe, tm uma semelhana no seu


comportamento que revelado pelas mensagens que ele aceita.
Em seguida, cada objeto guarda informaes sobre o que ele no momento e como chegou a
isso. Isso o que geralmente se chama de estado do objeto. O estado de um objeto pode
mudar com o tempo, mas no espontaneamente. Uma mudana de estado num objeto s
pode ser resultado de envio de mensagens, caso contrrio, o encapsulamento estaria sendo
violado.
Contudo somente o estado do objeto no descreve completamente o objeto, pois cada objeto
tem uma identidade distinta. Por exemplo, num sistema de processamento de encomendas,
duas encomendas so distintas, mesmo se pedirem a mesma coisa.
Em um programa tradicional, orientado a procedimentos, comea-se o processo de cima,
com a funo main. Ao projetar um sistema POO, no existe topo ou incio, e os novatos em
POO frequentemente ficam perguntando onde comear. A resposta : primeiro se encontram
ou determinam as classes e depois se acrescentam mtodos a cada classe.

Objetos como Argumentos


Pode-se passar como argumento de mtodos (funes) objetos de uma determinada classe.
Por exemplo:
Na classe Estacionamento:
static void estacionar(Carro c) {
...
}
Em algum outro ponto do programa:
Carro carro = new Carro();
estacionamento.estacionar(carro);
Nesse caso, o objeto carro da classe carro est sendo passado como parmetro para o
mtodo estacionar do objeto estacionamento.

Autoreferncia a um objeto
Em certas ocasies necessrio que se faa uma referncia ao objeto no qual o mtodo est
sendo executado, como um todo, para isso existe o this. Por exemplo:
System.out.println(this);
Java Fundamentos
65

Atributos
Tem um nome, um tipo e um contedo.
Mesmas regras de formao de nome de varivel.
Tipo pode ser primitivo ou uma classe.

Figura 7.4 Definio de atributos.


Atributos, ou propriedades, so os dados que fazem parte da classe. Para se manter o
encapsulamento, os atributos no devem ser visveis (mas podem), e quando se quer
permitir a visualizao ou alterao de um deles por outra parte do cdigo, recomendvel
que se use mtodos de acesso e modificao. Mesmo assim, deve-se tomar cuidado para no
escrever um mtodo que retorna um objeto, que atributo de outro. Pois assim se permitiria
a manipulao direta dos dados dentro de um objeto, por outro.
Essa visibilidade dos atributos dada por modificadores de acesso, como em classes:
private: s visvel dentro da prpria classe;
public: visvel em todo o sistema;
protected: s visvel na prpria classe, nas classes que estendem dela e nas classes
no mesmo pacote.
Por exemplo:
public class Evento {
private int Id;
private ItemEvento Item;
public int getId() {
return Id;
}
// implementao errada
public ItemEvento getItem() {
return Item;
}
}
Acima, o mtodo getItem foi implementado para prover a funcionalidade de alterao da
data do item dentro do evento. No recomendado porque d acesso a um dado
diretamente, que est dentro da classe. Ao invs disso, prefere-se a seguinte implementao:
Java Fundamentos
66

public class Evento {


private int Id;
private ItemEvento Item;
public int getId() {
return Id;
}
public void alterarDataItem(Date d) {
...
}
}
Como visto, atributos podem ser de qualquer tipo no Java, inclusive outras classes.

Mtodos
Mtodos so as aes que um objeto prov como interface para o sistema. E no s isso, mas
tambm aes internas, no visveis para outros objetos. Basicamente so funes, com
argumentos, retorno e visibilidade. A visibilidade pode ser public, private ou
protected.

Figura 7.5 Aes que um objeto prov como interface para um sistema.
Um detalhe importante que sempre, os atributos de uma classe, podem ser manipulados
atravs de um mtodo dela, obviamente, sejam privados ou pblicos.
Os mtodos pblicos definem a interface da classe, as aes que ela pode executar. Os
mtodos privados fazem operaes internas, que no devem estar disponveis para os outros
objetos. Por exemplo:
public class Evento {
private int Id;
private ItemEvento Item;
public int getId() {
return Id;
}
private boolean dataValidaItem(Date d) {
Java Fundamentos
67

...
}
public void alterarDataItem(Date d) {
if (dataValidaItem(d))
...
}
}
O mtodo privado dataValidaItem serve como validao interna e quando a classe foi
projetada no se tinha a inteno de torn-lo visvel para os outros objetos, portanto, foi
implementado como private.

Getters e Setters
Modificadores (setters): alteram o estado do objeto.
Seletores (getters): leem o estado de um objeto.
Como j vimos, o ideal que sejam implementados mtodos para disponibilizar acesso aos
valores de atributos dos objetos instanciados na aplicao em desenvolvimento. Uma pratica
bastante comum adotada a criao de mtodos de acesso, que possuem o prefixo get, e os
mtodos modificadores, que possuem o prefixo set. Estes mtodos nos possibilitam a
manuteno de acesso aos atributos privados, encapsulando-os e dando ao programador a
flexibilidade de acessar ou alterar valores de acordo com a necessidade da aplicao em
desenvolvimento.
Por exemplo, podemos definir o mtodos de acesso getNome() e o mtodo modificador
setNome(String n) para a classe Pessoa. Estes mtodos sero utilizados pelo programador
sempre que este necessitar consultar ou atualizar o valor do atributo nome de um objetivo
instanciado da classe Pessoa.

Figura 7.6 Getters e Setters.

Sobrecarga
Em Java pode-se ter vrios mtodos com o mesmo nome. Isso chamado sobrecarga.

Java Fundamentos
68

Mas cada um dos mtodos tem uma assinatura, que o que os difere uns dos outros, junto
com seu nome. Sua assinatura os parmetros que ele espera receber. Por exemplo:
public class Evento {
private int Id;
private ItemEvento Item;
public int getId() {
return Id;
}
public void alterarDataItem(Date d) {
...
}
public void alterarDataItem(int dia, int mes, int ano) {
...
}
}
No exemplo acima, para alterar a data do item do evento ou pode-se chamar
alterarDataItem passando como parmetro um objeto de data ou o dia, ms e ano,
separadamente, da data.

Construtores
Mtodos especiais so utilizados para inicializao de objetos recm instanciados.
Devem possuir o mesmo nome da classe, sendo executados sempre que o operador
new( ) acionado na aplicao (interface).
Podem existir mais de um mtodo construtor por classe:
As assinaturas dos mtodos os diferenciam.
Ser executado o construtor que possuir os argumentos na mesma ordem da
assinatura do mtodo.
Construtores so mtodos especiais que servem para fazer a inicializao de um objeto
recm instanciado. Esses mtodos so chamados toda vez que um objeto novo construdo,
isto , atravs do operador new. Seu nome o mesmo que o nome da classe. Por exemplo:
class Cliente {
public Cliente (String n) {
nome = n;
}
...
}
Onde public Cliente um construtor da classe Cliente.
Cliente c = new Cliente(Microsoft);

Java Fundamentos
69

Essa linha criar um objeto da classe Cliente e inicialmente chamar o construtor que
recebe um a String como parmetro.
Existe sempre um construtor padro que no recebe parmetro nenhum. Deve-se lembrar
que os construtores tambm permitem sobrecarga.

Blocos de Inicializao
So trechos arbitrrios de cdigos para fazer a inicializao de um objeto recm instanciado.
Esses mtodos so chamados toda vez que um objeto novo construdo. Por exemplo:
class Cliente {
public Cliente (String n) {
nome = n;
}
{
// bloco de inicializao
numConta = Conta.getNovoNumero();
}
...
}
Esse mecanismo no comum e no necessrio. Geralmente no mais claro do que
colocar a inicializao dentro de um construtor. Entretanto, para a inicializao de variveis
estticas, um bloco esttico pode ser til, como ser visto mais adiante.

Mtodos e Atributos static


O modificador static usado para criar constantes de classe, como vistas anteriormente,
mas tambm usado para criar atributos e mtodos estticos.
Os atributos estticos no mudam de uma instncia para outra, de modo que podem ser
vistos como se pertencessem classe. Da mesma forma, os mtodos estticos pertencem
classe e no operam nenhum dado de instncia, objeto. Isso significa que se pode us-los sem
criar nenhuma instncia.
Por exemplo, todos os mtodos da classe Console so mtodos estticos, assim como todos
os mtodos da classe Math, embutida na linguagem Java. Exemplo:
double x = Console.readDouble();
double x = Math.pow(3, 0.1);
E a utilizao de campos estticos:
Math.PI
System.out
Pode-se ter campos e mtodos tanto esttico quanto no estticos na mesma classe. As
chamadas gerais para mtodos e atributos estticos so:
NomeClasse.metodoEstatico(parametros);
NomeClasse.NomeCampoEstatico;
Java Fundamentos
70

Um campo esttico inicializado ou fornecendo-se um valor inicial a ele ou usando um bloco


de inicializao esttico:
public static final double CM_PER_INCH = 2.54;
ou
static double[] buffer = new double[]BUFFER_SIZE];
static {
int i;
for (i=0; i<buffer.length; i++)
buffer[i] = java.lang.Math.random();
}
A inicializao esttica ocorre quando a classe inicialmente carregada. Primeiro todas as
variveis estticas so inicializadas na ordem que aparecem na declarao da classe.
Um outro exemplo:
public static void main(String[] args)
Como main esttica, no necessrio criar uma instncia da classe a fim de cham-la. Por
exemplo, se essa funo main estivesse dentro da classe Hipotecar, para iniciar o
interpretador Java usa-se:
java Hipotecar
Ento o interpretador simplesmente inicia o mtodo main sem criar a classe Hipotecar.
Por isso, a funo mais s pode acessar dados estticos da classe. Na verdade, no raro que
a funo main crie um objeto de sua prpria classe:
public class Application {
public static void main(String[] args) {
Application a = new Application();
...
}
}

Exerccios de Fixao 9 Classes e Objetos


Liste os recursos utilizados para implementar orientao a objetos na linguagem de
programao Java.

Descreva a importncia da identificao de atributos e mtodos para a POO.

Java Fundamentos
71

Atividade 1 Classes e Objetos


1. Defina a classe Empregado, contendo os atributos nome e salrio. Crie os mtodos
construtor, seletor e modificador (para cada atributo). Desenvolva as operaes para:
a. Calcular e retornar o valor de imposto de renda a ser pago, sabendo que o imposto
equivale a 5% do salrio;
b. Faa um programa que crie um objeto da classe Empregado (leia o nome e o salrio) e
informe o nome do funcionrio juntamente com o imposto de renda a ser pago.
2. Defina uma classe Cliente, contendo os atributos: nome e total de despesas que a mesma
teve num restaurante. Crie os mtodos construtor, seletor e modificador (para cada
atributo). Desenvolva as operaes para:
a. Calcular e retornar o valor total a ser pago com gorjeta, considerando a taxa de 10%;
b. Faa um programa que crie um objeto da classe Cliente (leia o nome e o total de
despesas) e informe o nome do cliente e o valor a ser pago com gorjeta.
3. Implemente a classe Tringulo representada abaixo. Crie um programa que leia os 3 lados
do tringulo e diga se ele equiltero, issceles ou escaleno, utilizando a interface pblica do
objeto.
Tringulo

int lado1
int lado2
int lado3
<getters...>, <setters...>
Triangulo (int l1, int l2, int l3)

// Propriedade: cada lado de um tringulo menor do que a soma dos outros dois lados
boolean ehEscaleno()

// tem o comprimento de seus trs lados diferentes.

boolean ehEquilatero() // tem o comprimento dos trs lados iguais.


boolean ehIsosceles()

Java Fundamentos
72

// tem o comprimento de dois lados iguais.

Atividade 2 Classes e Objetos (Complementar)


1. Defina uma classe Funcionrio, contendo os atributos: nome, salrio-base e nvel do cargo
(I, II ou III). Crie os mtodos construtor, seletor e modificador (para cada atributo).
Desenvolva as operaes para:
a. Calcular o adicional por nvel de cargo: no h para nvel I, 10% para nvel II e 15%
para nvel III;
b. Calcular o desconto de Imposto de Renda sobre o salrio-bruto: no h para salriobruto at 1.499,99, 7,5% para salrio-bruto at 1.999,99, 15% para salrio-bruto at
2.999,99 e de 20% para salrio-bruto acima de 3.000,00;
c. Calcular o desconto de Previdncia Social: 5% para salrio-bruto at 999,99, 9% para
salrio-bruto at 1.799,99 e de 11% para salrio-bruto at 3.500,00. A partir de 3.500,00
descontado o teto, ou seja, 11% sobre 3.500,00 (que 385,00).
d. Mostrar o contracheque: exibe o nome do funcionrio, seu salrio-base, adicional,
IRRF, INSS e o salrio-lquido.
e. Faa um programa que crie um objeto da classe Funcionrio (leia o nome, o salriobase e o nvel do cargo) e mostre seu contracheque.
2. Defina uma classe Produto, contendo os atributos: cdigo, descrio, quantidade
disponvel e quantidade mnima (os atributos de quantidade no podem ser negativos) e
tambm o preo de venda. Crie os mtodos construtor, seletor e modificador (conforme
necessrio). Desenvolva as operaes para:
a. reporEstoque(quantidade): dada uma quantidade comprada, aumentar a quantidade
disponvel do produto.
b. alterarPreco(taxa): dada uma taxa, atualizar o preo de venda do produto.
c. darBaixa(quantidade): dada uma quantidade vendida, diminuir a quantidade
disponvel do produto.
d. precisaRepor: informa verdadeiro caso a quantidade disponvel seja menor ou igual a
quantidade mnima.
Faa um programa que crie um objeto da classe Produto (leia o cdigo, a descrio e a
quantidade mnima desejada) e mostre o menu:
1 Registro da Compra (reporEstoque).
2 Alterar Preo de Venda (alterarPreco)
3 Registro da Venda (dada a quantidade desejada do produto, verificar se h estoque. Se
sim, dar baixa e informar o valor total da venda; se no, informar estoque insuficiente).
4 Verificar Reposio (precisaRepor)
5 Fim
Java Fundamentos
73

Exerccios de Fixao Classes e Objetos


A proteo de atributos e mtodos das classes, fazendo com que se comuniquem com o meio
externo atravs da visibilidade permitida, define o conceito de:
a. Especializao;
b. Polimorfismo;
c. Encapsulamento;
d. Herana;
e. Agregao.

Pacotes
Utilizados para o agrupamento de classes.
Bibliotecas padro Java: java.util, java.net.
Podem ser organizados em estruturas hierrquicas: subdiretrios.
A linguagem Java permite agrupar classes em uma coleo chamada pacote. Os pacotes so
convenientes para organizar seu trabalho e para separ-lo das bibliotecas de cdigo
fornecidas por outros programadores.
A biblioteca Java padro distribuda em vrios pacotes, incluindo java.lang, java.util,
java.net etc. Os pacotes Java padro so exemplos de pacotes hierrquicos. Assim como voc
tem subdiretrios aninhados em seu disco rgido, tambm pode organizar pacotes usando
nveis de aninhamento. Todos os pacotes Java padro esto dentro das hierarquias de pacote
java e javax.
O principal motivo para se usar pacotes a garantia da exclusividade dos nomes de classe.
Suponha que dois programadores tenham a brilhante ideia de fornecer uma classe
Empregado. Desde que ambos coloquem suas classes em pacotes diferentes, no haver
conflito. Na verdade, para garantir absolutamente um nome de pacote exclusivo, a Sun
recomenda que voc use o nome de domnio na Internet de sua empresa (que se sabe que
exclusivo), escrito ao inverso. Ento, voc usa subpacotes para diferentes projetos. Por
exemplo, cursojava.com um exemplo de domnio na internet. Escrito na ordem inversa, ele
se transforma no pacote com.cursojava. Esse pacote pode ento ser ainda subdividido em
subpacotes, como com.cursojava.exemplo.pacotes.
O nico objetivo do aninhamento de pacotes para gerenciar nomes exclusivos. Do ponto de
vista do compilador, no existe absolutamente nenhum relacionamento entre pacotes
aninhados. Por exemplo, os pacotes java.util e java.util.jar no tm nenhuma relao entre si.
Cada um deles tem sua prpria coleo de classes independente.

Java Fundamentos
74

Usando pacotes
Classes que pertencem ao pacote devero ter no incio do arquivo referncia ao mesmo:
package <nome_do_pacote>
Para utiliz-las:
Referncia ao pacote (<nome_do_pacote>.*)
Referncia direta a classe (<nome_do_pacote>.<nome_da_classe).
Uma classe pode usar todas as classes de seu prprio pacote e todas as classes pblicas de
outros pacotes.
Voc pode acessar as classes pblicas de outro pacote, de duas maneiras. A primeira
simplesmente adicionar o nome do pacote completo na frente de todo nome de classe. Por
exemplo:
java.util.Date today = new java.util.Date();
Obviamente, isso maante. A estratgia mais simples e comum usar a palavra-chave
import. O objetivo da instruo import simplesmente fornecer um atalho para voc fazer
referncia s classes do pacote. Quando voc usa import, no precisa mais fornecer s classes
seus nomes completos.
Voc pode importar uma classe especfica ou o pacote inteiro. Voc coloca instrues import
no incio de seus arquivos-fonte (mas abaixo de todas as instrues package). Por exemplo,
voc pode importar todas as classes do pacote java.util com a instruo:
import java.util.*;
Ento, voc pode usar
Date today = new Date();
Sem um prefixo de pacote. Voc tambm pode importar uma classe especfica dentro de um
pacote.
import java.util.Date;
Importar todas as classes de um pacote mais simples. Isso no tem nenhum efeito negativo
sobre o tamanho do cdigo; portanto, geralmente no h razo para no usar.
Entretanto, note que voc pode usar apenas a notao * para importar um pacote. Voc no
pode usar import java.* ou import java.*.* para importar todos os pacotes com o prefixo java.
Ateno: Voc s pode importar classes e no objetos. Por exemplo, voc nunca importaria
System.out.
Na maioria das vezes, voc importa apenas os pacotes que precisa, sem se preocupar muito
com eles. A nica vez em que voc precisa prestar ateno nos pacotes quando tem um
conflito de nome. Por exemplo, os pacotes java.util e java.sql tm uma classe Date. Suponha
que voc escreva um programa que importa os dois pacotes.

Java Fundamentos
75

import java.util.*;
import java.sql.*;
Se agora voc usar a classe Date, ento receber um erro de tempo de compilao:
Date today; // ERRO--java.util.Date ou java.sql.Date?
O compilador no consegue descobrir qual classe Date voc deseja. Voc pode resolver esse
problema adicionando uma instruo import especfica:
import java.util.*;
import java.sql.*;
import java.util.Date;
E se voc realmente precisar das duas classes Date? Ento, precisar usar o nome completo
do pacote, com cada nome de classe.
java.util.Date deadline = new java.util.Date();
java.sql.Date today = new java.sql.Date();
Localizar classes em pacotes uma atividade do compilador. Os cdigos de byte nos arquivos
de classe sempre usam nomes de pacote completos para fazer referncia a outras classes.
Em Java, voc pode evitar completamente o mecanismo import, nomeando todos os pacotes
explicitamente, como em java.util.Date.
A nica vantagem da instruo import a convenincia. Voc pode se referir a uma classe
por um nome mais curto do que o nome de pacote completo. Por exemplo, aps uma
instruo import java.util.* (ou import java.util.Date), voc pode se referir classe
java.util.Date simplesmente como Date.

Adicionando uma classe em um pacote


Para colocar classes dentro de um pacote, voc deve colocar o nome do pacote no incio de
seu arquivo-fonte, antes do cdigo que define as classes no pacote. Por exemplo, o arquivo
Empregado.java comea como segue:
package com.cursojava.empresa;
public class Empregado
{
. . .
}
Se voc no colocar uma instruo package no arquivo-fonte, ento as classes desse arquivofonte pertencero ao pacote padro. O pacote padro no tem nome de pacote. At agora,
todas as nossas classes de exemplo estavam localizadas no pacote padro.
Voc coloca os arquivos de um pacote em um subdiretrio que corresponda ao nome do
pacote completo. Por exemplo, todos os arquivos de classe do pacote com.cursojava.empresa

Java Fundamentos
76

devem estar no subdiretrio com/cursojava/empresa (com\cursojava\empresa, no


Windows).
Portanto, o arquivo Empregado.java deve estar contido em um subdiretrio
com/cursojava/empresa. Em outras palavras, a estrutura de diretrio a seguinte:
. (diretrio corrente)
TesteEmpregado.java
com/
cursojava/
empresa/
Empregado.java
Para compilar esse programa, basta mudar para o diretrio que contm
TesteEmpregado.java e executar o comando:
javac TesteEmpregado.java
O compilador encontra automaticamente o arquivo
com/cursojava/empresa/Empregado.java e o compila.
Alerta: O compilador no verifica diretrios ao compilar arquivos-fonte. Por exemplo,
suponha que voc tenha um arquivo-fonte que comea com uma diretiva:
package com.mycompany;
Voc pode compilar o arquivo, mesmo que ele no esteja contido em um subdiretrio
com/mycompany. O arquivo-fonte ser compilado sem errors, mas a mquina virtual no
encontrar as classes resultantes, quando voc tentar executar o programa. Portanto, voc
deve usar a mesma hierarquia para arquivos-fonte e para arquivos de classe.
Pacotes so um recurso interessante em Java para o agrupamento de classes, com
funcionalidades relacionadas.
A biblioteca padro Java distribuda com inmeros pacotes incluindo java.lang,
java.util, java.net etc.

Herana
Construo de novas classes atravs da especializao de classes pr-existentes.
Mecanismo que possibilita a uma classe usar atributos e mtodos definidos em outra
classe.
Para qu? Evitar cpia de longos trechos de cdigo e realizao de pequenas
alteraes.
Reduo geral no tamanho do cdigo.
Construo de bibliotecas de classe com grande capacidade de reuso.
Java Fundamentos
77

Melhoria da qualidade dos programas, reduo do esforo de desenvolvimento e


manuteno de programas.
Herana basicamente a tcnica para derivar novas classes a partir das j existentes. Os
conceitos por trs da herana so de alterar e reutilizar mtodos de classes existentes, a fim
de adapt-los para uma nova situao.
Suponha a seguinte classe:
public class Empregado {
private String nome;
private double salario;
public Empregado(String n, double s) {
nome = n;
salario = s;
}
public void aumentaSalario(double s) {
salario = salario + s;
}
public double getSalario() {
reuturn (salario);
}
public void bonusSalario() {
aumentaSalario(salario * 0.04);
}
}
Essa a classe me, que diz respeito s regras de tratamento de todos os empregados. Agora
imagine que os gerentes, que tambm so empregados, tenham um tratamento especial.
Poderamos implementar assim:
public class Gerente extends Empregado {
private String departamento;
public Gerente(String n, double s) {
super(n, s);
departamento = ;
}
public void bonusSalario() {
super.aumentaSalario(super.getSalario());
}
public String getDepartamento() {
return departamento;
}
public void setDepartamento(String d) {
departamento = d;
}
}

Java Fundamentos
78

Claramente percebe-se que os gerentes tm uma informao a mais, o departamento e o


tratamento do aumento de salrios tambm diferente.
Na implementao, a palavra chave extends faz com que a classe que est sendo criada
derive da classe j existente cujo nome vai aps essa palavra. Essa classe existente chamada
superclasse ou classe base. A nova classe chamada de subclasse, classe derivada ou classe
filha.
No construtor da classe Gerente, usado o comando super, que se refere a uma
superclasse, no caso Empregado. De modo que:
super(n, s);
um modo sucinto de chamar o construtor da classe Empregado. Um detalhe importante
que todo construtor da subclasse tem que chamar o construtor da superclasse tambm. Caso
contrrio o construtor padro ser chamado. E se este no existir, um erro ser mostrado. O
compilador Java insiste que a chamada usando super seja a primeira no construtor da
subclasse.
Se for analisada a classe Gerente, percebe-se que o mtodo aumentaSalario no est
presente. Isso acontece porque, a menos que especificado, uma subclasse sempre usa os
mtodos da superclasse.
J no mtodo bonusSalario, o tratamento das informaes diferente para os gerentes.
Eles sempre tm bnus no valor do dobro do salrio atual. O que no acontece com os
funcionrios normais, que de 4%. Por isso, ele foi redefinido, e na sua implementao
foram feitas as alteraes devidas.
Note tambm que por ser privada, o atributo salario no visvel na classe derivada,
ento, para que se possa fazer as alteraes, deve-se chamar os mtodos da classe pai.

Hierarquia de Heranas
A herana no est limitada a um nvel somente. Pode-se, por exemplo, fazer com que uma
classe chamada Executivo derive da classe Gerente. Pode-se tambm fazer uma classe
Secretario e outra Programador derivarem de Empregado. Ficaramos com a seguinte
configurao:

Java Fundamentos
79

Figura 7.7 Hierarquia de Heranas.

Evitar Herana
Para evitar herana em alguma classe, deve-se usar o modificador final na sua declarao:
final class Executivo {
}
Faz com que no se possa definir nenhuma subclasse de Executivo. Se o modificador
final for usado em um mtodo da classe, este tambm no poder ser sobreposto nas
subclasses. Todos os mtodos de uma classe final so tambm final.

Atividade 3 Herana
1. Defina a classe Funcionrio, contendo os atributos nome, RG e total vendas em R$. Crie o
mtodo construtor padro e os mtodos seletores e modificadores para cada um de seus
atributos.
2. Defina a classe Vendedor, contendo o atributo valor comisso. Esta classe subclasse da
classe Funcionrio e dever implementar o mtodo construtor padro e os mtodos
seletores e modificadores para cada um de seus atributos. Implemente um mtodo que
calcule e retorno o valor da comisso do vendedor, sendo que o valor da comisso de 5%
sobre o valor total das vendas.
3. Defina a classe Gerente, contendo o atributo valor comisso. Esta classe subclasse da
classe Funcionrio e dever implementar o mtodo construtor padro e os mtodos
seletores e modificadores para cada um de seus atributos. Implemente um mtodo que
calcule e retorno o valor da comisso do gerente, sendo que o valor da comisso de 7,5%
sobre o valor total das vendas.
4. Desenvolva uma classe executvel que instancie um objeto da classe Vendedor e depois
calcule e escreva o valor da comisso a qual ele ter direito a receber.
Java Fundamentos
80

5. Desenvolva uma classe executvel que instancie um objeto da classe Gerente e depois
calcule e escreva o valor da comisso a qual ele ter direito a receber.

Polimorfismo
Mtodos com mesmo nome, porm assinaturas diferentes (os parmetros so diferentes
na quantidade e/ou tipo).
a capacidade de descobrir, na hierarquia de classes (herana), qual mtodo usar para
uma determinada chamada.
Mtodo invocado procurado em toda a hierarquia (atual e superior).
Todos os mtodos possuem a mesma assinatura, mas encontram-se em lugares
diferentes na hierarquia.
a capacidade do Java de descobrir, na hierarquia de herana, qual mtodo usar para uma
determinada chamada. Diferentemente da sobrecarga, todos esses mtodos possuem a
mesma assinatura, mas se encontram em lugares diferentes na hierarquia. Por exemplo, ao
se chamar a funo getSalario, na classe Gerente, o Java percebe que essa classe no
possui esse mtodo, ento procura nas superclasse para ver se o encontra. Se encontrado,
executa-o, seno um erro gerado.
Outro exemplo de polimorfismo o visto abaixo:
abstract public class Poligono {
abstract public void desenhar();
}
public class Retangulo extends Poligono{
public void desenhar() { .... }
}
public class Icosaedro extends Poligono{
public void desenhar() { .... }
}
Poligono[100] v;
// array heterogneo ...
v[15] = new Retangulo();
v[16] = new Icosaedro();
v[15].desenhar();
// Retangulo.desenhar()
No exemplo acima, a chamada do mtodo desenhar, faz com que seja chamado o mtodo da
classe Retangulo, apesar de ser um Poligono a estar armazenado ali.
Quando no se usa polimorfismo deve-se fazer:
Se funcionario = Gerente
Gerente.aumentarSalarioGerente();
Se funcionario = Programador
Java Fundamentos
81

Programador = aumentarSalarioProgramador();

Figura 7.8 Herana sem o emprego de polimorfismo.


Quando se usa polimorfismo, basta fazer:
Empregado.aumentarSalario();

Figura 7.9 Herana com o emprego de polimorfismo.

Atividade 4 Polimorfismo
1. Defina a classe Empregado, contendo os atributos nome e salrio. Crie o mtodo
construtor padro e os mtodos seletores e modificadores para cada um de seus atributos.
Implemente o mtodo aumentarSalario() que aplique e retorne 5% de aumento no salrio.
2. Defina a classe Programador. Esta classe subclasse da classe Empregado. Implemente o
mtodo aumentarSalario() que aplique e retorne 10% de aumento no salrio.
3. Defina a classe Gerente. Esta classe subclasse da classe Empregado. Implemente o
mtodo aumentarSalario() que aplique e retorne 15% de aumento no salrio.
4. Desenvolva uma classe executvel que instancie um objeto de cada uma das classes
implementada nos exerccios de 1 a 3 e depois o escreva o nome e o salrio que tero direito
a receber.
Java Fundamentos
82

Classes Abstratas
Uma classe abstrata no pode ser instanciada
Classe que permite instncia dita concreta.
Definio da classe abstrata com o uso do modificador abstract.
Ao subir na hierarquia de classes, estas vo se tornando mais genricas. Chega um ponto que
elas so to genricas que acabam se tornando somente um modelo de como devem ser
implementadas.
Suponha um sistema de gerenciamento de mensagens por voz, fax ou texto. Criamos ento as
classes VoxMessage, FaxMessage e TextMessage. Como o sistema ter que manter e
manipular uma mistura desses trs tipos de mensagens, ento cria-se um classes me
comum a todas as demais, chamada Message.
Mas quando se manda reproduzir uma mensagem, atravs da classe me Message, no se
sabe o que reproduzir, ou voz, ou fax ou texto. Ento se usa a palavra reservada abstract
para dizer que esse mtodo no pode ser definido nessa classe, mas sim em uma subclasse.
Um detalhe que se uma classe possui um ou mais mtodos abstratos, ento ela mesma tem
que ser abstrata:
public abstract class Message {
public abstract void play();
}

Mtodos Abstratos
Existem situaes em que necessrio que a implementao de mtodos seja realizada
nas subclasses, e no na superclasse.
Uso do modificador abstract junto ao mtodo.
O mtodo abstrato no possui bloco de cdigo (fora implementao na subclasse).
O mtodo abstrato no permite que a classe seja instanciada ( redundante definir
classe abstrata se contm mtodo abstrato).
Subclasses s podem ser instanciadas se implementarem todos os mtodos abstratos.
Alm dos mtodos abstratos, as classes abstratas podem ter mtodos e atributos concretos.
Por exemplo, a classe Message pode armazenar o remetente da mensagem postal e ter um
mtodo concreto que retorne o nome do remetente:
public abstract class Message {
private String sender;
public Message(String s) {
sender = s;
}
public abstract void play();
public String getSender() {
Java Fundamentos
83

return sender;
}
}
No possvel criar objetos a partir de classes abstratas. Ou seja, se uma classe declarada
abstrata, ento nenhum objeto dessa classe pode ser criado. Ser necessrio ampliar essa
classe a fim de criar uma instncia da classe. Observe que ainda assim podem-se criar
variveis objeto de uma classe abstrata, embora essas variveis tenham de fazer referncia a
um objeto de uma subclasse no abstrata. Por exemplo:
Message msg = new VoiceMessage(greeting.au);
Aqui msg uma varivel do tipo abstrato Message que faz referncia a uma instncia da
subclasse no abstrata VoiceMessage.

Ligao
Dependendo das caractersticas da linguagem e do tipo de polimorfismo suportado por ela, a
implementao do polimorfismo pode exigir facilidades proporcionadas pela ligao
dinmica. De um modo geral, uma ligao (binding) uma associao, possivelmente entre
um atributo e uma entidade ou entre uma operao e um smbolo. Uma ligao dita esttica
se ocorre em tempo de compilao ou de interligao (linking) e no mais modificada
durante toda a execuo do programa. A ligao dinmica feita em tempo de execuo ou
pode ser alterada no decorrer da execuo do programa.
Com a ligao dinmica, a ligao do operador a uma particular operao pode ser feita em
tempo de execuo, isto , o cdigo compilado para um tipo abstrato de dados pode ser
usado para diferentes tipos de dados, aumentando consideravelmente sua reusabilidade.
Entretanto, o uso de ligao dinmica compromete a eficincia de implementao.
Por default, Java faz ligao dinmica (late binding) dos mtodos das classes. Para que um
mtodo seja implementado com ligao esttica (early binding) deve-se torn-la final. Devese ter em mente que isso no mais permitir que um mtodo seja sobrescrito.

Classe Class
Descreve as classes e suas propriedades:
getClass().getName()
getClass().getPackage()
getClass().isInstance(Object obj)
A classe Class serve para fazer identificao de tipos em tempo de execuo. Essa
informao acompanha a classe qual o objeto pertence e usada pela linguagem para
selecionar os mtodos corretos a executar em tempo de execuo.
Essas informaes esto acessveis para o programador atravs do mtodo getClass da
classe Object, que retorna uma instncia de Class.
Empregado e;
Java Fundamentos
84

...
Class c1 = e.getClass();
Provavelmente o mtodo mais usado da classe Class o getName, que retorna o nome da
classe.
System.out.println(e.getClass().getName());
Pode-se obter um objeto Class tambm atravs de uma string contendo o nome da classe:
String className = Gerente;
Class c1 = Class.forName(className);
Outra maneira usar o atributo .class de um tipo qualquer em Java:
Class c1 = Gerente.class;
Class c2 = int.class;
Class c3 = Double[].class;
Pode-se tambm criar uma nova instncia de uma classe a qualquer momento:
e.getClass().newInstance();
Cria uma nova instncia da mesma classe que e, e chama o construtor padro, aquele sem
parmetros.
No exemplo abaixo, consegue-se criar uma instncia de uma classe tendo o seu nome numa
string:
String s = Gerente;
Object m = Class.forName(s).newInstance();
Caso se queira chamar outro construtor que no o padro, deve-se usar o mtodo
newInstance da classe Constructor, que ser visto na sesso sobre reflexo.

Reflexo
A classe Class fornece um conjunto de ferramentas muito rico e elaborado para escrever
programas que manipulam cdigo dinamicamente em Java. Isso importante quando se
deseja manipular recursos de classes, em tempo de execuo.
Um programa que consegue analisar recursos de classes dinamicamente chamado
reflexivo. O pacote que d essa funcionalidade o java.lang.reflect.
Pode-se usar reflexo para:
Analisar os recursos das classes em tempo de execuo;
Inspecionar objetos em tempo de execuo, por exemplo, escrever um nico mtodo
toString para todas as classes;
Implementar cdigo genrico para tratamento de arrays;

Java Fundamentos
85

Aproveitar os objetos Method que funcionam exatamente como ponteiros para funes
em C++.

Anlise de Recursos das Classes


As trs classes do pacote java.lang.reflect, Field, Method e Constructor
descrevem os campos de dados, as operaes e os construtores de uma classe,
respectivamente.
Com essas classes pode-se, por exemplo, descobrir os modificadores dos mtodos, retornar
nomes dos construtores etc.

Anlise de Objetos em Tempo de Execuo


Atravs do mtodo get da classe Field, consegue-se, por exemplo, retornar o valor de um
atributo em tempo de execuo:
Empregado paulo = new Empregado(Paulo Cayres, 1000);
Class c1 = paulo.getClass()
Field f = c1.getField(nome);
Object v = f.get(paulo);
// retorna em v a string Paulo Cayres
Mas como o campo nome no acessvel, um erro ocorrer. Para contornar isso, basta fazer
uma chamada a:
f.setAccessible(true);
antes de chamar o f.get(paulo).

Superclasse abstrata
Suponha o exemplo tpico de modelar classes de ordenamento genrico. Vamos inicialmente
implementar um algoritmo de ordenao, e uma classe abstrata Sortable, contento o
mtodo nico compareTo, que determina se um objeto ordenvel menor, igual ou maior
que o outro.
abstract class Sortable {
public abstract int compareTo(Sortable b);
}
class ArrayAlg {
public static void shellSort(Sortable[] a) {
int n = a.length;
int incr = n/2;
while (incr >= 1) {
for (int i=incr; i<n; i++) {
Sortable temp = a[i];
int j=i;
while (j>=incr && temp.compareTo(a[j-incr]) <0) {
a[j] = a[j incr];
Java Fundamentos
86

J -= incr;
}
a[j] = temp;
}
incr /= 2;
}
}
}
Essa rotina pode ser usada em qualquer classe que estende Sortable, sobrepondo o
mtodo compareTo. Isso porque cada classe ter sua maneira de comparar elementos, que
ser definida nela, e como a classe de ordenao usa Sortable, no final o mtodo compareTo
que ser usado o sobreposto.
Por exemplo:
class Empregado extends Sortable {
...
public int compareTo(Sortable b) {
Empregado eb = (Empregado) b;
if (salrio < eb.salrio) return 1;
if (salrio > eb.salrio) return 1;
return 0;
}
}
Perceba que na classe acima, o mtodo certo de comparao foi implementado.

Interfaces
Java estendeu o conceito de interfaces a um nvel ainda mais flexvel.
Ao modelar um sistema, o desenvolvedor pode pensar apenas nas interfaces de seus
objetos (ou seja, na funo de cada um deles, e no seu relacionamento com os outros),
criando assim uma camada extra de abstrao.
O uso de interfaces faz com que voc pense em objetos e no relacionamento entre eles,
construindo assim a planta do sistema de forma consistente e clara.
Na linguagem de programao Java, uma interface no uma classe, mas um conjunto de
requisitos para classes que queiram se adequar interface.
Normalmente, o fornecedor de algum servio diz: se sua classe obedecer a uma interface em
particular, ento executarei o servio. Vamos ver um exemplo concreto. O mtodo sort da
classe Arrays promete ordenar um array de objetos, mas sob uma condio: os objetos
devem pertencer s classes que implementam a interface Comparable.
Aqui est como a interface Comparable:

Java Fundamentos
87

public interface Comparable


{
int compareTo(Object other);
}
Isso significa que qualquer classe que implemente a interface Comparable obrigada a ter
um mtodo compareTo e o mtodo deve receber um parmetro Object e retornar um inteiro.
Todos os mtodos de uma interface so automaticamente public. Por isso, no necessrio
fornecer a palavra-chave public ao se declarar um mtodo em uma interface.
claro que existe um requisito adicional que a interface no pode explicar detalhadamente:
ao chamar x.compareTo(y), o mtodo compareTo deve realmente poder comparar dois
objetos e retornar uma indicao dizendo se x ou y maior. O mtodo deve retornar um
nmero negativo, se x for menor do que y; zero, se eles forem iguais; e, caso contrrio, um
nmero positivo.
Essa interface em particular tem um nico mtodo. Algumas interfaces tm mais de um
mtodo. Conforme voc ver posteriormente, as interfaces tambm podem definir
constantes. O que mais importante, entretanto, o que as interfaces no podem fornecer. As
interfaces nunca tm campos de instncia e os mtodos nunca so implementados na
interface. Fornecer campos de instncia e implementaes de mtodo a tarefa das classes
que implementam a interface. Voc pode considerar uma interface como sendo semelhante a
uma classe abstrata sem campos de instncia. Entretanto, existem algumas diferenas entre
esses dois conceitos.
Agora, suponha que queiramos usar o mtodo sort da classe Arrays para ordenar um array
de objetos Empregados. Ento, a classe Empregado deve implementar a interface
Comparable.
Para fazer uma classe implementar uma interface, voc precisa executar dois passos:
1. Voc declara que sua classe pretende implementar a interface dada.
2. Voc fornece definies para todos os mtodos na interface.
Para declarar que uma classe implementa uma interface, use a palavra-chave implements:
class Empregado implements Comparable
claro que, agora, a classe Empregado precisa fornecer o mtodo compareTo. Vamos supor
que queiramos comparar os funcionrios pelos seus salrios. Aqui est um mtodo
compareTo que retorna -1, caso o salrio do primeiro funcionrio for menor do que 0, 0 se
for igual e 1, caso contrrio.
public int compareTo(Object otherObject)
{
Empregado other = (Empregado)otherObject;
if (salary < other.salary) return -1;
if (salary > other.salary) return 1;

Java Fundamentos
88

return 0;
}
Na declarao da interface, o mtodo compareTo no foi declarado como public, porque
todos os mtodos em uma interface so automaticamente pblicos. Entretanto, ao
implementar a interface, voc deve declarar o mtodo como public. Caso contrrio, o
compilador vai supor que o mtodo tem visibilidade de pacote, o padro para uma classe.
Ento, o compilador reclama que voc est tentando fornecer um privilgio de acesso mais
fraco.

Dica: o mtodo compareTo da interface Comparable retorna um inteiro. Se os objetos no


forem iguais, no importa qual valor negativo ou positivo voc retorne. Essa flexibilidade
pode ser til ao se comparar campos inteiros. Suponha, por exemplo, que cada funcionrio
tenham uma id inteira exclusiva e que voc queira ordenar pelo nmero da ID do
funcionrio. Ento, voc pode simplesmente retornar id - other.id. Esse valor ser negativo,
se o primeiro nmero de ID for menor do que o outro, 0 se eles forem iguais e um valor
positivo, caso contrrio. Entretanto, existe um problema: o intervalo dos inteiros deve ser
suficientemente pequeno para que a subtrao no cause estouro. Se voc souber que as IDs
esto entre 0 e (Integer.MAX_VALUE - 1) / 2, pode ficar tranquilo.
claro que o truque da subtrao no funciona para nmeros de ponto flutuante. A diferena
salrio / outro.salrio pode ser arredondada para 0, se os salrios forem prximos, mas no
idnticos.
Existe um problema srio ao usar classes abstratas para expressar uma propriedade
genrica, que em Java, uma classe pode ter somente uma superclasse. Em vez de herana
mltipla, o Java introduz o conceito de interfaces.
Interface nada mais que uma promessa que uma classe vai implementar certos mtodos
com certas caractersticas. Usa-se inclusive a palavra-chave implements para indicar que a
classe vai manter essas promessas. A maneira como esses mtodos sero implementados
depende da classe, evidentemente.
A maneira de dizer que ser usada uma interface :
class Empregado extends Pessoa implements Comparable ...
Como Comparable uma interface:
public interface Comparable {
public int compareTo(Object b);
}
Ento a classe Empregado acima deve implementar o mtodo compareTo.
Deve-se perceber que somente mtodos (ocos, sem implementao) e constantes (atributos
final) podem ser definidos dentro de uma interface.

Java Fundamentos
89

Propriedades
Embora as interfaces no sejam instanciadas com new, pode-se ter uma varivel da interface:
Comparable x = new Empregado(...);
Empregado y = new Empregado();
if (x.compareTo(y) < 0)
Pode-se tambm usar instanceof para saber se uma classe implementa uma interface:
if (anObject instanceof Comparable) { ...}
Tambm possvel estender uma interface para criar outra, permitindo cadeias mltiplas de
interfaces:
public interface Moveable {
public void move(double x, double y);
}
public interface Powered extends Moveable {
public String PowerSource();
}
No se pode colocar campos de instncia numa interface, mas pode-se colocar constantes:
public interface Powered extends Moveable {
public String PowerSource();
public static final int SPEED_LIMIT = 95;
}
Classes podem implementar interfaces mltiplas:
class Tile extends Rectangle implements Cloneable, Comparable
Nota: Cloneable uma interface para implementar o mtodo clone(), que faz uma cpia
bit a bit dos objetos da classe.

Classes Internas
Definio de uma classe dentro da outra (nested class): membro da classe externa.
Razes para uso:
uma forma de agrupar logicamente classes que so utilizadas em um nico lugar.
Aumenta o grau de encapsulamento.
Classes internas so classes definidas dentro de classes. H quatro motivos para seu uso:
Um objeto de uma classe interna pode acessar a implementao do objeto que a criou
incluindo dados que seriam, de outra forma, privados;
As classes internas podem ser invisveis para outras classes do mesmo pacote;
As classes internas annimas so prticas quando se quer definir callbacks em tempo de
execuo;

Java Fundamentos
90

As classes internas so muito convenientes quando se quer escrever programas


orientados por eventos.
Aqui est um exemplo tpico: uma classe de lista encadeada define uma classe para conter os
links e uma classe para definir a posio de um iterador.
class LinkedList
{
public class Iterator // uma classe aninhada
{
public:
void insert(int x);
int erase();
. . .
};
. . .
private class Link // uma classe aninhada
{
public:
Link* next;
int data;
};
. . .
};
O aninhamento um relacionamento entre classes e no objetos. Um objeto LinkedList no
tem sub-objetos de tipo Iterator ou Link.
Existem duas vantagens: controle de nome e controle de acesso. Como o nome Iterator est
aninhado dentro da classe LinkedList, ele conhecido externamente como
LinkedList::Iterator e no pode entrar em conflito com outra classe chamada Iterator. Em
Java, essa vantagem no to importante, pois os pacotes fornecem o mesmo tipo de
controle de nome. Note que a classe Link est na parte privada da classe LinkedList. Ela fica
completamente oculta de todo outro cdigo. Por isso, seguro tornar seus campos de dados
pblicos. Eles podem ser acessados pelos mtodos da classe LinkedList (que tem a
necessidade legtima de acess-los) e no so visveis em outro lugar. Em Java, esse tipo de
controle no era possvel at que as classes internas fossem introduzidas.
Entretanto, as classes internas Java tm um recurso adicional que as torna mais ricas e teis
do que as classes aninhadas em C++. Um objeto proveniente de uma classe interna tem uma
referncia impltica para o objeto da classe externa que o instanciou. Atravs desse ponteiro,
ele tem acesso ao estado total do objeto externo.
Apenas as classes internas static no tm esse ponteiro adicional. Elas so as anlogas Java
exatas das classes aninhadas em C++.
Por exemplo:
Java Fundamentos
91

class UmaClasse {
...
private class InnerClass {
...
}
...
}
Pode-se criar classes internas dentro de mtodos, e tambm criar classes annimas. Classes
internas no so um conceito comum e Java as implementa como classes diferentes,
inserindo mtodos acessadores classe que contm a classe interna.
Qualquer classe declarada dentro do corpo de outra classe ou interface conhecido como
uma classe aninhada. Se a classe aninhada no tem um nome, ento ela considerada uma
classe annima. Se a classe aninhada tem um nome, ento no annima. Se a classe
aninhada tem um nome e no declarada dentro de um mtodo, construtor ou qualquer
bloco, ento ela uma classe membro. Se uma classe membro no for decladrada como
esttica, ento ela uma classe interna. Se uma classe no estiver aninhada, ento uma
classe de nvel superior.

Exerccio de Fixao 10 Classes e Objetos


Qual sua impresso sobre o uso de POO no desenvolvimento de aplicaes Java?

Para voc, os recursos de POO facilitam a organizao, proteo e acesso aos recursos de
uma aplicao Java em desenvolvimento?

Java Fundamentos
92

Atividade 5 Classes e Objetos


1. Um endocrinologista controla a sade de seus pacientes atravs do IMC (ndice de Massa
Corporal), calculado por peso (Kg)/altura2(m). Defina uma classe Pessoa, contendo os
atributos: nome, peso e altura. Crie os mtodos construtor, seletor e modificador (para cada
atributo). Desenvolva uma operao para:
a. Determinar e retornar a faixa de risco, considerando a seguinte tabela:

IMC

Faixa de risco

Abaixo de 20

Abaixo do peso

A partir de 20 at 25

Normal

Acima de 25 at 30

Excesso de peso

Acima de 30 at 35

Obesidade

Acima de 35

Obesidade mrbida

b. Desenvolva uma interface para instanciar um objeto da classe Pessoa, calcular e


escrever na tela a faixa de risco do mesmo do mesmo.
2. Defina uma classe abstrata Veculo, cujos objetos representam veculos, contendo as
seguintes informaes: nmero de cilindradas, preo e combustvel. Implemente
construtor(es), e um mtodo abstrato que possibilite a impresso de todos os atributos do
objeto instanciado.
a. Defina uma classe Moto, subclasse da classe Veculo, que contenha as seguintes
informaes adicionais: tipo de motor (2 ou 4 tempos, carburado, etc.) e tipo de freio
(ventilado, a disco etc.). Redefina o construtor de objetos da classe e de impresso de suas
informaes de maneira apropriada.
b. Defina uma classe Carro, subclasse da classe Veculo, que contenha as seguintes
informaes adicionais: nmero de passageiros e capacidade do porta-malas. Redefina o
construtor de objetos da classe e de impresso de suas informaes de maneira
apropriada.
c. Defina uma classe Caminho, subclasse da classe Veculo, que contenha as seguintes
informaes adicionais: peso do veculo e peso da carga. Redefina o construtor de objetos
da classe e de impresso de suas informaes de maneira apropriada.

Java Fundamentos
93

d. Desenvolva uma interface para instanciar um objeto de cada uma das classes
implementadas e que imprima uma frase composta por todos os valores de seus atributos
prprios e herdados. A classe de interface dever estar no pacote viso (viso).

Atividade 6 Classes e Objetos (Complementar)


1. Defina uma classe abstrata Conta, cujos objetos representam contas bancrias, contendo
as seguintes informaes: nmero da conta e saldo. Defina um construtor de objetos dessa
classe, que tenha como parmetros essas informaes, exceto saldo que ser igual a zero
inicialmente. Defina um mtodo para depsito que ir atualizar o valor do saldo da conta
atravs de um parmetro passado ao objeto instanciado na interface. Defina tambm os
mtodos abstratos para saque.
a. Defina uma classe ChequeEspecial, subclasse da classe Conta, que contenha o valor do
limite para o saldo da conta. Redefina o construtor da classe e o mtodo de saque, de
forma que possa utilizar o valor do limite, caso seja necessrio.
b. Desenvolva uma interface para instanciar um objeto da classe ChequeEspecial, faa e
imprima uma frase composta por todos os valores de seus atributos prprios e herdados.
A classe de interface dever estar no pacote viso (visao).
2. Defina uma classe Veculo com os atributos: nmero da placa, cor, ano de fabricao,
tanque (quantidade de combustvel em litros), quantidade de litros da reserva e consumo
mdio (Km/l). Implemente os mtodos:
Andar, dado o nmero de Km a percorrer. Atualize a quantidade de combustvel no
tanque, considerando o consumo mdio do veculo e, tambm, informar quando o
veculo entrar no consumo da reserva de combustvel e, caso o veculo no tenha mais
combustvel no tanque, informar que o veculo parou.
Abastecer, dado o nmero de litros de combustvel. Atualize a quantidade de
combustvel no tanque.
a. Defina duas subclasses, Caminho com o atributo capacidade de carga (em
toneladas) e nibus com o atributo capacidade de passageiros (nmero de lugares).
Objetos dessas classes mudam o comportamento de consumo mdio (reduzem em 10%)
quando sua capacidade de carga supera 50%. Implemente os mtodos de
alterarOcupao (de carga ou pessoas) para cada uma delas e faa o veculo andar
novamente.

Java Fundamentos
94

8
Collections
Exerccio de nivelamento 9 Collections
Pesquise na internet o conceito de framework e diga como voc acha que este pode auxiliar
no desenvolvimento de programas Java.

Definio
Collections, s vezes chamado de containner, simplesmente um objeto que agrupa vrios
elementos em uma nica estrutura. Collections so usados para armazenar, recuperar,
manipular e comunicar dados agregados. Normalmente, eles representam itens de dados que
formam um grupo natural, como uma mo de poker (uma coleo de cartas), uma pasta de
correio (uma coleo de cartas), ou uma lista telefnica (um mapeamento de nomes para
nmeros de telefone).

Interface Collection
a raiz da hierarquia Collection.
Representa um grupo de objetos conhecidos.
Contm o denominador comum do que todas as colees implementam.
Usada para passagem de colees.
Como parmetros e para manipulao genrica de grupos de dados
possui mtodos para acessar, buscar e remover elementos.
Implementaes so de suas subinterfaces.

O que o Java Collections Framework?


O Java Collecions Framework uma arquitetura unificada para representar e manipular
colees de dados. Todas as estruturas das colees conter o seguinte:
Interfaces: estes so os tipos de dados abstratos que representam colees. Interfaces
permitem colees para ser manipulado independentemente dos detalhes de sua
Java Fundamentos
95

representao. Em linguagens orientadas a objeto, interfaces geralmente formam uma


hierarquia.
Implementaes: estas so as implementaes concretas das interfaces de coleta. Em
essncia, so estruturas de dados reutilizveis.
Algoritmos: estes so os mtodos que executam clculos teis, como pesquisa e
classificao, em objetos que implementam interfaces de coleta. Os algoritmos seriam
polimrficos, isto , o mesmo mtodo pode ser usado em muitas aplicaes diferentes da
interface. Em essncia, os algoritmos so funcionalidades reutilizveis.
Alm do Java Collections Framework, os exemplos mais conhecidos de estruturas Collections
so o C + + Standard Template Library (STL) e hierarquia Collections do Smalltalk.
Historicamente, estruturas das colees tm sido bastante complexo, o que lhes deu uma
reputao de ter uma curva de aprendizagem difcil. O Java Collections Framework veio para
quebra esta tradio.

Benefcios do Java Collections Framework


O Java Collections Framework oferece os seguintes benefcios:
Reduo do esforo de programao: Ao fornecer estruturas teis de dados e algoritmos, a
estrutura Collections libera o programador para concentrar nas partes importantes de seu
programa. Ao facilitar a interoperabilidade entre APIs no relacionadas, o Java Collections
Framework libera-o de escrever objetos adaptadores ou cdigo de converso para conectar
APIs.
Aumenta a velocidade e a qualidade do programa: Este Collections Framework fornece
alto desempenho e alta qualidade de implementaes de estruturas teis de dados e
algoritmos. As vrias implementaes de cada interface so intercambiveis. Com isso,
programas pode ser facilmente ajustado trocando implementaes de coleta, livrando o
programador do trabalho de escrever suas prprias estruturas de dados, ficando com
mais tempo para se dedicar a melhorar a qualidade e desempenho dos programas.
Permite a interoperabilidade entre APIs no relacionadas: As interfaces de coleta so o
vernculo pelo qual passa colees APIs e para trs. Se a minha administrao de rede
API fornece uma coleo de nomes de n e se o seu kit de ferramentas GUI espera uma
coleo de ttulos de coluna, nossas APIs vo interoperar perfeitamente, mesmo que eles
foram escritos de forma independente.
Reduz o esforo de aprender e usar novas APIs: APIs naturalmente tomam colees na entrada
e as fornece como sada. No passado, cada API, tinha uma pequena sub-API dedicada a
manipular suas colees. Houve pouca consistncia entre essas colees ad hoc sub-APIs,
assim, voc teve que aprender cada um a partir do zero, e era fcil cometer erros quando
utiliz-las. Este problema no existe mais com o advento de interfaces padro de Collections.
Reduz o esforo de projetar novas APIs: Este o outro lado da vantagem anterior
descrita. Designers e implementadores no tem que reinventar a roda cada vez que criar
uma API que se baseia em colees. Em vez disso, eles podem usar interfaces padro de
Collections.
Java Fundamentos
96

Promove a reutilizao de software: Novas estruturas de dados que estejam em


conformidade com as interfaces padro de Collections so, por natureza reutilizvel. O
mesmo vale para novos algoritmos que operam em objetos que implementam essas
interfaces.
Com esses e outros objetivos em mente, a Sun criou um conjunto de classes e interfaces
conhecido como Collections Framework, que reside no pacote java.util. A API do
Collections robusta e possui diversas classes que representam estruturas de dados
avanadas. Por exemplo, no necessrio reinventar a roda e criar uma lista ligada, mas sim
utilizar aquela que a Sun disponibilizou.

Figura 8.1 API do Collections.

Listas
Acesso posicional:
Manipula elementos baseado na sua posio numrica na lista (ndice).
Pesquisa:
Pesquisa por um objeto especfico na lista e retorna a sua posio numrica.
Iterao:
Herda a semntica Iterator para tomar vantagem da natureza sequencial da lista.
Um primeiro recurso que a API de Collections traz so as listas. Uma lista uma coleo
que permite elementos duplicados e mantm uma ordenao especfica entre os elementos.
Em outras palavras, voc tem a garantia de que, quando percorrer a lista, os elementos sero
encontrados em uma ordem pr-determinada, definida na hora da insero dos mesmos. Ela
resolve todos os problemas que levantamos em relao ao array (busca, remoo, tamanho
"infinito",...). Esse cdigo j est pronto!
A API de Collections traz a interface java.util.List, que especifica o que uma classe
deve ser capaz de fazer para ser uma lista. H diversas implementaes disponveis, cada
uma com uma forma diferente de representar uma lista.

Java Fundamentos
97

A implementao mais utilizada da interface List a ArrayList, que trabalha com um


array interno para gerar uma lista. Portanto, ela mais rpida na pesquisa do que sua
concorrente, a LinkedList, que mais rpida na insero e remoo de itens nas pontas.
A interface List possui dois mtodos add, um que recebe o objeto a ser inserido e o coloca
no final da lista, e um segundo que permite adicionar o elemento em qualquer posio da
mesma. Note que, em momento algum, dizemos qual o tamanho da lista; podemos
acrescentar quantos elementos quisermos que a lista cresce conforme for necessrio.
Toda lista (na verdade, toda Collection) trabalha do modo mais genrico possvel. Isto ,
no h uma ArrayList especfica para Strings, outra para Nmeros, outra para Datas
etc. Todos os mtodos trabalham com Object.
List lista = new ArrayList();
lista.add("Manoel");
lista.add("Joaquim");
lista.add("Maria");
A interface List e algumas classes que a implementam podem ser vistas no diagrama a
seguir:

Figura 8.2 Interface List e classes que a implementam.

Conjuntos
Coleo que no tem elementos duplicados.
Podem ser mantidos ordenados (SortedSet) ou no.
Modela a abstrao matemtica para conjuntos.
Contm os mesmos mtodos de Colletion, com a restrio de que no podem ser
repetidos.

Java Fundamentos
98

Um conjunto (Set) funciona de forma anloga aos conjuntos da matemtica, ele uma
coleo que no permite elementos duplicados.
Outra caracterstica fundamental dele o fato de que a ordem em que os elementos so
armazenados pode no ser a ordem na qual eles foram inseridos no conjunto. A interface no
define como deve ser este comportamento. Tal ordem varia de implementao para
implementao.

Figura 8.3 Interface Set e classes que a implementam.


Um conjunto representado pela interface Set e tem como suas principais implementaes
as classes HashSet, LinkedHashSet e TreeSet.
public static void main(String[] args) {
Set<String> nomes = new HashSet<String>();
nomes.add("Joo");
nomes.add("Jos");
nomes.add("Maria");
nomes.add("Bianca");
System.out.println("Nmero de elementos: "+nomes.size());
if(nomes.contains("Maria")){
System.out.println("Contm Maria!!!");
}
for(String temp : nomes){
System.out.println(temp);
}

Java Fundamentos
99

Iterator<String> i = nomes.iterator();
while(i.hasNext())
System.out.println(i.next());
}
O uso de um Set pode parecer desvantajoso, j que ele no armazena a ordem, e no aceita
elementos repetidos. No h mtodos que trabalham com ndices, como o get(int) que as
listas possuem. A grande vantagem do Set que existem implementaes, como a HashSet,
que possui uma performance incomparvel com as Lists quando usado para pesquisa
(mtodo contains por exemplo).

Mapas
Um mapa armazena pares (chave, valor) chamados de itens.
Chaves e valores podem ser de qualquer tipo.
As chaves armazenadas nos mapas podem estar ordenadas ou no.
A chave utilizada para achar o elemento de forma rpida, utilizando estruturas especi
ais.
No existem chaves duplicadas em um mapa.
Tambm so conhecidos como dicionrios.
Muitas vezes queremos buscar rapidamente um objeto dado alguma informao sobre ele.
Um exemplo seria, dada a placa do carro, obter todos os dados do carro. Poderamos utilizar
uma lista para isso e percorrer todos os seus elementos, mas isso pode ser pssimo para a
performance, mesmo para listas no muito grandes. Aqui entra o mapa.
Um mapa composto por um conjunto de associaes entre um objeto chave a um objeto
valor. java.util.Map um mapa, pois possvel us-lo para mapear uma chave a um
valor, por exemplo: mapeie chave "empresa" o valor "Nome da Empresa", ou ento mapeie
chave "rua" ao valor "Endereo da Empresa". Semelhante a associaes de palavras que
podemos fazer em um dicionrio.
O mtodo put(Object, Object) da interface Map recebe a chave e o valor de uma nova
associao. Para saber o que est associado a um determinado objeto-chave, passa-se esse
objeto no mtodo get(Object). Sem dvida essas so as duas operaes principais e mais
frequentes realizadas sobre um mapa.
public static void main(String[] args) {
HashMap<String, String> nomes = new HashMap<String, String>();
nomes.put("joao", "Joo da Silva");
nomes.put("jose", "Jos Matos");
nomes.put("maria", "Maria das Dores");
nomes.put("bianca", "Bianca Patrcia");
System.out.println("Nmero de elementos: "+nomes.size());

Java Fundamentos
100

String temp = nomes.get("bianca");


System.out.println(temp);
}
Um mapa muito usado para "indexar" objetos de acordo com determinado critrio, para
podermos buscar esses objetos rapidamente. Um mapa costuma aparecer juntamente com
outras colees, para poder realizar essas buscas!
Ele, assim como as colees, trabalha diretamente com Objects (tanto na chave quanto no
valor), o que tornaria necessrio o casting no momento que recuperar elementos. Usando os
generics, como fizemos aqui, no precisamos mais do casting. Suas principais
implementaes so o HashMap, o TreeMap e o Hashtable.
Apesar do mapa fazer parte do framework, ele no estende a interface Collection, por ter
um comportamento bem diferente. Porm, as colees internas de um mapa so acessveis
por mtodos definidos na interface Map.

Figura 8.4 Interface Map e classes que a implementam.


O mtodo keySet() retorna um Set com as chaves daquele mapa e o mtodo values()
retorna a Collection com todos os valores que foram associados a alguma das chaves.

Exerccio de Fixao 11 Collections


Qual sua impresso sobre o uso de Collections no desenvolvimento de aplicaes Java?

Java Fundamentos
101

Para voc, os recursos de Collections facilitam a organizao e manipulao de conjuntos de


dados em aplicaes Java?

Atividade 1 Collections
1. Desenvolva uma aplicao Java que gere e armazene todos os nmeros inteiros entre 1 e
1000 randomicamente e depois ordene os nmeros gerados em ordem crescente e em
ordem decrescente, utilizando um ArrayList e implementando interfaces Compareble.
2. Crie uma classe Conta Bancria contendo os atributos nmero da conta, nome cliente e
saldo atual. Implemente construtores, getters e setters. Desenvolva aplicaes Java que
apresente as seguintes funcionalidades:
a. 1 Incluir (solicitao dos dados de uma conta bancria em um ArrayList);
b. 2 Listar (objetos armazenados no ArrayList) em ordem alfabtica;
c. 3 Listar (objetos armazenados no ArrayList) em ordem decrescente de saldo atual;
d. 4 Pesquisar e mostrar informaes de um determinado cliente atravs do nmero da
conta ou seu nome, utilizando colees (HashMap);

Atividade 2 Collections (Complementar)


1. Uma empresa decidiu fazer um levantamento de informaes em relao aos candidatos
que se apresentaram para o preenchimento de vagas no seu quadro de funcionrios. Para
resolver este problema, necessrio ter os seguintes dados sobre cada candidato: nmero de
inscrio, nome, cdigo da vaga, a idade (em anos), o sexo (Mmasculino ou Ffeminino) e a
experincia no servio (Ssim ou Nno). Escreva uma classe principal que leia os dados dos
candidatos e armazene em um ArrayList de Objetos da classe Candidato e informe:
a.

O total de candidatos do sexo feminino

b.

A mdia de idades entre candidatos que tem experincia.

c.

O cdigo da vaga mais concorrida (Interface Compareble).

d.

O percentual de candidatos sem experincia.

Java Fundamentos
102

Bibliografia
ASCNCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Vaneruchi de.
Fundamentos de Programao de Computadores: algortmos, pascal, e c/c++. So Paulo:
Prentice-Hall, 2002.
DEITEL. Java Como Programar. 6a. ed. So Paulo: Pearson Prentice Hall, 2005.
FARRER, Harry, [Et. Al.]. Algoritmos Estruturados: programao estruturada de
computadores. 3 d. Rio de Janeiro: LTC, 1999.
FORBELLONE, A. L. V.; EBERSPCHER, H. F. Lgica de Programao. So Paulo: Pearson
Education/ Makron Books, 1999.
GUIMARES, ngelo de Moura. Algoritmos e Estruturas de Dados. Rio de Janeiro: LTC,
1994.
HORSTMANN, Cay. CORNELL, Gary. Core Java 2 Fundamentals. The Sun Microsystems
Press Java Series. Vol. I. 2003.
JUNIOR, Peter Jandl. Java Guia do Programador. So Paulo: Novatec, 2007.
MANZANO, J. A. N. G. Algoritmos. So Paulo: rica, 1997.
ORACLE. The Java Tutorials. Disponvel em: http://docs.oracle.com/javase/tutorial/.
Acessado em: 29 jan. 2013.
SIERRA, Kathy; BATES, Bert. Certificao Sun Para Programador Java 6 Guia de Estudo.
So Paulo: Rio de Janeiro, 2008.
SALVETTI, D. D.; BARBOSA, L. M. Algoritmos. So Paulo: Makron Books, 2001.

Java Fundamentos
103

Vous aimerez peut-être aussi