Você está na página 1de 199

Java bsico 1

Paulo Henrique Cayres

Rio de Janeiro
Escola Superior de Redes
2013

Java bsico 1

Java bsico 1

Sumrio
Lgica de Programao ................................................................................................ 1
Conceito de Algoritmo ................................................................................. 2
Mtodo para a Construo de Algoritmos .................................................... 2
Instrues...................................................................................................... 4
Histrico da linguagem de programao Java ............................................................. 6
Caractersticas da Linguagem ...................................................................... 8
Similaridade com C, C++ ......................................................................... 8
Compilao ............................................................................................... 8
Portabilidade............................................................................................. 8
Orientao a Objetos ................................................................................ 9
Segurana ................................................................................................. 9
Concorrncia ............................................................................................ 9
Eficincia .................................................................................................. 9
Suporte para Programao de Sistemas Distribudos ............................. 10
Fundamentos de Programao em Java ..................................................................... 11
O que Java ............................................................................................... 11
Recursos da Linguagem Java ..................................................................... 12
Mquina Virtual Java ............................................................................. 12
Coleta de Lixo ........................................................................................ 13
Segurana de Cdigo .............................................................................. 13
Primeiro Programa ..................................................................................... 14
Alguns cuidados ao escrever e executar programas Java ........................... 16
Comentrios................................................................................................ 16
Variveis ..................................................................................................... 19
Tipos de Dados ........................................................................................... 19
Inteiros .................................................................................................... 20
Ponto Flutuante....................................................................................... 20
Tipo Caractere, char ............................................................................... 20
Tipo boolean ........................................................................................... 21
Atribuies e Inicializaes.................................................................... 21
Converses entre Tipos Numricos ........................................................ 22
Constantes .................................................................................................. 22
Operadores.................................................................................................. 23
Tipo String .................................................................................................. 25
Concatenao.......................................................................................... 25
Substrings ................................................................................................... 25
Tamanho ................................................................................................. 26
Teste de Igualdade .................................................................................. 26
Manipulando dados em Java ...................................................................... 26
Exerccios de Fixao 4 Variveis .......................................................... 27
Atividade 2 Variveis e manipulao de dados (Complementar) ........... 28
Controle de Fluxo ....................................................................................................... 29
Escopo de um Bloco de comandos ............................................................. 29
Estruturas de Deciso ................................................................................. 30
Comando if ............................................................................................. 30
Java bsico 1

Comando switch ..................................................................................... 31


Estruturas de Repetio .............................................................................. 33
Definio ................................................................................................ 33
Comando while....................................................................................... 33
Comando do ... while.............................................................................. 34
Comando for ........................................................................................... 34
Quebra de fluxo .......................................................................................... 35
Comando Break ...................................................................................... 35
Comando continue .................................................................................. 36
Comando return ...................................................................................... 36
Arrays ......................................................................................................................... 39
Exerccio de nivelamento 6 Arrays ......................................................... 39
Definio .................................................................................................... 39
Tamanho de uma array ............................................................................... 41
Cpia de Arrays .......................................................................................... 42
Arrays como Argumentos .......................................................................... 42
Arrays como Valores de Retorno ............................................................... 42
Arrays Multidimensionais .......................................................................... 42
Classes Especializadas ............................................................................................... 45
Wrappers de Objetos .................................................................................. 45
Date, DateFormat e Calendar ..................................................................... 46
Date 46
DateFormat ............................................................................................. 47
Calendar.................................................................................................. 48
NumberFormat ........................................................................................... 48
DecimalFormat ........................................................................................... 49
Padro de Caracteres Especiais .............................................................. 49
Math............................................................................................................ 50
Classes e Objetos........................................................................................................ 53
Programao Orientada a Objetos .............................................................. 53
Classes ........................................................................................................ 54
Relaes entre Classes............................................................................ 54
Objetos........................................................................................................ 55
Objetos como Argumentos ..................................................................... 55
Auto referncia a um objeto ................................................................... 56
Atributos ................................................................................................. 56
Mtodos .................................................................................................. 57
Getters e Setters...................................................................................... 57
Sobrecarga .............................................................................................. 58
Construtores............................................................................................ 58
Blocos de Inicializao ........................................................................... 59
Mtodos e Atributos static .......................................................................... 59
Pacotes ........................................................................................................ 63
Usando pacotes ....................................................................................... 63
Adicionando uma classe em um pacote ................................................. 65
Herana ....................................................................................................... 66
Hierarquia de Heranas .......................................................................... 67
ii

Java bsico 1

Evitar Herana ........................................................................................ 68


Atividade 3 - Herana................................................................................. 68
Polimorfismo .............................................................................................. 69
Classes Abstratas ........................................................................................ 70
Ligao ....................................................................................................... 71
Classe Class ................................................................................................ 72
Reflexo.................................................................................................. 73
Anlise de Recursos das Classes ............................................................ 73
Anlise de Objetos em Tempo de Execuo .............................................. 73
Superclasse abstrata ................................................................................ 73
Interfaces ................................................................................................ 74
Propriedades ........................................................................................... 76
Classes Internas .......................................................................................... 77
Collections.................................................................................................................. 83
Exerccio de nivelamento 9 Collections .................................................. 83
Definio .................................................................................................... 83
O que o Java Collections Framework? .................................................... 83
Benefcios do Java Collections Framework ............................................... 84
Listas .......................................................................................................... 85
Conjunto ..................................................................................................... 86
Mapas ......................................................................................................... 87
Exerccio de Fixao 11 Collections ....................................................... 89
Bibliografia ................................................................................................................ 91

Java bsico 1

iii

iv

Java bsico 1

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
computador consiga compreender e executar esse programa ele deve estar escrito em uma
Java bsico 1

linguagem entendida pelo computador e pelo desenvolvedor de software, o que chamamos de


linguagem de programao.
As etapas para o desenvolvimento de um programa so: Anlise, onde o enunciado do problema
ser estudado para a definio dos dados de entrada, do processamento e dos dados de sada;
Algoritmo, onde ferramentas do tipo descrio narrativa, fluxograma ou portugus estruturado
so utilizadas para descrever o problema com suas solues; e Codificao, onde o algoritmo
transformado em cdigos da linguagem de programao escolhida para se trabalhar (ASCENCIO,
2005).

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).
Algoritmo 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.
Produto final: algoritmo concludo e testado, pronto para ser traduzido em programa de
computador.

Java bsico 1

Figura 1.1 Passos lgicos para 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.
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:

Java bsico 1

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

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.

Java bsico 1

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

Java bsico 1

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 ps-graduao em um projeto
acadmico. Ele passou para a fama e a fortuna como um dos co-fundadores 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. 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.
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.
Java bsico 1

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.

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.

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

Java bsico 1

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 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
Java bsico 1

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.

10

Java bsico 1

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

11

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.

12

Java bsico 1

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

13

Figura 3.3 Segurana de cdigo em Java.

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.

14

Java bsico 1

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

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

Java bsico 1

15

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

Java bsico 1

/* 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 ".
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.");
}
}
Java bsico 1

17

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.

Figura 3.6 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?

18

Java bsico 1

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

19

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 3.40282347E+38F
(6-7 dgitos decimais significativos)

Double

64 bits 8 bytes

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

Tipo Caractere, char


Apstrofes, ou aspas simples, so usados 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.

20

Java bsico 1

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

Java bsico 1

21

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.

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.

22

Java bsico 1

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

*=

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:
Java bsico 1

23

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:

24

Operador

Significado

Exemplo

&

E bit a bit

x = y & 32;

&=

E bit a bit com atribuio

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

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;

Java bsico 1

Operador

Significado

Exemplo

>>>=

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

Java bsico 1

25

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

26

Java bsico 1

String frase = sc.nextLine();


System.out.println(frase);
int i = sc.nextInt();
System.out.println(i);
double temperatura = sc.nextDouble();
System.out.println(temperatura);
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
.

Exerccios de Fixao 4 Variveis


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

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

Java bsico 1

27

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.

28

Java bsico 1

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 relacion-los
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.
Java bsico 1

29

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:
public static void main(String[] args) {
int n;

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

}
}

Estruturas de Deciso
Tambm chamadas de estruturas condicionais, os comandos de seleo permitem executar
instrues ou blocos de comandos com base em testes lgicos feitos 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)
30

Java bsico 1

comando;
else {
comando;
...
comando;
}
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 igual a zero");
break;
case 1:
System.out.print("i igual a um");
break;
case 2:
System.out.print("i igual a dois");
break;
Java bsico 1

31

default:
System.out.print("i diferente de tudo");
break;
}
A clusula default serve para tratar valores que no esto em nenhum case. opcional.
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.

32

Java bsico 1

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.
O exemplo a seguir mostra o uso do while para imprimir os nmeros de 1 a 10:
Java bsico 1

33

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.
Um comando for funciona de maneira semelhante a um while escrito da seguinte forma:
34

Java bsico 1

<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
break ler_dados;
...
}
Java bsico 1

35

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

36

Java bsico 1

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

Atividade 2 Controle de fluxo (complementar)


1. Faa uma classe executvel que calcule e imprima o somatrio dos nmeros pares existentes entre
100 e 500.
2. Faa uma classe executvel que calcule e imprima o somatrio dos nmeros impares existentes em
300 e 700.
3. Faa uma classe executvel que dado um nmero, informe se ele divisvel por 5.
4. 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.

Java bsico 1

37

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

38

Java bsico 1

5
Arrays
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 unidimensional 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.
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.
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.

Java bsico 1

39

Figura 5.1 Representao 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]);

40

Java bsico 1

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

41

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, usase 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:
int [][] vendas = {{1998, 1998}, {10000, 20000}};

42

Java bsico 1

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.

Java bsico 1

43

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.

44

Java bsico 1

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?

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

Java bsico 1

45

Tipo primitivo

Classe wrapper

Parmetro para o construtor

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

46

Java bsico 1

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 meianoite 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]) + ";");
}
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.
Java bsico 1

47

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.

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

Java bsico 1

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.

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

Java bsico 1

49

Symbol

Significado

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

50

Java bsico 1

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

51

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.

52

Java bsico 1

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.

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 generalizada
da chamada de funes usada na programao estruturada: a chamada de mtodos.
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.
Java bsico 1

53

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

54

Java bsico 1

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?
Qual o estado do objeto?
Qual a identidade do objeto?
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);
Java bsico 1

55

Nesse caso, o objeto carro da classe carro est sendo passado como parmetro para o
mtodo estacionar do objeto estacionamento.

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

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:
public class Evento {
private int Id;
private ItemEvento Item;
public int getId() {
return Id;
56

Java bsico 1

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

Java bsico 1

57

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.

Sobrecarga
Em Java pode-se ter vrios mtodos com o mesmo nome. Isso chamado sobrecarga.
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
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);

58

Java bsico 1

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

59

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.


60

Java bsico 1

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.

Atividade 2 Classes e Objetos (Complementar)


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

// tem o comprimento de dois lados iguais.

61

2. 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 salrio-bruto 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 salriobruto 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 salrio-base e o
nvel do cargo) e mostre seu contracheque.
3. 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

62

Java bsico 1

Exerccios de Fixao Classes e Objetos


A proteo de atributos e mtodos das classes, fazendo com que estas 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
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.

Usando pacotes
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 bsico 1

63

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

Java bsico 1

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

Java bsico 1

65

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

Java bsico 1

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

Java bsico 1

67

Secretario e outra Programador derivarem de Empregado. Ficaramos com a seguinte


configurao:

Figura 7.1 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.
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.
68

Java bsico 1

Polimorfismo
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
Programador = aumentarSalarioProgramador();

Java bsico 1

69

Figura 7.2 Herana sem o emprego de polimorfismo.


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

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

Classes Abstratas
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
70

Java bsico 1

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

Java bsico 1

71

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. Deve-se
ter em mente que isso no mais permitir que um mtodo seja sobrescrito.

Classe Class
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;
...
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.

72

Java bsico 1

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;
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 {
Java bsico 1

73

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

74

Java bsico 1

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:
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 Employee 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)
{
Employee other = (Employee)otherObject;
if (salary < other.salary) return -1;
if (salary > other.salary) return 1;
Java bsico 1

75

return 0;
}
Alerta: 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.

Propriedades
Embora as interfaces no sejam instanciadas com new, pode-se ter uma varivel da interface:
Comparable x = new Empregado(...);
Empregado y = new Empregado();
76

Java bsico 1

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
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;
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:
Java bsico 1

77

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

Java bsico 1

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?

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

Java bsico 1

79

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

Java bsico 1

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

81

82

Java bsico 1

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

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
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.
Java bsico 1

83

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

84

Java bsico 1

Figura 8.1 API do Collections.

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

Java bsico 1

85

Figura 8.2 Interface List e classes que a implementam.

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


86

Java bsico 1

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);
}
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
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
Java bsico 1

87

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

88

Java bsico 1

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?

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

Java bsico 1

89

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:

90

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

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

91

Java bsico 2

Paulo Henrique Cayres

Rio de Janeiro

Escola Superior de Redes


2013
Java bsico 2

Java bsico 2

Sumrio
Programao para interfaces grficas, componentes e controle de
eventos sesses 1, 2 e 3.......................................................................................... 3
Introduo ................................................................................................ 4
Janelas ..................................................................................................... 5
Exibio de Informaes ......................................................................... 7
Objetos Grficos e o Mtodo paintComponent ................................ 7
Texto, Fontes e Cores .............................................................................. 9
Formas Geomtricas .............................................................................. 10
Imagens ................................................................................................. 10
Eventos .................................................................................................. 10
Hierarquia de Eventos do AWT .........................................................12
Eventos de Foco .................................................................................12
Eventos de Teclado ............................................................................13
Eventos de Mouse ..............................................................................13
Componentes visuais-grficos do pacote Swing ................................... 14
Padro MVC .......................................................................................14
Gerenciamento de Layout de Visualizao ........................................... 15
Bordas .................................................................................................17
Painis ................................................................................................18
Grade ..................................................................................................19
Caixa ...................................................................................................20
Bolsa de Grade ...................................................................................21
No usar Gerenciador de Layout ........................................................23
Campos de Entrada de Texto................................................................. 25
Campos de Texto ................................................................................25
Campos de Senha ...............................................................................26
reas de Texto....................................................................................26
Seleo de Texto ................................................................................27
Rtulos................................................................................................... 27
Caixas de Seleo .................................................................................. 28
Botes de Rdio..................................................................................... 29
Borda ..................................................................................................... 30
Listas ..................................................................................................... 30
Combos .................................................................................................. 32
Menus .................................................................................................... 34
Caixas de Dilogo ................................................................................. 37
Ordem de Travessia: Tab Order ............................................................ 38
Applets sesso 4 ......................................................................................................40
Ciclo de Vida de um Applet .................................................................. 41
Um primeiro exemplo de Applet ........................................................... 42
A classe Applet ...................................................................................... 42
Invocando um Applet no browser ......................................................... 43
Obtendo parmetros no Applet.............................................................. 45
Passando parmetros para o Applet....................................................... 46
Java bsico 2

Applets Java versus Aplicativos ............................................................ 47


Converso de aplicao em Applet: ...................................................... 47
Manipulao de eventos no Applet ....................................................... 48
Exibindo imagens no Applet ................................................................. 50
Reproduo de udio no Applet ............................................................ 51
Tratamento de Erros sesso 5 ............................................................................56
Descrever Excees em Mtodos .......................................................... 57
Levantar uma Exceo .......................................................................... 58
Criar Novas Excees ........................................................................... 59
Capturando Excees ............................................................................ 59
Controle de entrada e sada, streams e tratamento de arquivos
sesso 6 ......................................................................................................................62
Stream em Java ...................................................................................... 64
Entrada e Sada baseada em Bytes ........................................................ 65
Serializao de Objetos ......................................................................... 67
JDBC sesso 7, 8 e 9 ................................................................................................72
Exemplo de Acesso ............................................................................... 74
Obtendo Conexes ................................................................................ 75
Executando Consultas ........................................................................... 75
Executando Alteraes .......................................................................... 78
Recuperando Resultados ....................................................................... 78
Instrues Preparadas ............................................................................ 79
Stored Procedures .................................................................................. 81
Fechando Recursos ................................................................................ 81
Transaes ............................................................................................. 81
Execuo em Batch ............................................................................... 82
Threads sesso 10 ..................................................................................................86
Mltiplas Linhas de Execuo (Thread) ............................................... 87
O que so? ............................................................................................. 87
Incio do Thread e Programao de Thread .......................................... 87
Teste de um Thread ............................................................................... 90
Suspendendo Threads ............................................................................ 90
Implementar Runnable Versus Estender Thread ................................... 92
As Trs Partes de um Thread ................................................................ 92
Implementando uma Thread Mtodo Mais Comum .......................... 93
Tratamento de Regies Crticas com Threads ....................................... 95
Um Resumo do Funcionamento do Mecanismo de Sincronismo ......97
Bibliografia ............................................................................................................... 100

Java bsico 2

1
Programao para interfaces grficas,
componentes e controle de eventos
sesses 1, 2 e 3
Exerccio de nivelamento 1 Interfaces grficas
Voc j desenvolveu aplicaes desktop que utilizaram Interfaces Grficas com Usurios?
Com qual linguagem de programao?

Voc poderia descrever alguns componentes visuais grficos que utilizou para
desenvolvimento destas interfaces?

Breve histrico:

AWT (Abstract Window Toolkit)

Java Foundation Classes (JFC)-Swing

Principais componentes visuais grficos GUI


Desenvolvimento de GUIs Java
Java bsico 2

Introduo
Quando a linguagem Java 1.0 foi lanada, ela continha somente a biblioteca de classes AWT
(Abstract Window Toolkit) para programao GUI (Graphical User Interface) bsica. A
maneira que o AWT funciona a delegao de criao de seus componentes GUI nativos. Na
verdade, quando a criao de uma caixa de texto era feita, a linguagem criava por trs uma
caixa semelhante (peer) que fazia todos os tratamentos. Dessa maneira conseguia-se rodar
os programas em vrias plataformas, tendo o programa com o mesmo aspecto
(HORSTMANN, 2003).

Em aplicaes mais complexas, essa metodologia no era muito produtiva, pois era
realmente difcil escrever determinados cdigos. Outro problema era que o comportamento
de determinados componentes mudava de plataforma para plataforma, ou determinados
ambientes no tinham uma vasta biblioteca de componentes grficos, o que levava a um
esforo muito grande para a padronizao das aplicaes.

Em 1996 a Netscape criou a biblioteca GUI chamada IFC Internet Foundation Classes que
usava uma metodologia completamente diferente. Aqui, todos os componentes eram
desenhados numa tela em branco. Assim, os componentes grficos se tornavam parecidos
com os nativos das plataformas. A Sun trabalhou junto com a Netscape para aprimorar essa
biblioteca, e criaram a biblioteca Swing.

Assim, o conjunto swing foi tornado o kit de ferramentas GUI oficial da JFC (Java Foundation
Classes).
Evidentemente, os componentes do swing so um tanto quanto mais lentos que os criados
usando AWT, mas o uso em mquinas mais modernas mostrou que a diferena no mais
to problemtica.
O problema da aparncia em relao ao sistema nativo foi resolvido, usando o conceito de
look and feel, onde se pode escolher a aparncia que se quer que o sistema tenha. Mesmo
assim, a Sun desenvolveu uma aparncia independente de plataforma, chamada Metal. A
biblioteca swing se encontra em: javax.swing.*.

Na verso atual a linguagem Java suporta duas bibliotecas grficas: a AWT e a Swing. A
biblioteca AWT foi a primeira API voltada para interfaces grficas a surgir no Java.
Posteriormente surgiu a biblioteca Swing (a partir do Java 1.2), que possui algumas
melhorias com relao antecessora. De uma forma geral, apesar do reza o senso comum, as
bibliotecas grficas so bastante simples no que diz respeito a conceitos necessrios para
us-las.

Os sentimentos de complexidade e dificuldade visualizados no aprendizado de interfaces


grficas em Java devido ao tamanho das bibliotecas e na enorme gama de possibilidades, as
quais certamente assustaro o desenvolvedor de primeira viagem. As bibliotecas AWT e
Swing as bibliotecas grficas oficiais, sempre inclusas em qualquer pacote distribudo pela
Sun. Porm, alm destas, existem algumas outras bibliotecas de terceiros, sendo a mais
famosa o SWT, desenvolvido pela IBM.
Outra questo que vale a pensa ser ressaltada o fato que a linguagem Java, antes de tudo
prima pelo lema da portabilidade e as API de interface grfica do Java no poderiam ser

Java bsico 2

diferentes. A aparncia das janelas construdas com a API Swing nica em todas as
plataformas onde roda (Windows, KDE, Gnome). Com isso pode-se afirmar que a aplicao
ter exatamente a mesma interface e aparncia com pequenas variaes geradas por
peculiaridades dos sistemas operacionais, como por exemplo, as fontes utilizadas nas janelas.
Grande parte da complexidade das classes e mtodos do Swing est no fato da API ter sido
desenvolvida tendo em mente o mximo de portabilidade possvel. Favorece-se, por
exemplo, o posicionamento relativo de componentes em detrimento do uso de
posicionamento relativo que poderia prejudicar usurios comresolues de tela diferentes
da prevista.

Janelas

Uma janela de mais alto nvel, que no est contida em nenhum outro componente,
chamada quadro (frame). Em AWT a classe Frame. Em Swing JFrame. Essa classe no
desenhada dentro de uma tela de desenho (canvas), portanto a moldura toda desenha
pelo gerenciador de janelas nativo.
Os quadros so exemplos de contineres, isto , podem conter componentes de interface de
usurio dentro deles. Por exemplo:

import javax.swing.*;
class FirstFrame extends JFrame {
public FirstFrame() {
setTitle("FirstFrame");
setSize(300, 200);
}
}
public class FirstTest {
public static void main(String[] args) {
JFrame frame = new FirstFrame();
frame.show();
}
}

Java bsico 2

Figura 01 Exemplo JFrame.


Nesse exemplo, a classe FirstFrame estende a classe JFrame. Quando a classe
FirstTest instancia um FirstFrame (new FirstFrame()) e chama show(), esse
frame ser mostrado, fazendo com que seja aberta uma nova janela.
No construtor de FirstFrame, a chamada de setTitle() seta o ttulo da janela. A
chamada de setSize() seta o tamanho da janela, em pixels. Quando se quiser setar a
localizao dessa janela, pode-se chamar o mtodo setLocation().

Para se encerrar um programa, no adianta somente fechar a janela, deve-se sair do


programa e desligar a virtual machine. Para isso, deve-se tratar o evento de sada do
programa. Eventos sero vistos com mais cuidado mais adiante, mas por agora temos que
saber como tratar com esse evento bsico, o de fechamento de aplicativo.

No modelo de eventos do AWT, deve-se informar ao frame qual o objeto que quer saber
quando ele for fechar. Esse objeto (o ouvinte, o que tratar o evento) deve ser uma
instncia de uma classe que implementa a interface WindowsListener. No nosso exemplo,
essa classe ser chamada Terminator. Em seguida, precisa-se adicionar um objeto da
classe Terminator ao frame, para que ele seja ouvinte da janela.
class FirstFrame extends JFrame {
public FirstFrame() {
Terminator exitOnClose = new Terminator();
AddWindowListener(exitOnClose);
...

Mas se for analisada a interface WindowListener, percebe-se que existem sete mtodos
que devem ser sobrepostos:
public void windowActivated(WindowEvent e)
public void windowClosed(WindowEvent e)
public void windowClosing(WindowEvent e)

Java bsico 2

public
public
public
public

void
void
void
void

windowDeactivated(WindowEvent e)
windowDeiconified(WindowEvent e)
windowIconified(WindowEvent e)
windowOpened(WindowEvent e)

No nosso caso, s precisamos tratar o mtodo windowClosing. Fica incmodo ter que
implementar seis mtodos vazios. Para isso existe a classe WindowAdapter, que
implementa todos esses sete mtodos como sendo vazios. Com isso, pode-se s sobrepor os
mtodos que se quer tratar:
class Terminator extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}

No modelo de eventos do Swing, deve-se definir a constante pertencente a classe


WindowsConstantis como parmetro do mtodo setDefaultCloseOperation() para que a
instncia de JFrame consiga tratar o evento que correspondente ao fechamento da janela da
aplicao em desenvolvimento. A configurao da chamada do mtodo seria
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);.

Exibio de Informaes
Desenhar uma string diretamente num quadro no considerada uma boa tcnica de
programao, apesar de possvel. Mas esse componente projetado para ser um continer de
outros componentes, estes sim podendo possuir dados.
A estrutura de um JFrame complexa, mas o que nos interessa a rea de contedo. Essa
a rea onde os componentes sero adicionados.
Suponha que se queira inserir no frame um painel (JPanel) para se imprimir uma string
dentro. O cdigo seria:

// obteno da rea de contedo


Container painelConteudo = frame.getContentPane();
// criao do componente
JPanel p = new JPanel();
// adio do componente ao frame
painelConteudo.add(p);

Objetos Grficos e o Mtodo paintComponent


Sempre que se precisa de um componente grfico parecido com um componente do swing,
pode-se usar herana para criar uma nova classe e depois sobrepor ou adicionar mtodos
para satisfazer as necessidades.
Java bsico 2

Para desenhar um painel, deve-se:

Definir uma classe que estenda JPanel;

Sobrepor o mtodo paintComponent dessa classe.

Por exemplo:

class MyPanel extends JPanel {


public void paintComponent(Graphics g) {
// o cdigo de desenho vem aqui
}
}
Um detalhe importante nunca chamar o mtodo paintComponent diretamente. Ele
chamado automaticamente toda vez que uma parte do sistema tenha que ser refeita,
redesenhada. Ao invs, deve-se chamar o mtodo repaint.

A exibio do texto se d por:

g.drawString(Hello World, 75, 100);


Que deve ser colocado dentro do paintComponent. Por exemplo:
class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(Hello World, 75, 100);
}
}

A classe Graphics a responsvel por fazer desenhos de texto e imagens, com fontes e
cores.
O exemplo acima completo fica:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class HelloWorldPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawstring(Hello World, 75, 100);
}
}
public class HelloWorldFrame extends JFrame {
public HelloWorldFrame() {
setTitle(Hello World);
setSize(300, 200);
addWindowListener(new WindowAdapter() {

Java bsico 2

public void windowClosing(WindowEvent e) {


System.exit(0);
});
Conteiner contentPane = getContentPane();
contentPane.add(new HelloWorldPanel());

}
public class HelloWorld {
public static void main(String[] args) {
JFrame frame = new HelloWorldFrame();
frame.show();
}
}

Texto, Fontes e Cores


Pode-se selecionar fontes diferentes deve-se informar ao objeto Graphics qual fonte usar.
A classe responsvel por criar fontes Font. Por exemplo:
Font sans = new Font(SansSerif, Font.BOLD, 14);

Onde 14 o tamanho da fonte. Para setar uma fonte dentro do paintComponent, antes de
imprimir faz-se:
Font sans = new Font(SansSerif, Font.BOLD, 14);
g.setFont(f);
g.drawString(Hello World, 75, 100);

Um detalhe importante que atravs da classe FontMetrics se consegue saber qual a


altura de uma determinada fonte (Font) e tambm o comprimento de uma string usando
uma determinada fonte (Font). Isso muito til quando se quer imprimir vrias strings na
tela, alinhado, e tambm no to dispersos.
Cores tambm so facilmente alteradas atravs da classe Color. Por exemplo:

g.setColor(Color.pink);
g.drawString(Hello, 75, 100);
g.setColor(new Color(0, 128, 128));
g.drawString(World, 75, 125);

Para especificar a cor de fundo de um painel, pode-se usar o seguinte exemplo:


JPanel p = new MeuPainel();
p.setBackGround(Color.white);
contexPane.add(p. Center);

Java bsico 2

Formas Geomtricas
Para desenhar formas geomtricas, usam-se os mtodos drawLine, drawArc e
drawPolygon, do pacote java.lang.Graphics. Por exemplo, um polgono:
Polygon p = new Polygon();
p.addPoint(10, 10);
p.addPoint(10, 30);
p.addPoint(20, 20);
g.drawPolygon(p);

Para retngulos e elipses usa-se drawRect, drawRoundRect, draw3DRect e drawOval.


Para preencher as formas geomtricas uma srie de funes so disponibilizadas:
fillRect, fillOval, fillPolygon, etc.

Imagens

Para mostrar um grfico num aplicativo, usa-se a classe Toolkit. Por exemplo:
String nome = blue-ball.gif;
Image img = Toolkit.getDefaultToolkit().getImage(nome);
g.drawImage(img, 10, 10, null);

Eventos
A manipulao de eventos ponto imprescindvel no desenvolvimento de aplicativos com
interface grfica para o usurio. Frequentemente dito que a aplicao Orientada a
Eventos.
Exemplos de eventos so teclas pressionadas, recebimento de mensagens pela rede, cliques
no mouse, etc.
Em Java pode-se controlar totalmente como os eventos so transmitidos desde as origens
dos eventos (como barras de rolagem ou botes) at os ouvintes de eventos. Pode-se
designar qualquer objeto para ser um ouvinte de um evento, desde que ele o trate
convenientemente.
Existem subclasses para cada tipo de eventos, como ActionEvent e WindowEvent.
Uma viso geral da manipulao de eventos :

Um objeto ouvinte uma instncia de uma classe que implementa uma interface especial,
chamada naturalmente de interface ouvinte;
Uma origem do evento um objeto que pode registrar objetos ouvintes e envia a estes os
objetos eventos;

A origem do evento envia objetos eventos para todos os ouvintes registrados quando esse
evento ocorre;
Os objetos ouvintes vo ento usar a informao do objeto evento recebido para
determinar sua reao ao evento.

10

Java bsico 2

O objeto ouvinte registrado no objeto de origem com um cdigo que segue o modelo a
seguir:
objetoFonteEvento.addEventListener(objetoOuvinteEvento);
Por exemplo:

MeuPanel painel = new MeuPanel();


JButton botao = new JButton(Limpar);
botao.addActionListener(painel);
Aqui, o objeto painel ser notificado sempre que um evento ocorrer em boto. A classe
MeuPainel deve possuir uma construo parecida com:
public class MeuPainel extends JPanel implements ActionListener {
public void actionPerformed(ActionEvent evt) {
...
}
}

Sempre que o usurio clicar no boto, o objeto JButton cria um objeto ActionEvent e
chama painel.actionPerformed.

Quando se tem muitos botes, que possuem o mesmo ouvinte, se torna necessrio saber qual
objeto fonte gerou o evento. Existem duas maneiras fceis de se tratar isso, dentro do
mtodo actionPerformed:

String command = evt.getActionCommand();


if (command.equals(OK)) ...

Que retorna o label, o texto do boto que foi impresso. Ou:


Object source = evt.getSource();
if (source == btnOk) ...
Que retorna o objeto que gerou o evento.

Java bsico 2

11

Hierarquia de Eventos do AWT

Figura 02 Hierarquia de eventos AWT.

Vendo a hierarquia percebe-se que o AWT faz distino entre eventos semnticos, que
expressam o que o usurio est fazendo, e de baixo nvel, que tornam os eventos semnticos
possveis. Por exemplo, um clique de um boto, na verdade uma sequncia de outros
pequenos eventos, como pressionamento do boto, movimentao do mouse enquanto
pressionado e liberao do boto.

Eventos de Foco

Na linguagem Java, um componente tem o foco se pode receber pressionamento de teclas.


Esse componente pode receber o foco ou perder o foco. Tambm pode-se pressionar TAB
para mover o foco sequencialmente componente a componente, de cima para baixo, da
esquerda para direita.
Pode-se evitar que um componente receba o foco simplesmente sobrepondo o mtodo
isFocusTransversable para que retorne false.

Um ouvinte de foco precisa implementar dois mtodos: focusGained e focusLost. Esses


eventos so acionados quando a origem ganhar ou perder o foco, respectivamente. Cada um
esses mtodos tem um parmetro FocusEvent. H dois mtodos teis nessa classe:
getComponent que retorna o componente que recebeu ou perdeu o foco, e isTemporary
que retorna true se a mudana do foco foi temporria. Uma mudana temporria do foco
acontece quando um componente perde o controle temporariamente para depois recuperalo automaticamente.
Exemplo:

public void focusLost(FocusEvent evt) {


if (evt.getComponent()==ccField && !!evt.isTemporary()) {
If (!checarFormato(ccField.getText()))

12

Java bsico 2

ccField.requestFocus();

Onde o mtodo requestFocus coloca o foco num controle especfico.

Eventos de Teclado

Eventos de teclado so ouvidos por classes que implementam a interface KeyListener. O


evento keyPressed informa a tecla pressionada:
public void keyPressed(KeyEvent evt) {
int keyCode = evt.getKeyCode();

Outros mtodos podem ser sobrepostos como keyReleased, que diz quando uma tecla foi
liberada.

Eventos de Mouse

No necessrio processar explicitamente os eventos de mouse caso se queira tratar cliques


em botes ou menus. Essas so tratadas internamente.
Para o tratamento de eventos de mouse, a classe ouvinte deve implementar a interface de
MouseMotionListener. Para os eventos de pressionamento dos botes do mouse, devese usar um MouseAdapter. Por exemplo:
public MousePanel(){
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
int x = evt.getX();
int y = evt.getY();
current = find(x, y);
if (current < 0) // not inside a square
add(x, y);
}
public void mouseClicked(MouseEvent evt) {
int x = evt.getX();
int y = evt.getY();
if (evt.getClickCount() >= 2) {
remove(current);
}
}
});
addMouseMotionListener(this);
}
Java bsico 2

13

Componentes visuais-grficos do pacote Swing

Figura 03 Componentes Swing.

Padro MVC
O MVC um padro de projeto (Modelo-Visualizao-Controlador ou Model-View-Controler),
que se baseia nos princpios de projetos orientados a objetos: no construir um objeto
responsvel por tarefas em demasia. Isto , num exemplo de componente de boto, no se
deve criar um boto como uma nica classe que cuida da aparncia visual e das
particularidades de como um boto funciona.
O padro de projeto MVC ensina como realizar isso. Deve-se implementar trs classes
separadas:
Mode: o modelo, que armazena o contedo;
View: a visualizao, que exibe o contedo;

Controller: o controlador, que processa entrada de dados do usurio.

O padro especifica precisamente como os trs objetos interagem. O Modelo armazena o


contedo e no tem interface. Para um boto, o contedo bem trivial, contm apenas um
14

Java bsico 2

conjunto de flags indicando se est pressionado ou no, ativo ou no. O modelo precisa
implementar mtodos para alterar e ler o contedo. Deve-se ter em mente que ele
totalmente abstrato, no possui representao visual.

Uma das grandes vantagens do padro MVC que um modelo pode ter vrias visualizaes,
cada uma mostrando partes ou aspectos diferentes do contedo. Por exemplo, um editor
HTML pode mostrar o contedo de duas formas, uma como a pgina aparece no browser,
com opo de edio (WYSIWYG) e outra mostrando as tags todas do arquivo html para
edio.

O controlador manipula os eventos de entrada do usurio, como cliques do mouse e


pressionamento de teclas. Ele decide se deve traduzir ou no esses eventos em alteraes do
modelo ou na visualizao. Por exemplo, numa caixa de edio de texto, quando um caractere
pressionado, o controlador deve informar ao modelo que este foi alterado. Ento o modelo
avisa a visualizao para atualizar a interface. Mas quando uma tecla de navegao
pressionada, ento o controlador somente avisa a visualizao, j que o modelo no foi
alterado.

Figura 04 Interao do padro MVC.

Gerenciamento de Layout de Visualizao


At agora utilizamos componentes para desenvolvimento de interfaces grficas sem se
preocupar com o modelo de visualizao. Isto , a maneira como estes esto distribudos e
como se apresentam seus controles dentro de um frame.

Usaremos o boto (JButton) por ser um componente visual grfico comumente utilizado para
interao com usurios de programas e tambm por ser simples de controlar, ser usado nos
exemplos.
Java bsico 2

15

Por exemplo, podemos desenvolver um programa que imprime trs botes que alteram as
cores de fundo de um frame, quanto clicados pelo usurio. Veja o cdigo java abaixo que
pode ser utilizado para implementar esta funcionalidade:
// pega o panel
Container contentPane = getContentPane();
// adiciona controles
aux = new JButton("Amarelo");
contentPane.add(aux);
aux.addActionListener(this);
aux = new JButton("Azul");
contentPane.add(aux);
aux.addActionListener(this);
aux = new JButton("Vermelho");
contentPane.add(aux);
aux.addActionListener(this);
contentPane.setLayout(new FlowLayout(FlowLayout.CENTER));
Neste exemplo, a ltima linha seta o layout que ser usado na impresso dos controles na
tela. Nesse caso, os controles sero centralizados:
contentPane.setLayout(new FlowLayout(FlowLayout.CENTER));

A funo setLayout um mtodo do continer, que pode receber qualquer uns dos layouts
definidos. Em particular, o FlowLayout usado para alinhar os controles, centralizado,
esquerda ou direita.

Figura 05 Exemplo de uso de botes em interfaces grficas.


16

Java bsico 2

Bordas
O gerenciador de layout de visualizao de bordas (BorderLayout) o gerenciador padro do
JFrame. Este gerenciador permite escolher em que posio se deseja colocar o controle.

Figura 06 Exemplo BorderLayout.

Java bsico 2

17

Por exemplo:

Class MyPanel extends Jpanel {


...
jButton1.setText("Norte");
getContentPane().add(jButton1,
java.awt.BorderLayout.PAGE_START);
jButton2.setText("Sul");
getContentPane().add(jButton2,
java.awt.BorderLayout.PAGE_END);
jButton3.setText("Oeste");
getContentPane().add(jButton3,
java.awt.BorderLayout.LINE_START);
jButton4.setText("Leste");
getContentPane().add(jButton4,
java.awt.BorderLayout.LINE_END);

...
}

jButton5.setText("Centro");
getContentPane().add(jButton5, java.awt.BorderLayout.CENTER);

Os componentes das bordas so colocados primeiro. O que sobra ocupado pelo centro.
Pode-se posicionar como North, South, East, West e Center. O Layout de borda
aumenta todos os componentes para que ocupem todo o espao disponvel. O Layout de
Fluxo deixa todos os componentes com seu tamanho preferencial.

Painis

O problema do Layout de Borda, quanto ao redimensionamento dos componentes para que


ocupem o espao disponvel em cada uma das regies disponveis, pode ser contornado
atravs do uso de painis adicionais. Esses painis agem como continers para controles.
Dentro desses painis pode-se utilizar outro layout, podendo assim fazer uma mescla de
vrios tipos.
Por exemplo:

Conteiner contentPane = getContentPane();


Jpanel panel = new JPanel();
panel.add(yellowButton);
panel.add(blueButton);
panel.add(redButton);
contentPane.add(panel, South);

18

Java bsico 2

Grade
O gerenciador de layout de visualizao de grade (GridLayout) organiza todos os
componentes em linhas e colunas como uma planilha. Neste layout as clulas so todas do
mesmo tamanho.
No construtor do objeto layout de grande, deve-se especificar quantas linhas e colunas se
quer:
panel.setLayout(new GridLayout(5, 4);

Pode-se tambm espeficificar os espaamentos horizontal e vertical (respectivamente e em


pixels) desejados:
panel.setLayout(new GridLayout(5, 4, 3, 3);

Adicionam-se componentes comeando com a primeira entrada da primerira linha, depois a


segunda entrada da primeira linha e assim sucessivamente.

Figura 07 Exemplo GridLayout.

Java bsico 2

19

Caixa
O gerenciador de layout de visualizao de Caixa (BoxLayout) permite colocar uma nica
linha ou coluna de componentes com mais flexibilidade de que o layout de grade. Existe um
continer (Box) cujo gerenciador padro de layout o BoxLayout, diferentemente da
classe Panel, cujo gerenciador o FlowLayout.

Exemplos. Para criar um novo continer com layout de caixa, faz-se:


Box b = Box.createHorizontalBox();
ou

Box b = Box.createVerticalBox();
Depois, adicionam-se elementos de maneira usual:
b.add(okButton);
b.add(cancelButton);

Na caixa horizontal, os componentes so organizados da esquerda para a direita. Na vertical


de cima para baixo.

Para no se ter problemas com um controle que dentro de um layout de caixa fique com uma
altura no desejada, faz-se com que seu tamanho mximo seja o tamanho preferencial. Por
exemplo:
textField.setMaximumSize(textField.getPreferredSize());

Para se adicionar algum espao entre, por exemplo, botes OK e Cancel numa tela, pode-se
fazer:
b.add(okButton);
b.add(Box.createHorizontalStrut(5));
b.add(cancelButton);

Que adiciona uma escora vertical, numa caixa vertical, ou uma escora horizontal numa caixa
vertical, separando os componentes em exatamente 5 pixels (no exemplo).

Pode-se usar tambm uma rea rgida invisvel, sendo similar a um par de escoras,
separando os componentes adjacentes, mas tambm adicionando uma altura ou largura
mnima na outra direo. Por exemplo:
b.add(Box.createRigidArea(new Dimension(5, 20)));

adiciona uma rea invisvel com largura mnima, preferencial e mxima de 5 pixels e altura
de 20 pixels, mas alinhamento centralizado.

Adicionar cola faz o contrrio que uma espora, separa os componentes tanto quanto
possvel.
b.add(okButton);
b.add(Box.createGlue());
b.add(cancelButton);

20

Java bsico 2

Figura 08 Exemplo BoxLayout.

Bolsa de Grade
O gerenciador de layout de visualizao de Caixa (GridBagLayout) a me de todos os
gerenciadores de layouts. um layout de grade sem limitaes. Pode-se unir clulas
adjacentes para abrir espao para componentes maiores, etc. Os componentes no precisam
preencher toda a rea da clula e pode-se especificar seu alinhamento dentro delas.

Mas a sua utilizao pode ser bem complexa. o preo que se paga pela flexibilidade mxima
e possibilidade de se trabalhar com vrios tipos de situaes diferentes.

Para descrever o layout do gerenciador de bolsa de grade, necessrio percorrer o seguinte


procedimento:
Criar um objeto do tipo GridBagLayout. No se informa quantas linhas e colunas a
grade tem. Em vez disso, o gerenciador de layout ir tentar descobrir isso a partir das
informaes fornecidas mais tarde;
Especificar esse objeto GridBagLayout como sendo o gerenciador de layout do
componente;

Criar um objeto do tipo GridBagConstraints. Esse objeto ir especificar como os


componentes so colocados dentro da bolsa de grade;

Para cada componente, preencher o objeto GridBagConstraints. Depois, adicionar


o componente com as restries.

Por exemplo:

GridBagLayout layout = new GridBagLayout();


Java bsico 2

21

panel.setLayout(layout);
GridBagConstraints restricoes = new GridBagConstraints();
restricoes.weightx = 100;
restricoes.weighty = 100;
restricoes.gridx = 100;
restricoes.gridy = 100;
restricoes.gridwidth = 100;
restricoes.gridheight = 100;
JList estilo = new JList();
panel.add(estilo, restricoes);
Os parmetros gridx, gridy especificam a posio (linha e coluna) do componente em
relao ao canto superior esquerdo. Os valores gridWidth e gridHeight determinam
quantas colunas e linhas o componente ocupa.

Os campos weightx e weighty especificam se os campos podem ou no ser ampliados. Se


o peso for 0, ento o campo ter seu tamanho fixo, nunca ser ampliado ou reduzido. Isso
quando a janela for redimensionada. Eles no definem tamanho, mas definem a folga que um
campo pode ter para ser ampliado.
Os parmetros fill e anchor so usados para que um componente no se estenda toda a
rea. Para fill, tem-se quatro possibilidades: GridBagConstraints.NONE,
GridBagConstraints.HORIZONTAL, GridBagConstraints.VERTICAL,
GridBagConstraints.BOTH.

O campo anchor usado quando o componente no ocupa o espao todo da rea. Pode-se
ancor-lo em algum espao dentro do campo. Pode ser: GridBagConstraints.CENTER,
GridBagConstraints.NORTH, GridBagConstraints.NORTHEAST,
GridBagConstraints.EAST, etc.
Para tornar a confeco desse layout mais tranquilo, pode-se usar a seguinte receita:

1.

Esboar o layout do componente numa folha de papel;

3.

Rotular as linhas e as colunas da grade com 0, 1, 2, 3, .... Com isso, consegue-se os calores
de gridx, gridy, gridwidth e gridheight;

5.

Fazer todos os pesos iguais a 100. Contudo, se for preciso que uma linha ou coluna fique
no tamanho padro, deve-se fazer weightx ou weighty iguais a 0 em todos os
componentes que pertenam a essa linha ou coluna;

2.

4.

6.

22

Encontrar uma grade tal que os pequenos componentes fiquem contidos, cada um, em
uma clula, e os componentes grandes ocupem diversas clulas;

Para cada componente, deve-se saber se ele precisa preencher sua clula
horizontalmente ou verticalmente. Caso no, como fica alinhado? Isso determina fill e
anchor;

Escrever cdigo. Conferir cuidadosamente os valores de GridBagConstraints, pois


um nico valor errado poder arruinar todo o layout.

Java bsico 2

No usar Gerenciador de Layout


Para no usar o gerenciador de layout, ou para usar posicionamento absoluto deve-se setar o
gerenciador de layout para null e posicionar os controles manualmente:
panel.setLayout(null);
panel.add(ok);
ok.setBounds(10, 10, 30, 15);

Java bsico 2

23

Sesso 01 GUI em Java


Exerccios de Fixao 1 GUI em Java
O que so gerenciadores de layout? Quais so os gerenciadores de layout do Java?

Atividade 1 GUI em Java


1.
2.
3.
4.

Escreva uma aplicao Swing Java com uma interface que possibilite a digitao de trs
nmeros e que mostre em uma mensagem (JOptionPane) apenas o maior dentre estes. A
mensagem ser visualizada atravs de um clique num boto.

Escreva uma aplicao Swing Java com uma interface que possibilite a digitao de nome
e sobrenome de uma pessoa, separadamente. O programa dever produzir como
mensagem (JOptionPane) com o resultado da concatenao dessas duas cadeias de
caracteres.

Escreva uma aplicao Swing Java com uma interface que possibilite a digitao de dois
nmeros inteiros e depois exiba uma mensagem (JOptionPane) com o somatrio de
todos os nmeros inteiros existentes entre os nmeros digitados, inclusive.

Escreva uma aplicao Swing Java com uma interface que possibilite a digitao de um
nmero inteiro e depois exiba uma mensagem (JOptionPane) com o resultado
informando se este nmero par ou impar.

Atividade 2 GUI em Java (complementar)


1.
2.

24

Escreva uma aplicao Swing Java com uma interface que possibilite a digitao do nome
e idade de uma pessoa. Estas informaes sero utilizadas para instanciar um objeto da
classe Pessoa atravs do clique do mouse em um boto. Um segundo boto dever
retornar uma mensagem (JOptionPane) se esta pessoa maior ou menor de idade.

Escreva uma aplicao Swing Java que, data uma palavra ou frase fornecida pelo usurio
em uma caixa de texto JTextField, determine as seguintes informaes que devero ser
exibidas numa rea de texto (JTextArea): nmero de caracteres, quantidade de vogais,
quantidade de constantes, quantidade de dgitos. A operao dever ser acionada por
meio de um clique num boto (JButton).

Java bsico 2

Campos de Entrada de Texto


Em Java existem dois tipos de controle para tratamento de texto: campo de texto e rea de
texto. A diferena que campos de texto admitem uma s linha, enquanto reas de texto
admitem vrias linhas. As classes so JTextField e JTextArea.
Como mtodos mais usados tem-se:

void setText(String t);: seta o texto do controle;

String getText();: retorna o texto dentro do controle;

void setEditable(boolean b);: seta se o controle editvel.

Figura 09 Exemplo jTextField e jTextArea.

Campos de Texto
A maneira usual de inserir um campo de texto adicion-lo a um continer ou a um painel.
JPanel panel = new JPanel();
JTextField textField = new JTextField(Entrada Padro, 20);
panel.add(textField);

O segundo parmetro do construtor do JTextField o tamanho, no caso 20 colunas. Podese alterar o tamanho depois de criado, usando setColumns(15), por exemplo. Logo aps,
deve-se executar um validate().
Para adicionar um campo em branco:

JTextField textField = new JTextField(20);


Para alterar a fonte, usa-se setFont.
Java bsico 2

25

O tratamento de eventos de alterao de texto pode ser feito atravs da instalao de um


ouvinte na interface Document.
textField.getDocument().addDocumentListener(ouvinte);
Quando um texto alterado, um dos trs mtodos a seguir chamado:
void insertUpdate(DocumentEvent e);
void removeUpdate(DocumentEvent e);
void changeUpdate(DocumentEvent e);

Os dois primeiros mtodos so chamados quando caracteres tiverem sido inseridos ou


removidos. O terceiro mtodo chamado quando mudanas como formatao, ocorrem, e
tambm quando alteraes no texto so feitas.

Campos de Senha

Para que ningum veja o que est sendo digitado, usa-se um campo de senha, que no Java
implementado atravs de JPasswordField. Usam-se as seguintes funes:
void setEchoChar(char eco);: informa qual o caractere que ser mostrado
quando algo foi digitado;
char[] getPassword(); : retorna o texto digitado.

Figura 10 Exemplo jPasswordField.

reas de Texto
reas de texto podem ser criadas atravs do seguinte exemplo:

JTextArea textArea = new JTextArea(8, 40); // 8 linhas e 40 colunas


GetContentePane().add(textArea);
Pode-se setar as linhas e colunas atravs de setColumns e setRows. Se houver mais texto
a ser mostrado, ele ser truncado.

26

Java bsico 2

Quando se quer que as linhas maiores sejam quebradas, usa-se


textArea.setLineWrap(true). Essa quebra de linha completamente visual, o texto
continua inalterado.

No Swing rea de texto no possui barra de rolagem, se a quiser, deve-se usar um


ScrollPane, como a seguir:
TextArea = new JTextArea(8, 40);
JScrollPane scrollPane = new JScrollPane(textArea);
getContentPane().add(scrollPane, Center);

Figura 11 Exemplo jTextArea com JScrollPane e setTollTip.

Seleo de Texto
Usam-se os mtodos da superclasse JTextComponent.
void selectAll();: seleciona todo o texto;

void select(int inicio, int fim);: seleciona o texto com incio e fim
especificados;
int getSelectionStart();: retorna incio da seleo;
int getSelectionEnd();: retorna o fim da seleo;

String getSelectedText();: retorna o texto selecionado.

Rtulos
So componentes que possuem uma linha de texto simples, que no reagem s opes do
usurio. So usados como informativos, ou como nome de campos na tela, etc.
JLabel label = new JLabel(Nome: , JLabel.LEFT);
Onde JLabel.LEFT o alinhamento do texto.
Java bsico 2

27

Figura 12 Exemplo jLabel.

Caixas de Seleo

usado quando se quer uma seleo do tipo Sim ou No. As caixas de seleo precisam de
um Label para descrever sua finalidade. Por exemplo:
JPanel p = new JPanel();
JCheckBox bold = new JCheckBox(Bold);
bold.addActionListener(this);
p.add(bold);
JCheckBox italic = new JCheckBox(Italic);
italic.addActionListener(this);
p.add(italic);

Usa-se o mtodo setSelected para marcar ou desmarcar uma caixa de seleo.

Quando o usurio clica no check box um evento de ao gerado.Com o mtodo


isSelected consegue-se descobrir se o controle est ou no selecionado. Por exemplo:

public void actionPerformed(ActionEvent evt) {


Int m = (bold.isSelected() ? Font.BOLD : 0) +
(italic.isSelected() ? Font.ITALIC : 0);
panel.setFont(m);
}

Figura 13 Exemplo jCheckBox.

28

Java bsico 2

Botes de Rdio
Nas caixas de seleo pode-se selecionar nenhuma, uma ou vrias opes. Em vrias
situaes necessrio que o usurio escolha uma dentre vrias opes. E quando uma opo
selecionada, as outras so desmarcadas automaticamente. Para isso so usados botes de
rdio. Para que isso funcione, usam-se grupos. Isso conseguido criando-se um controle de
grupo e adicionando-se todos os botes de radio.
smallButton = new JRadioButton(Small, true);
mediumButton = new JRadioButton(Medium, false);
...
ButttonGroup group = new ButtonGroup();
group.add(smallButton);
group.add(mediumButton);
...

Novamente, quando o radio pressionado, um evento de ao gerado. Por exemplo:


public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
If (source == smallButton)
panel.setSize(8);
Else if(source == mediumButton)
panel.setSize(12);
...
}

Para saber se um boto de rdio est ou no selecionado pode-se usar isSelected.

Figura 14 Exemplo jRadioButton e buttonGroup.

Java bsico 2

29

Borda
So usados para delimitar partes da interface, como diferentes grupos de rdio. Para isso,
pode-se seguir os seguintes passos:
1.

Chame um mtodo esttico de BorderFactory para criar uma borda. Pode-se escolher
entre os seguintes estilos:
a.

Relevo abaixado (lowered bevel)

c.

Entalhe (etched)

b.
d.
e.
f.

Relevo destacado (raised bevel)


Linha (line)

Fosco (matte)

Vazio (empty)

2.

Se
quiser,
adicione
um
ttulo

borda,
BorderFactory.createTitledBorder(String).

4.

Adicione a borda resultante ao componente usando o mtodo setBorder da classe


JComponent.

3.

Se voc quiser experimentar de tudo, pode-se


BorderFactory.createCompoundBorder().

passando-o

combinar

ao

mtodo

bordas

com

Por exemplo:

Border etched = BorderFactory.createEtchedBorder();


Border titled = BorderFactory.createTitledBorder(etched, Titulo);
Panel.setBorder(titled);

Figura 15 Exemplo jPanel e BorderFactory.

Listas
Listas so usadas para escolhas com vrias opes. O Swing oferece um objeto muito
completo para se gerenciar esse tipo de lista, permitindo tanto strings quanto objetos
quaisquer.

O componente JList usado para manter um conjunto de valores dentro de uma s caixa
para seleo, permitindo tanto selees nicas quanto mltiplas. Exemplo:
30

Java bsico 2

String[] words = {quick, brown, hungry, wild};


JList wordList = new JList(words);
As listas no possuem barra de rolagem automaticamente, para isso deve-se adicion-la
dentro de um painel de rolagem:
JScrollPane scrollPane = new JScrollPane(wordList);

Depois, deve-se adicionar o painel de rolagem, e no a lista, no painel que a conter.

Para fazer com que um nmero definido de elementos seja mostrado a cada momento, usase:
wordList.setVisibleRowCount(10);

// mostra 10 itens

Por default a lista permite mltipla seleo, para usar seleo nica, usa-se:

wordList.setSelectionModel(ListSelectionModel.SINGLE_SELECTION);
O mtodo de notificao, tratamento de eventos, no se d atravs do monitoramento de
eventos de ao, mas sim eventos de seleo de lista. Deve-se implementar o mtodo:
public void valueChanged(ListSelectionEvent evt)
no ouvinte, e a interface ListSelectionListener.
Por exemplo:

class ListFrame extends JFrame implements ListSelectionListener {


public ListFrame() {
...
JList wordList = new JList(words);
wordlist.addListSelectionListener(this);
}
public void valueChanged(ListSelectionEvent evt) {
JList source = (JList)evt.getSource();
Object[] values = source.getSelectedValues();
String text=;
for (int i=0; i<values.length; i++)
text += (String)values[i] + ;
}
}

Java bsico 2

31

Figura 16 Exemplo jList.

Combos
uma lista que fica escondida, e quando o usurio clica no campo, a lista se abre. Se a caixa
estiver configurada para ser editvel, pode-se editar a seleo como se fosse uma caixa de
texto.
style = new JComboBox();
style.setEditable(true);
style.addItem(Serif);
style.addItem(SansSerif);
...

Esse mtodo (addItem) adiciona a string no final da lista., pode-se tambm inserir em
qualquer lugar:
style.insertItemAt(Monospaced, 0);
Para remover itens usa-se:

style.removeItem(Monospaced);
style.removeItemAt(0);
// remove o primeiro item
style.removeAllItems();
Para tratar dos eventos, captura-se um evento de ao, logo, tratando-se o mtodo
actionPerformed:
public void actionPerformed(ActionEvent evt) {
JComboBox source (JComboBox)evt.getSource();
String item = (String)source.getSelectedItem();
panel.setStyle(item);
}

32

Java bsico 2

Figura 17 Exemplo jList.

Sesso 02 GUI em Java


Exerccios de Fixao 2 GUI em Java
Liste os recursos que o pacote swing do java disponibiliza para desenvolvimento de
interfaces grficas que voc aprendeu at o momento.

Atividade 1 GUI em Java


1.

2.
3.

Escreva uma aplicao Swing Java com uma interface que tenha duas caixas de listas
JList, do mesmo tamanho, uma ao lado da outra, denominadas lista 01 (a esquerda) e
lista 02 (a direita). Implemente uma entrada de texto (JTextField) que permitir a
digitao de palavras que sero adicionadas apenas lista 01. Por meio de botes
JButton deve ser possvel: mover os itens selecionados da lista 01 para a lista 02; mover
todos os itens da lista 01 para a lista 02; mover os itens selecionados da lista 02 para a
lista 01; e mover todos os itens da lista 02 para lista 01. Por fim, implemente um boto
que possibilidade remover os itens selecionados de cada uma das listas (um boto para
cada lista).

Escreva uma aplicao Swing Java com uma interface que permita a seleo
(JComboBox) de uma entre 5 opes de cores que sero utilizadas para preencher a cor
de fundo do JFrame onde a caixa de seleo foi disponibilizada.
Escreva uma janela JDialog que exiba uma pergunta (em um rtulo JLabel) e cinco
alternativas de resposta (usando botes de opes de JRadioButton). A pergunta e suas
alternativas devem ser especificadas por mtodos prprios, bem como a resposta
correta. Apenas uma alternativa poder ser selecionada. Por meio de um boto JButton, a
aplicao dever avaliar se a resposta est ou no correta, impedindo a partir de seu

Java bsico 2

33

4.

acionamento a alterao da resposta. Como opo ajustvel, a janela deve exibir uma
mensagem de dilogo (com JOptionPane) com a indicao de acerto ou erro.

Escreva uma aplicao Swing Java que implemente uma sequncia de questes a serem
apresentadas pela janela implementada no exerccio 3. Esta aplicao dever calcular e
escrever uma mensagem (JOptionPane) com o total de acertos e erros obtidos.

Atividade 2 GUI em Java (complementar)


1.

Escreva uma aplicao Swing Java que implemente implemente uma interface onde o
usurio dever informar seu usurio (JTextField) e senha (JPasswordField) e, ao clicar
no boto de acesso (JButton), seja feita uma verificao um array com a lista de usurios
e senhas que tenham acesso ao sistema. A mensagem ACESSO PERMITIDO dever ser
exibida caso seja encontrado um usurio com a senha informada. Exiba a mensagem
ACESSO NEGADO caso no seja encontrado o usurio e senha informados no array de
usurios.

Menus
No necessrio um gerenciador de layout para se colocar um menu numa janela. Sua
elaborao direta:
JMenuBar menuBar = new JMenuBar();

Uma barra de menu pode ser colocada onde se queira, mas normalmente aparece na parte
superior do frame. Usa-se:
frame.setJMenuBar(menuBar);

Para cada menu cria-se um objeto menu:

JMenu editMenu = new JMenu(Edit);


Ento se adicionam os itens, separadores e submenus:

JMenuItem pasteItem = new JMenuItem(Paste);


editMenu.add(pasteItem);
editMenu.addSeparator();
...
Tambm se adiciona menus de nvel mais alto barra de menus:
menuBar.addMenu(editMenu);

Quando o usurio seleciona um menu ocorre um evento de ao. necessrio instalar um


ouvinte de evento de ao para cada item do menu:
pasteItem.addActionListener(this);

A gerao desse cdigo todo um tanto quanto trabalhosa, por exemplo:


JMenu menu = new JMenu(Edit);
item = new JMenuItem(Cut);

34

Java bsico 2

item.addActionListener(this);
menu.add(item);
item = new JMenuItem(Copy);
item.addActionListener(this);
menu.add(item);
item = new JMenuItem(Paste);
item.addActionListener(this);
menu.add(item);
menuBar.add(menu);
Para responder a eventos de menu usa-se actionPerformed:
public void actionPerformed(ActionEvent evt) {
if (evt.getSource() instanceof JmenuItem) {
String arg = evt.getActionCommand();
if (arg.equals(Open)) ...
else if (arg.equals(Save)) ...
...
}
}

As teclas de atalho podem ser especificadas no construtor dos itens de menu:


JMenuItem cutItem = new JMenuItem(Cut, T);

Para teclas de atalho para o menu principal, deve-se usar o seguinte:


JMenu helpMenu = new JMenu(Help);
HelpMenu.setMnemonic(H);

Para acessar as teclas de atalho usa-se ALT+ letra.

Quando se quer teclas de atalho, do tipo CTRL+S para salvar, isto , para que itens de menu
sejam chamados, sem sequer abrir o menu onde esto, ento usa-se setAccelerator.

openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
InputEvent.CTRL_MASK));
Para inserir cones nos itens de menu, usa-se o seguinte construtor:

JMenuItem cutItem = new JMenuItem(Cut, new ImageIcon(cut.gif));


Para criar itens de menu usando botes de rdio e check boxes, usa-se outros objetos:

JCheckBoxMenuItem readOnlyItem = new JCheckBoxMenuItem(Read-only);


OptionsMenu.add(readOnlyItem);
Os itens de menu em forma de botes de rdio funcionam exatamente como controles
comuns, isto , deve-se criar um grupo para eles, para possuam o efeito esperado:

ButtonGroup group = new ButtonGroup();


JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem(Insert);
Java bsico 2

35

insertItem.setSelected(true);
JRadioButtonMenuItem overtypeItem = new
JRadioButtonMenuItem(Overtype);
group.add(insertItem);
group.add(overtypeItem);
optionsMenu.add(insertItem);
optionsMenu.add(overtypeItem);
Menus flutuantes so facilmente implementados tambm:
JPopupMenu popup = new JPopupMenu();
Os itens so adicionados da forma usual:

JMenuItem item = new JMenuItem(Cut);


item.addActionListener(this);
popup.add(item);
Para abrir explicitamente um menu flutuante usa-se o mtodo show.

popup.show(painel, x, y);

Onde painel o controle que ser pai no menu, x e y a localizao.

Os menus flutuantes normalmente esto associados ao pressionamento de um boto


particular do mouse, como no Windows. Para que isso acontea, deve-se:
public void mouseReleased(MouseEvent evt) {
if (evt.isPopupTrigger())
popup.show(evt.getComponent(), evt.getX(), evt.getY());
}
Para habilitar e desabilitar itens de menu, pode-se usar:
saveItem.setEnabled(false);

Mas isso pode levar o cdigo a ficar cheio de instrues lidando com os menus. Ento podese usar um tratador de eventos de menu. Existe o MenuListener, com trs mtodos:

void menuSelected(MenuEvent evt); // chamado antes do menu ser


exibido
void menuDeselected(MenuEvent evt);// depois que o menu removido da
tela
void menuCanceled(MenuEvent evt); // qdo a seleo cancelada

36

Java bsico 2

Figura 18 Exemplo jList.

Caixas de Dilogo
So janelas pr-definidas que so usadas para informao para o usurio. Existem dois tipos:
modais que quando aparecem, o usurio no pode fazer mais nada antes de fech-la e as no
modais que o usurio pode continuar o que est fazendo.
Algumas janelas pr-definidas so:

JOptionPane.showMessageDialog : Exibe uma mensagem e espera o usurio clicar


OK;
JOptionPane.showConfirmDialog : Exibe uma mensagem e obtm confirmao
(OK/Cancelar);

JOptionPane.showOptionDialog : Exibe uma mensagem e obtm uma opo do


usurio dentre vrias;

JOptionPane.showInputDialog : Exibe uma mensagem e obtm uma linha digitada


pelo usurio.

Para se criar uma janela de dilogo prpria, como a janela sobre, deve-se derivar uma classe
de JDialog.

Figura 18 Exemplo JOptionPane.


Java bsico 2

37

Ordem de Travessia: Tab Order


Quando uma janela possui muitos componentes, deve-se pensar na ordem de travessia
desses componentes, isto , a ordem na qual os componentes perdem e ganham o foco
enquanto o usurio pressiona TAB.

O Swing tenta percorrer esses elementos de uma forma coerente, de cima para baixo, da
esquerda para direita, pulando os rtulos. No Swing, a ordem de insero dos elementos no
influencia no tab order, mas sim o layout usado.
O problema ocorre quando um continer contiver outros contineres e assim por diante.
Quando o foco vai para outro continer, automaticamente ele colocado no componente
mais acima e mais esquerda desse continer, para depois percorrer os outros
componentes.
Para alterar essa ordem pode-se usar duas formas. A primeira chamando:
okButton.requestFocus();

Mas s funciona como resposta a um dado evento, isto , no tem efeito permanente na
ordem de travessia.
A segunda explicitamente mudar a ordem de travessia, chamando:
style.setNextFocusableComponent(size);

Que faz com que o prximo componente a receber o foco, depois do style seja o size.

Sesso 03 GUI em Java


Exerccios de Fixao 3 GUI em Java
O que so componentes e o que so os event listeners?

Atividade 1 GUI em Java


1.

38

Construa uma aplicao que permita efetuar um teste de cor, por meio de trs controles
deslizantes JSlider, onde o usurio poder ajustar uma cor por meio de seus
componentes RGB expressos com valores inteiros entre 0 e 255. A cor a ser ajustada
deve ser visualizada por meio de um JPanel sem contedo.

Java bsico 2

2.

Escreva uma aplicao Swing Java que permita a construo de uma rvore com o
componente JTree. Uma caixa de texto JTextField deve fornecer os valores para os ns da
rvore. O primeiro n adicionado constituir sua raiz. A partir da, os novos ns devero
ser adicionados como filhos do n que esteja selecionado na rvore no momento da nova
insero. A insero de um novo n ser feita por meio do clique num boto JButton.
Implemente tambm um boto para remover um n que esteja selecionado. A excluso
dever excluir todos os ns filhos pertencentes ao n selecionado quando do clique no
boto de excluso.

Atividade 2 GUI em Java (complementar)


3.

Construa uma aplicao Java que permita a seleo (JFileChooser) e visualizao de uma
imagem em formato GIF, JPG ou PNG. A seleo do arquivo e o encerramento da
aplicao devem constituir opes de um menu suspenso (JMenu) denominado arquivo
e uma barra de menus (JMenuBar).

Java bsico 2

39

2
Applets sesso 4
Exerccio de nivelamento Applets
Voc j desenvolveu aplicaes para internet? Que recurso e/ou linguagem de programao
voc j utilizou para desenvolvimento?

Applets Java
Tipo especial de programa Java

Browser com suporte a tecnologia Java


Podem ser baixado pela internet

Normalmente embutido numa pgina web, executado no contexto do browser


subclasse

java.applet.Applet ou javax.swing.JApplet

Applet ou JApplet fornece a interface padro


Entre o applet e blowser

Os Applets so aplicaes java que utilizam recursos da mquina virtual java dentro de
navegadores web com algumas limitaes de segurana.

Um applet um programa em Java que executado em um browser. Um applet pode ser uma
aplicao Java totalmente funcional, pois tem toda a API Java sua disposio.
Existem algumas diferenas importantes entre um applet e uma aplicao Java standalone,
incluindo o seguinte:
Um applet uma classe Java que estende a classe java.applet.Applet.

Um mtodo main () no chamado em um applet, e uma classe do applet no vai definir


main ().

40

Java bsico 2

Applets so projetados para ser incorporado em uma pgina HTML.

Quando um usurio visualiza uma pgina HTML que contm um applet, o cdigo do
applet baixado para a mquina do usurio.

A JVM necessrio para visualizar um applet. A JVM pode ser um plug-in do navegador da
Web ou um ambiente de tempo de execuo separado.
A JVM na mquina do usurio cria uma instncia da classe do applet e invoca vrios
mtodos durante a vida do applet.

Applets tm regras rgidas de segurana que so aplicadas pelo browser. A segurana de


um applet muitas vezes referida como rea de segurana, comparando o applet para
uma criana brincando em uma sandbox com vrias regras que devem ser seguidas.
Outras classes que as necessidades de applets podem ser baixados em um nico arquivo
Java Archive (JAR).

Ciclo de Vida de um Applet


Quatro mtodos da classe Applet disponibilizam o framework necessrio a partir do qual
podemos construir programas java que executado em um browser. So eles:

init(): Este mtodo destina-se a qualquer inicializao necessrio para o seu applet. Ele
chamado aps as tags PARAM dentro da tag do APPLET foram processadas.

star(): Este mtodo chamado automaticamente aps o navegador chama o mtodo init.
Ele tambm chamado sempre que o usurio retorna para a pgina que contm o applet
depois de ter ido para outras pginas.
stop(): Este mtodo chamado automaticamente quando o usurio navega para uma
pgina em que o applet no foi referenciado.

destroy(): Este mtodo s chamado quando o browser for fechado normalmente.


Applets so feitos para serem executados em uma pgina HTML, sendo que os recursos
alocados para a sua execuo, sero removidos pelo garbage colector aps a sinalizao
do mtodo destroy(), chamado quando a instncia do browser que estiver executando a
pgina HTML que contm um applet for fechada.

paint(): Invocado imediatamente aps o mtodo start(), e tambm a qualquer momento


o applet precisa se redesenhar no prprio navegador. O mtodo do paint() herdado do
java.awt.

Antes de Java, voc usava HTML (a linguagem de marcao de hipertexto) para descrever o
layout de uma pgina da Web. A HTML simplesmente um veculo para indicar elementos de
uma pgina de hipertexto. Por exemplo, <TITLE> indica o ttulo da pgina e todo texto aps
essa tag se torna o ttulo da pgina. Voc indica o final do ttulo com a tag </TITLE>.
Java bsico 2

41

Um primeiro exemplo de Applet


A seguir apresentamos um cdigo java simples que implementa um Applet que ir escrever a
mensagem Primeiro exemplo de Applet Java no browser quando a pgina html que ele
estiver inserido for acessada.
import java.applet.*;
import java.awt.*;
public class HelloWorldApplet extends Applet
{
public void paint (Graphics g)
{
g.drawString ("Primeiro exemplo de Applet Java ", 25, 50);
}
}

Estas declaraes de importao trazer as classes no mbito da nossa classe applet:


java.applet.Applet;
java.awt.Graphics.

Sem essas declaraes de importao, o compilador Java no reconheceria a classe Applet,


bem como os objetos visuais grficos, que a classe do applet se refere.

A classe Applet
Cada applet uma extenso da classe java.applet.Applet ou da classe
javax.swing.applet.JApplet. A classe Applet base fornece mtodos que uma classe Applet
derivada pode chamar para obter informaes e servios a partir do contexto browser. Estes
incluem mtodos que fazem o seguinte:
Obter parmetros de applet

Obter a localizao de rede do arquivo HTML que contm o applet


Obter a localizao de rede do diretrio da classe do applet
Imprimir uma mensagem de status no navegador
Buscar uma imagem

Buscar um clipe de udio

Reproduzir um clipe de udio


Redimensionar o applet

42

Java bsico 2

Alm disso, a classe Applet fornece uma interface pela qual o usurio ou o navegador obtm
informaes sobre o applet e controla sua execuo. O usurio poder:
pedido de informao sobre o autor, a verso eo copyright do applet
solicitar uma descrio dos parmetros do applet reconhece
inicializar o applet
destruir o applet

iniciar a execuo do applet

interromper a execuo do applet

A classe Applet fornece implementaes padro de cada um desses mtodos. Estas


implementaes podem ser substitudas quando necessrio.

O applet apresentado no item 2.2 est completo, tal como est. O nico mtodo substitudo
o mtodo de pintura paint().

Invocando um Applet no browser

Um applet pode ser invocada por directivas de incluso em um arquivo HTML e visualizar o
arquivo atravs de um visualizador de applets ou navegador habilitado para Java.

A tag <applet> a base para a incorporao de um applet em um arquivo HTML. Abaixo est
um exemplo que chama do applet implementado no item 2.2 no arquivo fonte
Exemplo01.java:
<html>
<title>The Hello, World Applet</title>
<hr>
<applet code="Exemplo01.class" width="320" height="120">
</applet>
<hr>
</html>

necessrio o atributo cdigo do tag <applet>. Ele especifica a classe Applet para ser
executado. Tambm so necessrios largura e altura para especificar o tamanho inicial do
painel em que um applet executado. A directiva applet deve ser fechado com a tag
</applet>.

Se um applet usa parmetros, os valores podem ser passados para os parmetros


adicionando marcas <param> entre <applet> e </ applet>. O browser ignora texto e outras
marcas entre as tags applet.
Java bsico 2

43

Navegadores no-habilitados para Java no processam <applet> e </applet>. Portanto,


qualquer coisa que aparece entre as tags, no relacionada com o applet, visvel em
navegadores no-habilitados para Java.

O usurio ou o navegador procura o cdigo Java compilado no local do documento. Para


especificar caso contrrio, use o atributo codebase da tag <applet> como mostrado:
<applet codebase="http://amrood.com/applets"
code="HelloWorldApplet.class" width="320" height="120">

Se um applet for implementado em um pacote diferente do padro, o cominho para este


pacote dever ser especificado no atributo de cdigo usando o caractere ponto (.) para
separar os componentes do pacote / classe. Por exemplo:
<applet code="mypackage.subpackage.TestApplet.class"
width="320" height="120">

A ideia bsica de como usar applets em uma pgina Web simples: a pgina HTML deve
dizer ao navegador quais applets deve carregar e, ento, onde colocar cada applet na pgina
da Web. Como se poderia esperar, a tag necessria para usar um applet deve dizer ao
navegador o seguinte:
De onde obter os arquivos de classe;

Como o applet se situa na pgina da Web (tamanho, localizao etc.).

A exibio de um applet em uma pgina HTML pode ser feita com o uso da tag e APPLET e
pela tag OBJECT.

<applet code="Exemplo1.class" width="800px" height="600px">


<param name="message" value="Exemplo de Applet Java!!!" />
</applet>
<object codetype="application/java" classid="java: Exemplo1.class"
width="800px" height="600px">
<param name="message" value="Exemplo de Applet Java!!!" />
</object>

A maneira original de incorporar um applet Java era atravs de uma tag APPLET com
parmetros que forneciam as informaes listadas anteriormente. O W3 Consortium sugeriu
trocar para a tag OBJECT, mais verstil, e a antiga tag APPLET foi desaprovada na
especificao HTML 4.0. Os navegadores mais recentes reconhecero as duas tags, mas voc
deve lembrar que os navegadores mais antigos no reconhecero.
Utilizaremos estas tags sempre que quisermos que o navegador recupere os arquivos de
classe da Internet (ou de um diretrio na mquina do usurio) e executa o applet
automaticamente, usando sua mquina virtual Java.

Alm do applet em si, a pgina da Web pode conter todos os outros elementos HTML que
voc viu em uso nas pginas da Web: mltiplas fontes, listas com bullets, elementos grficos,
links etc. Os applets so apenas uma parte da pgina de hipertexto. sempre interessante
lembrar que a linguagem de programao Java no uma ferramenta para projetar pginas
44

Java bsico 2

HTML; ela uma ferramenta para dar vida a elas. Isso no quer dizer que os elementos de
projeto de GUI em um applet Java no so importante, mas que eles devem trabalhar com (e,
na verdade, so subservientes a) o projeto HTML subjacente da pgina da Web.

Obtendo parmetros no Applet

O exemplo abaixo demonstra como fazer um applet responder aos parmetros adicionais
especificados no documento. Este applet exibe uma mensagem dizendo de um nmero
recebido como parmetro durante a carga do applet na pgina html e par ou impar.

VerificarParImparApplet obtm seus parmetros no mtodo init(). Ele tambm pode ter seus
parmetros no mtodo paint(). No entanto, obter os valores e salvar as configuraes de uma
vez no incio do applet, em vez de a cada atualizao, conveniente e eficiente.
O Applet Viewer ou o navegador chama o mtodo init() de cada applet que executado. O
usurio chama init() uma vez ao carregar a pgina html.

O mtodo Applet.getParameter () obtm um parmetro dado o nome do parmetro (o valor


de um parmetro sempre uma string). Se o valor for numrico ou outros dados nocaracteres, a sequncia deve ser analisada e convertida atravs de classes Wrappers, por
exemplo.
package visao;
import java.awt.BorderLayout;
import javax.swing.JApplet;
import javax.swing.JLabel;
/**
*
* @author Paulo Henrique Cayres
*/
public class VerificarParImparApplet extends JApplet {
//Executado quando o applet for carregado no browser.
@Override
public void init() {
setSize(250, 100);
JLabel lbl = new JLabel("Exemplo com passagem de
parmetros",JLabel.CENTER);
setLayout(new BorderLayout());
add(lbl,BorderLayout.CENTER);
int num = Integer.parseInt(getParameter("numero"));
Java bsico 2

45

if(num%2 == 0)
javax.swing.JOptionPane.showMessageDialog(rootPane, num+"
um nmero
par!","Mensagem",javax.swing.JOptionPane.INFORMATION_MESSAGE);
else
javax.swing.JOptionPane.showMessageDialog(rootPane, num+"
um nmero
par!","Mensagem",javax.swing.JOptionPane.INFORMATION_MESSAGE);
}
}
Neste exemplo, o applet chama getParameter() informando qual o nome do parmetro
definido na tag <PARAM> presente na chamada <APPLET> na pgina html. O mtodo
Integer.parseInt (Classe Wrapper), converte uma string e retorna um inteiro.

Na sequncia o applet realiza um teste de condio e chama o mtodo showMessageDialog()


de javax.swing.JOptionPane para exibir uma mensagem informando se o nmero e par ou
impar. Note que estamos utilizando os mesmos componentes visuais grficos utilizados para
desenvolver aplicativos desktop em Java.

Passando parmetros para o Applet

O exemplo abaixo apresenta um arquivo HTML com o applet


VerificarParImparApplet incorporado. O arquivo HTML especifica o parmetro para
o applet por meio da marcao <PARAM>.
<HTML>
<HEAD>
<TITLE>Applet HTML Page</TITLE>
</HEAD>
<BODY>

<APPLET codebase="classes" code="visao/VerificarParImparApplet.class"


width=350 height=200>
<PARAM name="numero" value="10">
</APPLET>
</BODY>
</HTML>
Os parmetros especificados numa pgina html sero repassados ao applet que podero
trata-los para executar alguma funcionalidade desejada. Durante a escrita do cdigo java no
applet, o programador dever se preocupar com a converso dos parmetros, que so
Strings, para o tipo necessrio para utilizao desta informao.

46

Java bsico 2

Applets Java versus Aplicativos


Java possibilita a criao de dois grandes tipos de programas: um applet ou um aplicativo,
sendo que uma applet java um programa que roda a partir de um browser web e um
aplicativo java, por sua vez, um programa independente do browser que roda como um
programa isolado.

Uma vez que um applet executado a partir de um browser Web, ela tem a vantagem de j
ter uma janela e a capacidade de responder aos eventos da interface com o usurio, por meio
do browser. Tambm pelo fato de as applets serem projetadas para uso em redes, Java
muito mais restritivo nos tipos de acesso que as applets podero ter no seu sistema de
arquivos do que com os aplicativos que no esto necessariamente rodando em rede.

Converso de aplicao em Applet:

fcil converter um aplicativo Java grfica (isto , um aplicativo que usa o AWT ou SWING e
que voc pode comear com o lanador de programa java) em um applet que voc pode
inserir em uma pgina web.
Aqui esto os passos necessrios para a converso de um aplicativo para um applet:

Faa uma pgina HTML com a tag <APPLET></APPLET> apropriada para carregar o
cdigo do applet.
Fornecer uma subclasse da classe JApplet. Esta subclasse deve ser declarada como
pblica. Caso contrrio, o applet no pode ser carregado.

Eliminar o mtodo principal na aplicao. No construa um Frame para a aplicao. A sua


aplicao ser exibida dentro do navegador.

Mova qualquer cdigo de inicializao do construtor para o mtodo init() do applet. Voc
no precisa construir explicitamente uma instncia do objeto para o navegador. O applet
ir instancia-lo para voc por meio de uma chamada ao mtodo init(), quando voc
solicitar o carregamento de uma pgina HTML que tenha referncia a tag <APPLET>.
Retire a chamada para setSize(). O dimensionamento dos applets feito com a
especificao da largura e altura como parmetros da tag <APPLET> no arquivo HTML.

Retire a chamada para setDefaultCloseOperation(). Um applet no pode ser fechado. Sua


execuo termina quando o usurio navega para uma prxima pgina ou fecha o
navegador.

Eliminar a chamada para o mtodo setTitle(). Applets no pode ter barras de ttulo. Voc
pode, claro, utilizar o ttulo da prpria pgina web, usando o ttulo de tag HTML.

No chame setVisible(true). O applet exibido automaticamente durante a carregamento


da pgina HTML.

Java bsico 2

47

Manipulao de eventos no Applet


Applets herdam um grupo de mtodos da classe Container de manipulao de eventos. A
classe Container define vrios mtodos, tais como processKeyEvent processMouseEvent e,
para o tratamento de tipos particulares de acontecimentos, e, em seguida, um mtodo
chamado processEvent todos catch.

Para possibilitar controle de eventos, um applet deve implementar a classe de interface


especfica do evento apropriado e reescrev-lo para atender a especificidade da aplicao em
desenvolvimento.
O cdigo abaixo implementa a interface MouseListener para controlar eventos do mouse no
applet implementado:
package visao;
import
import
import
import

java.awt.Graphics;
java.awt.event.MouseEvent;
java.awt.event.MouseListener;
javax.swing.JApplet;

/**
*
* @author Paulo Henrique Cayres
*/
public class ExemploControleEventoMouseApplet extends JApplet
implements MouseListener {
StringBuffer strBuffer;
public void init() {
addMouseListener(this);
strBuffer = new StringBuffer();
addItem("initializing the apple ");
}
public void start() {
addItem("starting the applet ");
}
public void stop() {
addItem("stopping the applet ");
}
public void destroy() {
48

Java bsico 2

addItem("unloading the applet");

void addItem(String word) {


System.out.println(word);
strBuffer.append(word);
repaint();
}
public void paint(Graphics g) {
//Draw a Rectangle around the applet's display area.
g.drawRect(0, 0,
getWidth() - 1,
getHeight() - 1);
//display the string inside the rectangle.
g.drawString(strBuffer.toString(), 10, 20);
}
@Override
public void mouseClicked(MouseEvent e) {
addItem("mouse clicked! ");
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
addItem("mouse entered! ");
}
@Override
public void mouseExited(MouseEvent e) {
addItem("mouse exited! ");
}
}
Java bsico 2

49

Exibindo imagens no Applet


Um applet pode exibir imagens no formato GIF, JPEG, BMP, e outros. Para exibir uma imagem
dentro do applet, voc usa o mtodo drawImage () encontrado na classe java.awt.Graphics. O
exemplo abaixo implementa um applet com todos os passos necessrios para visualizar
imagens:
package visao;
import
import
import
import
import
import

java.applet.AppletContext;
java.awt.Graphics;
java.awt.Image;
java.net.MalformedURLException;
java.net.URL;
javax.swing.JApplet;

/**
*
* @author Paulo Henrique Cayres
*/
public class ExemploImgApplet extends JApplet {
private Image image;
private AppletContext context;
public void init()
{

50

context = this.getAppletContext();
String imageURL = this.getParameter("image");
if(imageURL == null)
{
imageURL = "alert.gif";
}
try
{
URL url = new URL(this.getDocumentBase(), imageURL);
System.out.println(url);
image = context.getImage(url);
}catch(MalformedURLException e)
{
e.printStackTrace();
// Display in browser status bar
context.showStatus("Could not load image!");
}

Java bsico 2

public void paint(Graphics g)


{
context.showStatus("Displaying image");
g.drawImage(image, this.getWidth()/2, this.getHeight()/2, 33,
34, null);
repaint();
}
}

Reproduo de udio no Applet


Um applet pode reproduzir um arquivo de udio representado pela interface AudioClip no
pacote java.applet. A interface AudioClip tem trs mtodos, incluindo:
public void play(): Reproduz o clipe de udio uma vez, desde o incio.

public void loop(): Faz com que o clipe de udio seja reproduzido continuamente.
public void stop(): Para a reproduo do clipe de udio.

Para obter um objeto AudioClip, voc deve chamar o mtodo da classe Applet getAudioClip
(). O mtodo getAudioClip () retorna imediatamente, ou no resolve o URL para um arquivo
de udio real. O arquivo de udio no baixado at que seja feita uma tentativa de
reproduzir o clipe de udio.

O mecanismo de som que reproduz os clipes de udio suporta vrios formatos de arquivo de
udio, incluindo:
formato de arquivo Sun Audio (.au)
Windows wave (.wav)

Macintosh AIFF (.aif ou .AIFF)

Musical Instrument Digital Interface MIDI (.mid ou .rmi)

Segue-se o exemplo mostrando todos os passos para ter um udio:

package visao;
import
import
import
import
import

java.applet.AppletContext;
java.applet.AudioClip;
java.net.MalformedURLException;
java.net.URL;
javax.swing.JApplet;

/**
*
Java bsico 2

51

* @author Paulo Henrique Cayres


*/
public class ExemploAudioApplet extends JApplet {
private AudioClip clip;
private AppletContext context;
public void init()
{
context = this.getAppletContext();
String audioURL = this.getParameter("audio");
if(audioURL == null)
{
audioURL = "teste.wav";
}
try
{
URL url = new URL(this.getDocumentBase(), audioURL);
clip = context.getAudioClip(url);
}catch(MalformedURLException e)
{
e.printStackTrace();
context.showStatus("Could not load audio file!");
}
}
public void start()
{
if(clip != null)
{
clip.loop();
}
}

public void stop()


{
if(clip != null)
{
clip.stop();
}
}

Exerccios de Fixao 4 Applets


Qual a diferena entre lanar uma exceo e capturar uma exceo?
52

Java bsico 2

Atividade 1 Applets
1.
2.

3.

Faa uma aplicao Java Applet que recebe como parmetro de inicializao da pgina
HTML um nmero inteiro, calcule e escreva num JTextArea o resulta da tabuada do
nmero informado.

Faa uma aplicao Java Applet que possibilite a digitao de 3 nmeros (JTextField) e
que mostre em uma mensagem (JOptionPane) com o maior nmeros. A mensagem ser
exibida quando o usurio clicar no boto (JButton) Mensagem. Aps a visualizao da
mensagem os campos de entrada de dados devero ser limpos e o primeiro campo de
entrada de dados dever receber o foco.
Utilizando o exemplo de definio de classes em Java, crie a classe de aplicao Pessoa
descrita abaixo. Os mtodos seletores e modificadores devero ser criados para cada um
de seus atributos.
Pessoa
String nome
int idade
Pessoa()
Pessoa(String, idade)

4.

Construa uma Applet que apresente uma tela com campos de entrada de dados
(JTextField) para cada um dos atributos da classe Pessoa.

6.

Implemente na interface do exerccio 3 um JTextArea onde sero listados os objetos em


ordem alfabtica. A ordenao ser executada aps clique num boto.

5.

Implemente na interface do exerccio 3 botes de ao (JButton) para possibilitar


incluso, consulta e excluso de objetos instanciados da classe Pessoa em um ArrayList.
A excluso ser realizada por meio do nome da Pessoa.

Java bsico 2

53

Atividade 2 GUI em Java (complementar)


1.

Construa um Applet Java que apresente uma tela com uma campo de entrada de dados

(JTextField) para que o usurio possa informar um nmero inteiro. O Applet dever
implementa um boto (JButton) que, quando clicado, informe se o nmero digitado par

2.

54

ou impar.

Construa um Applet Java que recebe um nmero inteiro positivo como parmetro da
pgina html e calcule e escreva a tabuada deste nmero dentro de um JTextArea.

Java bsico 2

Java bsico 2

55

3
Tratamento de Erros sesso 5
Exerccio de nivelamento Tratamento de erros
Voc j desenvolveu alguma aplicao que utilizou tratamento de erros? Em que linguagem?

Tratamento de Erros
Detectar e tratar erros ou falhas

Durante a execuo de mtodos


Erro de lgica

Uso inadequado da API

Uso de classes especializadas

No compromete a inteligibilidade do cdigo


Implementado por meio de interfaces

Os erros em Java so tratados como em C++, atravs de excees. Em Java, todas as excees
descendem de Throwable, mas a hierarquia se divide em Error e Exception.
Os erros da classe Error descrevem erros internos e de exausto de recursos. Pouco se
pode fazer numa situao dessas, alm de informar ao usurio e deixar o programa de forma
segura. Essas situaes so raras.
Ao programar em Java, deve-se focalizar a hierarquia Exception. Esta tambm se divide
em excees que derivam de RuntimeException e as que no. A regra geral a seguinte:

Uma RuntimeError ocorre porque houve um erro de programao. Qualquer outra


exceo ocorre devido a algo errado, como erro de I/O que tenha ocorrido no programa.

As excees que derivam da RuntimeError


56

Java bsico 2

incluem problemas como:

Converso explcita de tipo (cast);

Acesso a elemento de array alm dos limites;


Acesso de ponteiro nulo.

As excees que no derivam do RuntimeError incluem:


Tentar ler alm do final de um arquivo;
Tentar abrir uma URL incorreta;

Tentar encontrar um objeto Class atravs de uma string que no denota uma classe
existente.

Figura 19 Hierarquia de excees.

Descrever Excees em Mtodos


Para que um mtodo possa gerar uma exceo tratvel pelo usurio, deve-se descrever quais
ele pode levantar. Isto , alem das informaes que um mtodo pode retornar, tambm se
informa o que pode dar errado.
Essa informao das excees feita no cabealho dos mtodos, por exemplo:

public String readLine() throws IOException

Se dentro do mtodo readLine ocorrer uma exceo IOException, essa poder


facilmente ser tratada no mtodo que chamou essa funo. Mas no h necessidade de se
tratar todo e qualquer tipo de exceo. Basta ter em mente as ocasies em que uma exceo
levantada:
Na chamada de um mtodo que lana (throws) uma exceo;
Se um erro for detectado e for lanada uma exceo (throw);

Java bsico 2

57

Num erro de programao;


Num erro interno do Java.

Se ocorrer um dos dois primeiros casos, ento o programador dever informar a quem usar o
mtodo que ele levanta uma exceo. Caso contrrio, se no tiver nenhum mecanismo para
tratar essas excees, o programa termina a execuo.
class Animation {
...
public Image loadImage(String s) throws IOException {
...
}
}
Se o mtodo pode lanar mais de uma exceo, separa-se por vrgula:

class Animation {
...
public Image loadImage(String s) throws EOFException,
MalFormedURLException {
...
}
}
No se deve anunciar (throws) erros internos do Java (derivadas de Error) nem erros em
tempo de execuo (RuntimeException), porque esto fora do alcance do programador.
Essas excees so chamadas no verificadas (unchecked).
As excees no verificadas no podem ser tratadas, e devem ser evitadas no programa,
atravs de verificaes. Um mtodo precisa declarar todas as excees verificadas que ele
pode levantar.

Levantar uma Exceo


Para um mtodo levantar uma exceo, usado o comando throw. S se pode levantar uma
exceo se ela foi declarada no cabealho do mtodo (ou uma superclasse). Exemplo:
throw new EOFException();
Ou, se preferir:

EOFException e = new EOFException();


throw e;
E para juntar tudo que foi visto nesta sesso:

String lerDados(BufferedReader ent) throws EOFException {


...
while (...) {

58

Java bsico 2

if (ch == -1)
// encontrou EOF
throw new EOFException();

A EOFException tambm tem um outro construtor, que recebe uma string, que serve para
descrever a condio do erro mais detalhadamente. Exemplo:
throw new EOFException(Contedo completo recebido.);

Criar Novas Excees


Para criar uma nova classe de exceo basta criar a classe e deriv-la de Exception ou de
qualquer uma de suas descendentes.
class ExecucaoTamanhoArquivo extends IOException {
public ExecucaoTamanhoArquivo() { }
public ExecucaoTamanhoArquivo(String str) {
super(str);
}
}
Agora pode-se us-la normalmente nos programas:

String lerDados(BufferedReader ent) throws ExecucaoTamanhoArquivo {


...
while (...) {
if (ch == -1)
// encontrou EOF
throw new ExecucaoTamanhoArquivo();
}
}

Capturando Excees
Para capturar excees usa-se um bloco try...cath, com a seguinte construo:
try {
<Cdigo que pode gerar erro>
}
catch(TipoExceo_1 e) {
<Manipulador da exceo tipo 1>
}
...
catch(TipoExceo_n e) {
<Manipulador da exceo tipo n>
}
finally {
<Cdigo finalizador>
Java bsico 2

59

}
Dentro do trecho try coloca-se o cdigo que ser executado e verificado por um
determinado erro. Se uma exceo ocorrer, ela ser de um determinado tipo, e conforme o
tipo, a execuo ser desviada para um trecho catch que trata esse tipo de exceo. Pode-se
ter um ou mais trechos catch, conforme a necessidade.

O trecho finally usado quando se deseja, por exemplo, liberar um recurso reservado por
um cdigo que gerou exceo. O trecho de cdigo que estiver a dentro sempre ser
executado, seja uma exceo tratada (catch) ou no. A clusula finally pode ser usada
mesmo sem o catch, assim, se uma exceo foi levantada, o trecho finally executado e
a exceo relevantada.
Graphics g = image.getGraphics();
try {
// cdigo que pode gerar erros
}
catch(IOException e) {
// tratamento de erros
}
finally {
// libera recursos, mesmo se nenhuma exceo for levantada
g.dispose();
}

Exerccios de Fixao 5 Tratamento de Erros


Qual a diferena entre lanar uma exceo e capturar uma exceo?

Atividade 1 GUI em Java


1.
2.

60

Faa uma classe executvel que receba por meio da linha de comando do programa
(prompt) dois nmeros e um operador aritmtico ( + , - , x , / ), informe o resultado da
operao. Ateno: no possvel diviso por zero. Ento, lance uma exceo caso isso
ocorra.

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. Ateno: Se no
informado, assuma o valor 7. Ento, utilize a clusula finally em sua soluo.

Java bsico 2

3.

Crie uma classe de exceo que implemente o mtodo toString() e retorne a mensagem
Impossvel converter. Favor informar apenas dgitos na entrada de dados

5.

Faa uma aplicao Java com uma interface que possibilite a digitao de um nmero e
que mostre em uma mensagem (JOptionPane) com resultado da multiplicao deste
nmero por 5. Utilize try-catch para tratar a exceo por meio do mtodo de converso
de String para double implementado no enunciado 4 para tratar a entrada de dados.

4.

Crie uma classe que implemente o mtodo retornaDouble(String) que lana a exceo
implementada no enunciado 3 caso o String de entrada seja vazia.

Atividade 2 GUI em Java (complementar)


1.

2.

3.

Defina a classe ContaCorrente contendo os atributos nmero da conta, nome do cliente e

saldo para lanar excees (definidas por voc) quando a conta construda com saldo
negativo e quando se saca uma quantidade maior que o saldo atual.

Faa uma aplicao Java com uma interface que possibilite a digitao de informaes

para instanciar objetos da classe ContaCorrente (criada no enunciado anterior) e


armazenar num ArrayList.

Faa uma aplicao Java com uma interface que possibilite informar o nmero de uma

conta corrente e o valor com dois botes (JButton), sendo um para depsito e outro para
saque. O boto de saque dever lanar uma exceo para tratar possvel saldo negativo

4.

em caso de saque de valores superiores ao saldo atual da conta.

Defina uma classe MyInput, contendo mtodos estticos abaixo (todos os mtodos
devem retornar o tipo especificado), de forma que excees sejam lanadas caso um
valor incorreto tenha sido fornecido pelo usurio.
a.

getInt para leitura de um inteiro, com parmetros que representem os

b.

getFloat para leitura de um flutuante, com parmetros que representem os

c.
5.

valores mnimo e mximo aceitos.


valores mnimo e mximo aceitos.

getChar para leitura de um caractere , com um parmetro do tipo String

contendo um conjunto de caracteres aceitos.

Faa uma classe executvel Java que teste entradas de dados para cada um dos mtodos
implementados no enunciado 4 e trate possveis excees (problemas de converso com
a estrutura try-catch.

Java bsico 2

61

4
Controle de entrada e sada, streams e tratamento
de arquivos sesso 6
Exerccio de nivelamento I/O
Voc j desenvolveu alguma aplicao que utilizou manipulou arquivos em disco? Em que
linguagem? Trabalhou com gravao de objetos? Que recurso utilizou?

Controle de entrada e sada


Pacote java.io

Leitura/Escrita de Dados

Orientada a bytes (modo binrio)

Orientada a caracteres (modo texto)

Serializao de Objetos
Outros

Acesso Aleatrio: classe RandomAccessFile

Informaes sobre arquivos e diretrios: classe File


Uma stream de I/O gera o caminho por meio do qual seus programas podem enviar uma
sequncia de bytes de uma fonte at um destino. Uma stream de entrada uma fonte (ou
produtor) de bytes e uma stream de sada o destino (ou consumidor).

Todas as funes de I/O stream tratam os arquivos de dados ou os itens de dados como uma
corrente ou um fluxo (stream) de caracteres individuais. Se for escolhida uma funo de
stream apropriada, a aplicao poder processar dados em qualquer tamanho ou formato,
desde simples caracteres at estruturas de dados grandes e complicadas. Tecnicamente
62

Java bsico 2

falando, quando um programa usa uma funo stream para abrir um arquivo para I/O, o
arquivo que foi aberto associado com uma estrutura do tipo FILE que contm informaes
bsicas sobre o arquivo.

Uma vez aberta a stream, retornado um ponteiro para a estrutura FILE. Este ponteiro FILE
algumas vezes chamado de ponteiro stream ou stream usado para fazer referncia ao
arquivo para todas as entradas/sadas subseqentes.

Todas as funes de I/O stream fornecem entrada e sada bufferizada, formatada ou no


formatada. Uma stream bufferizada proporciona uma localizao de armazenamento
intermediria para todas as informaes que so provenientes de stream e toda sada que
est sendo enviada a stream. I/O em disco uma operao que toma tempo, mas a
bufferizao da stream agilizar sua aplicao. Ao invs de introduzir os dados stream, um
caractere ou uma estrutura a cada vez, as funes I/O stream acessam os dados em um bloco
de cada vez.

medida que a aplicao necessita processar a entrada, ela simplesmente acessa o buffer, o
que um processo muito mais rpido. Quando o buffer estiver vazio, ser acessado um novo
bloco de disco. O inverso tambm verdadeiro para sada stream. Ao invs de colocar
fisicamente na sada todos os dados, medida que executada a instruo de sada, as
funes de I/O stream colocam todos os dados de sada no buffer. Quando o buffer estiver
cheio, os dados sero escritos no disco.

Dependendo da linguagem de alto nvel que estiver sendo utilizada, pode ocorrer um
problema de I/O bufferizado. Por exemplo, se o programa executar vrias instrues de sada
que no preencham o buffer de sada, condio necessria para que ele fosse descarregado
no disco, aquelas informaes sero perdidas quando terminar o processamento de
programa.
A soluo geralmente envolve a chamada de uma funo apropriada para limpar o buffer.
claro que uma aplicao bem escrita no dever ficar dependendo destes recursos
automticos, mas dever sempre detalhar explicitamente cada ao que o programa deve
tomar. Mais uma observao: se a aplicao terminar de maneira anormal quando se estiver
usando stream I/O, os buffers de sada podem no ser esgotados (limpos), resultando em
perda de dados.

O ltimo tipo de entrada e sada chamado low-level I/O I/O de baixo nvel. Nenhuma
das funes de I/O de baixo nvel executa bufferizao e formatao. Ao invs disso, elas
chamam diretamente os recursos de I/O do sistema operacional. Estas rotinas permitem
acessar arquivos e dispositivos perifricos em um nvel mais bsico do que as funes
stream.

Os arquivos abertos desta maneira retornam um manipulador de arquivo, um valor inteiro


que utilizado para fazer referncia ao arquivo em operaes subseqentes. Em geral, uma
prtica ruim de programao misturar funes de I/O stream com rotinas de baixo nvel.

Java bsico 2

63

Como as funes stream so bufferizadas e as funes de baixo nvel no, a tentativa de


acessar o mesmo arquivo ou dispositivo por dois mtodos diferentes leva confuso e
eventual perda de dados nos buffers.

Stream em Java

As bibliotecas Java para I/O (java.io e java.nio) oferecem numerosas classes de stream. Mas
todas as classes de stream de entrada so subclasses da classe abstrata InputStream, e todas
as classes stream de sada so subclasses da classe abstrata OutputStream. A figura abaixo
ilustra a hierarquia de classes do pacote java.io.

Figura 20 Biblioteca Java IO.


O recurso de serializao permite que um objeto seja transformado em um stream de bytes,
que podem ser armazenados em um arquivo e enviados via rede. Atravs desses bytes tornase possvel recriar a classe serializada, desde que esta implemente a interface Serializable ou
a Externalizable.

Somente objetos que implementem essas interface podem ser desintegrados em bytes, ou
integrados a partir dos bytes. A interface Externalizable, por exemplo, deve implementar os

64

Java bsico 2

mtodos writeExternal e readExternal. As variveis sero salvas ou lidas por esses mtodos.
Essas duas chamadas recebem uma classe do tipo ObjectOutput e ObjectInput,
respectivamente. O principal mtodo da classe ObjectOutput writeObject e o da classe
ObjectInput o readObject.
Esses mtodos sero os responsveis pela transformao da classe em bytes e vice-versa.
Existem classes concretas para essas interfaces, que so ObjectOutputStream e
ObjectInputStream. Este recurso, serializao, pode ser utilizado em aplicaes visuais, por
exemplo, para permitir que os usurios salvem seus trabalhos em um arquivo. Neste caso,
antes de escrever um objeto em uma stream, os objetos devero ser serializados.

Deve-se considerar a serializao de objetos semelhante diviso de um objeto em pequenos


pedaos para poder escrev-los em uma stream de bytes. O termo para este processo
serializao de objetos.

Entrada e Sada baseada em Bytes

A classe abstrata OutputStream contm definies de mtodos write para gravao de bytes
de um arquivo. O mtodo de gravao de byte abstrato, devendo ser redefinido em
subclasses, como FileOutputStream e DataOutputStream.
O cdigo abaixo ilustra a utilizao dos mtodos writeInt() e writeDouble() utilizados para
gravao de bytes de um arquivo informado pelo usurio.
import java.io.*;

public class EscritaBytes {


public static void main(String a[]) {
// verifica presena do argumento obrigatrio com nome do
arquivo
if (a.length==0) {
System.out.println("uso:\njava EscritaBytes <nomeArquivo>
[quant]");
System.exit(-1);
}
// efetua abertura do arquivo
DataOutputStream dos = null;
try {
dos = new DataOutputStream(new FileOutputStream(a[0]));
System.out.println("Arquivo '" + a[0] + "' aberto.");
} catch(FileNotFoundException e) {
System.out.println(e);
System.exit(-1);
}
// converte quantidade dada pelo usurio ou usa default
int quant = 10;
try {
Java bsico 2

65

quant = Integer.parseInt(a[1]);
} catch (Exception e) {
System.out.println("Usando quantidade default 10");
}
// gera quantidade indicada de valores aleatrios
try {
System.out.println("Gerando conteudo...");
for(int i=0; i<quant; i++) {
dos.writeInt(i);
double aux = Math.random();
dos.writeDouble(aux);
System.out.println("#" + i + " : " + aux);
}
dos.close();
System.out.println("Arquivo '" + a[0] + "' fechado.");
} catch(Exception e) {
System.out.println(e);
}

Da mesma forma a classe abstrata InputStream contm definies de mtodos read para
leitura de bytes de um arquivo. O mtodo de leitura de byte abstrato, devendo ser
redefinido em subclasses, como FileInputStream.

O cdigo abaixo ilustra a utilizao dos mtodos readInt() e readDouble() utilizados para
leitura de bytes de um arquivo informado pelo usurio.
import java.io.*;

public class LeituraBytes {


public static void main(String a[]) {
// verifica presena de argumento com nome do arquivo
if (a.length==0) {
System.out.println("uso:\njava LeituraBytes <nomeArquivo>");
System.exit(-1);
}
// efetua a abertura do arquivo, para leitura de bytes
DataInputStream dis = null;
try {
dis = new DataInputStream(new FileInputStream(a[0]));
System.out.println("Arquivo '" + a[0] + "' aberto.");
} catch(FileNotFoundException e) {
System.out.println(e);
System.exit(-1);
}
// efetua a leitura do arquivo enquanto existirem dados

66

Java bsico 2

try {
System.out.println("--- Conteudo ---");
while(dis.available()>0) {
int i = dis.readInt();
double aux = dis.readDouble();
System.out.println("#" + i + " : " + aux);
}
System.out.println("--- Conteudo ---");
dis.close();
System.out.println("Arquivo '" + a[0] + "' fechado.");
} catch(IOException e) {
System.out.println(e);
}

Serializao de Objetos
A serializao um mecanismo que permite transformar um objeto em uma sequncia de
bytes, a qual pode ser restaurada, em um momento posterior, em um objeto idntico ao
original.
As classes ObjectOutputStream e ObjectInputStream implementam o protocolo de
serializao do Java. Estes streams so capazes de serializar e desserializar objetos
instanciados em aplicaes Java. Por exemplo, podemos ter uma classe da qual podemos
instanciar objetos que representam produtos.

Note que, para um objeto ser serializado, sua classe deve implementar a interface
Serializable, que no exige a implementao de qualquer mtodo, servindo apenas como uma
tag interface (marcao) que autoriza a serializao.
import java.io.*;
public class Produto implements Serializable {
String nome;
int codigo;
public Produto(String n, int c) {
nome = n;
codigo = c;
}
public String toString() {
return "Produto[nome=" + nome + ", codigo=" + codigo +"]";
}
Java bsico 2

67

Depois de instanciar objetos da classe produto ns podemos ter uma aplicao Java que
possibilite a serializao destes objetos e grav-los em um arquivo em disco.
import java.io.*;
import java.util.*;
public class SerializaProduto {
public static void main(String a[]) {
if (a.length==0) {
System.out.println("uso:\njava SerializaProduto
<nomeArquivo>");
System.exit(-1);
}
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(a[0]));
System.out.println("Arquivo '" + a[0] + "' aberto.");
} catch(IOException e) {
System.out.println(e);
System.exit(-1);
}
try {
System.out.println("Gerando conteudo...");
Produto p = new Produto("Nome do Produto", 123456);
oos.writeObject(p);
System.out.println(p);
Date d = new Date();
oos.writeObject(d);
System.out.println(d);
oos.close();
System.out.println("Arquivo '" + a[0] + "' fechado.");
} catch(Exception e) {
System.out.println(e);
}
}
}

Por fim, podemos realizar o processo inverso atravs da leitura de uma sequncia de bytes
de um arquivo em disco, que representa um objeto, e desserializ-la para que possamos
novamente ter um objeto instanciado da classe produto em uma aplicao Java.
68

Java bsico 2

Exerccios de Fixao 6 Java I/O


Qual a diferena entre lanar uma exceo e capturar uma exceo?

Atividade 1 Java I/O


1.

Desenvolva os problemas (aplicao em trs camadas) descritos abaixo:


1.1. Crie uma classe com o nome de produto com os atributos cdigo, nome, preo de
compra e preo de venda que possibilite a serializao de objetos.
1.2. Crie uma classe de controle que ir possibilitar a gravao de objetos em disco e
demais consultas que so solicitadas;
1.3. Utilizar Colees para busca e ordenao;
1.4. Desenvolva uma aplicao GUI em Java que disponibilize as seguintes
funcionalidades:
1.4.1. Menu principal que possibilite acesso as seguintes funcionalidades:
1.4.1.1. Tela que possibilite a digitao dos dados de produtos e sua incluso
num arquivo em disco;
1.4.1.2. Tela que possibilite a digitao de um intervalo de preos de compra
necessrios para a gerao de uma listagem (jTextArea) com produtos
que tenham esta caracterstica informada pelo usurio do sistema;
1.4.1.3. Tela que possibilite a listagem de todos os produtos cadastrados;
1.4.1.4. Tela que possibilite a visualizao de dados do produto com o maior
preo de compra e tambm o que tem o menor preo de venda;
1.4.1.5. Tela que possibilite a consulta de um produto pelo seu nome. A tela
dever mostrar todos os dados cadastrados do produto em jTextFields
desabilitados ou uma mensagem (JOptionPane) com a informao de
que no existe produto com a descrio informada;

Java bsico 2

69

2. Atividade 2 Java I/O (complementar)


1.

Uma indstria deseja manter um banco de dados sobre a folha de pagamento mensal de
seus funcionrios. Para isso, lido de cada funcionrio: o nome, o salrio-base e uma
categoria funcional (numrica: 1-operrio, 2-administrativo ou 3-gerncia). Os dados

devem ficar armazenados em um arquivo (folha.dat) e a cada vez que for solicitado, o

contra-cheque de um funcionrio deve ser exibido, com as seguintes informaes: nome

do funcionrio, salrio bruto (se da categoria 1, o prprio salrio-base; se da categoria

2, o salrio-base + 5%; se da categoria 3, o salrio-base + 15%), descontos (se salrio

bruto maior ou igual a 1000, 3% sobre o salrio bruto; caso contrrio, 1% sobre o salrio

bruto) e salrio lquido (salrio bruto descontos). Desenvolva um aplicao GUI em

Java que apresente as seguintes opes:

a) Incluir (solicitao dos dados de um funcionrio e gravao de um registro


com os dados da folha de pagamento no arquivo)
b) Listar (leitura dos dados da folha de pagamento de um funcionrio do

6.

arquivo, mostrando as informaes do contra-cheque)

A comisso organizadora de um campeonato de atletismo decidiu apurar os resultados


da competio atravs de um processamento eletrnico. De cada atleta so lidos: cdigo

de identificao, nome e o tempo gasto em cada uma das 5 provas que formam a

competio. Esses dados so armazenados em um arquivo. Ao final de cada prova, a


pontuao atribuda de acordo com o tempo realizado em cada prova (quem gastou

menos tempo est em 1 lugar) e feita da seguinte maneira: 1 colocado: 5 pontos, 2


colocado: 3 pontos e 3 colocado: 1 ponto. Essa pontuao atualizada na pontuao
geral do campeonato. Desenvolva uma aplicao GUI em Java que apresente as seguintes
opes:

a) Incluso dos dados (solicitao dos dados de um atleta e gravao


de um registro no arquivo)
b) Classificao (leitura dos dados dos atletas e processamento dos tempos e
pontos)

70

Java bsico 2

Java bsico 2

71

5
JDBC sesso 7, 8 e 9
Exerccio de nivelamento JDBC
Voc j desenvolveu alguma aplicao que utilizou acesso a banco de dados? Em que
linguagem? Que banco de dados utilizou?

JDBC

O que JDBC

Arquitetura e API

Drivers de acesso a banco de dados

Detalhes e uso da API


Drivers

Classes especializadas
JDBC (Java Database Conenctivity) a API padro para conectividade de bancos de dados, tais
como banco de dados SQL e outras fontes de dados tabulares, como planilhas e arquivos
simples, com a linguagem de programao Java.
JDBC fornece em sua API um conjunto de classes genricas para acesso a qualquer tipo de
banco de dados baseado em SQL.

72

Java bsico 2

Figura 21 JDBC Driver.


O JDBC est no pacote java.sql.*. Pode ser encontrado no site da Oracle. A instalao do
J2SE j trs consigo o JDBC.

Alm disso, precisa-se de um driver para acesso ao banco de dados que se quer. Atualmente
os drivers de acesso a banco de dados para aplicaes desenvolvidas em java esto
disponveis no site do fornecedor do SGBD que voc necessita acessar. Por exemplo, para
acesso ao PostgreSQL, usa-se o driver JDBC para PostgreSQL. O driver deve ser colocado no
CLASSPATH do projeto para que possa ser referenciado.
Os passos para o acesso so:

1. Instalao do driver e insero no CLASSPATH;


2. Registro do driver no cdigo
3. Criao de uma conexo
4. Executar consultas SQL.
Alm de acessos usando-se drivers, pode-se usar uma ponte que vai desde o JDBC ao ODBC,
para acesso de bases Win32.

Java bsico 2

73

A arquitetura JDBC pode ser melhor visualizada na seguinte figura:

Figura 22 Arquitetura JDBC.

Exemplo de Acesso
Segue um exemplo de acesso a um banco de dados PostgreSQL. Perceba que a varivel
strDriver deve conter o nome da classe do driver, para que possa ser registrada, e url deve
conter a localizao do banco de dados. Essa separao e maneira com a que foi
implementada permite que se possa coloc-las num arquivo de configurao, tornando assim
fcil a alterao, se a plataforma mudar.
public void pesquisar() {
Connection con;
Statement st;
ResultSet rs;
String url, user, password, strDriver;
user = "usr";
password = "pwd";
url = "jdbc:postgresql://localhost:5432/postgres";
strDriver = "org.postgresql.Driver";
try {
// registra o driver
Class.forName( strDriver );
// acesso
con = DriverManager.getConnection(url, user, password);
st = con.createStatement();

74

Java bsico 2

rs = st.executeQuery("select * from tb_cliente");


while (rs.next()) {
System.out.println(rs.getString("nome_cliente"));
}
st.close();
con.close();

}
catch(Exception e) {
System.out.println(e.getMessage());
}

Para acessar a mesma base de dados usando uma ponte ODBC pode-se alterar somente o
seguinte na funo acima:
url = "jdbc:odbc:banco_cliente";
strDriver = "sun.jdbc.odbc.JdbcOdbcDriver";

Onde banco_cliente exatamente o DSN criado no ODBC do Windows.

Obtendo Conexes

Para obter uma conexo como banco de dados usa-se o mtodo:

Connection con = DriverManager.getConnection(url, user, pwd);


Onde url o endereo do servidor de banco de dados, user o usurio de conexo e pwd
sua senha. Esse mtodo retorna um objeto da classe Connection. Caso algum erro ocorra,
uma exceo ser levantada.

O objeto Connection tambm responsvel pela dinmica de atualizao das alteraes


no banco: commit e rollback.

Executando Consultas

Para executar uma consulta simples (select) deve-se ter um objeto da classe Statement, e
deste objeto chamar o mtodo executeQuery. Para se conseguir um Statement, usa-se
createStatement da conexo:
st = con.createStatement();
rs = st.executeQuery("select * from tb_cliente");

Percebe-se que o mtodo executeQuery retorna um objeto ResultSet que contm o


resultado da seleo.

Java bsico 2

75

Sesso 07 JDBC
Exerccios de Fixao 7 Java JDBC
Quais as principais diferenas dos objetos Statement e PreparedStatement?

Atividade 1 Java JDBC


2.

76

Todas as consultas a seguir se referem ao banco de dados empresa empresa.sql.


Escreva o comando DML para cada uma delas e mostre o resultado obtido utilizando
componentes visuais grficos do pacote Swing do Java. Desenvolva a aplicao em
camadas (padro MVC). Cada enunciado dever estar acessvel atravs de um boto
(jButton) . O resultado que conter apenas uma linha dever ser visualizado em uma
mensagem (JOptionPane). O resultado que conter vrias linhas dever ser visualizado
em uma tabela (JTable).

Java bsico 2

3.
4.
5.
6.
7.
8.
9.

Mostre o primeiro nome e endereo de todos os empregados que trabalham para o


departamento Pesquisa.

Encontre os nomes (primeiro nome) de todos os empregados que so diretamente


supervisionados por Joaquim.
Faa uma lista dos nmeros e nomes de projetos que envolvam um empregado cujo
ltimo nome seja Will, mesmo que esse trabalhador seja o gerente do departamento
que controla o projeto.

Para todo projeto localizado em Araucaria, liste o nome do projeto, o nome do


departamento de controle e o ltimo nome, endereo e data de nascimento do gerente
do departamento.

Encontre o nome dos empregados que trabalham em todos os projetos controlados pelo
departamento nmero 5.
Para cada projeto, liste o nome do projeto e o total de horas por semana (de todos os
empregados) gastas no projeto.

Recupere os nomes de todos os empregados que trabalhem mais de 10 horas por


semana no projeto Automatizacao.

10. Recupere os nomes de todos os empregados que no trabalham em nenhum projeto.


Java bsico 2

77

11. Recupere a mdia salarial de todos os empregados do sexo feminino.

12. Para cada departamento, recupere o nome do departamento e a mdia salarial de todos
os empregados que trabalham nesse departamento.

Atividade 2 Java JDBC

1.

Encontre o nome e o endereo de todos os empregados que trabalhem em pelo menos


um projeto localizado em Curitiba, mas cujo departamento no se localiza em Curitiba.

2.

Liste os nomes de todos os empregados com dois ou mais dependentes.

4.

Liste o ltimo nome de todos os gerentes de departamento que no tenham


dependentes.

3.

5.

Recupere o nome de empregados que no tenham dependentes.

Liste os nomes dos gerentes que tenham, pelo menos, um dependente.

Executando Alteraes

Para executar alteraes no banco, como inserts, updates, criao de tabelas, usa-se:

st = con.createStatement();
st.executeUpdate("create table teste (cod int, nome char(50))");
Esse mtodo no retorna resultado, somente gera exceo caso haja erro.

Recuperando Resultados

Os resultados de uma consulta ficam armazenados num objeto da classe ResultSet. Para
buscar a primeira linha de resultados executa-se:
rs.next()

Se essa chamada retornar false porque no existem mais registros, caso contrrio, um
registro foi recuperado.

Para recuperar os dados (campos) de um registro, usa-se a variedade das funes get* do
ResultSet. Por exemplo:

String name = rs.getString(nome);


int cod = rs.getInt(cod);

As strings passadas como parmetro para as funes so os nomes dos campos. Pode-se
passar tambm o ndice do campo (0, 1, 2, ...), mas claro, o nome muito mais legvel.

Com essas funes tambm se pode ler toda uma grande variedade de dados, como longs,
datas, etc.

78

Java bsico 2

Instrues Preparadas
Instrues preparadas permitem pr-compilar uma instruo para depois poder execut-la
mais de uma vez, com uma performance melhor.

Como um objeto Statement, o objeto PreparedStatement obtido a partir de um


Connection:
PreparedStatement pstmt = con.prepareStatement(
insert into teste (cod, nome) values (?, ?));

Repare que h dois pontos de interrogao (?) na instruo. Isso so parmetros da


instruo, que devem ser preenchidos antes da sua execuo:
pstmt.setInt(1, 1);
pstmt.setString(2, Camila);

Onde o primeiro parmetro (1 e 2) a posio do parmetro. O segundo o valor a ser


colocado no lugar das interrogaes. Assim como as funes get*, as funes set* podem
inserir qualquer tipo de dados numa instruo preparada.
Depois de inseridos os parmetros, pode-se executar a consulta:

pstmt.executeUpdate();

Se fosse uma query (select) pode-se tambm usar:


pstmt.executeQuery();

Sesso 08 JDBC
Exerccios de Fixao 8 Java JDBC
Liste as principais classes que o Java disponibiliza no pacote java.sql necessrios para o
desenvolvimento de aplicaes java que possibilitem acesso a banco de dados?

Java bsico 2

79

Atividade 1 Java JDBC


1.

Uma indstria deseja manter um banco de dados sobre a folha de pagamento mensal de

seus funcionrios. Para isso, lido de cada funcionrio: o nome, o salrio-base e uma

categoria funcional (numrica: 1-operrio, 2-administrativo ou 3-gerncia). Os dados

devem ficar armazenados em uma tabela no PostgreSQL e a cada vez que for solicitado, o

contra-cheque de um funcionrio deve ser exibido, com as seguintes informaes: nome

do funcionrio, salrio bruto (se da categoria 1, o prprio salrio-base; se da categoria

2, o salrio-base + 5%; se da categoria 3, o salrio-base + 15%), descontos (se salrio

bruto maior ou igual a 1000, 3% sobre o salrio bruto; caso contrrio, 1% sobre o salrio
bruto) e salrio lquido (salrio bruto descontos). Desenvolva uma aplicao GUI em

Java que apresente as seguintes opes:

c) Incluir (solicitao dos dados de um funcionrio e gravao de um


registro com os dados da folha de pagamento no arquivo).
d) Listar (leitura dos dados da folha de pagamento de um funcionrio do
arquivo, mostrando as informaes do contra-cheque).

Atividade 2 Java JDBC


1.

Defina um novo banco de dados no PostgreSQL que dever possuir trs tabelas. A

primeira, denominada DEPARTAMENTO, dever conter o cdigo (valor inteiro) e seu


nome (literal). A segunda, denominada OCUPAO, dever conter o cdigo (valor
inteiro) e sua descrio (literal). A terceira, denominada FUNCIONRIO, dever conter o

nmero de registro do funcionrio (valor inteiro), o nome (literal), o cdigo de ocupao,


2.

o cdigo do departamento em que esta lotado.

Desenvolva um aplicao GUI em Java que apresente as seguintes opes para

manipulao do banco de dados implementado no enunciado 1 da atividade 2 Java

JDBC:

a) Uma tela (JFrame) que possibilite a manuteno de registros na


tabela DEPARTAMENTO (incluso, excluso, consulta,
alterao);
b) Uma tela (JFrame) que possibilite a manuteno de registros na
tabela OCUPAO (incluso, excluso, consulta, alterao);
c) Uma tela (JFrame) que possibilite a manuteno de registros na
tabela FUNCIONRIO (incluso, excluso, consulta, alterao).

80

Java bsico 2

Os dados das tabelas relacionadas devero estar acessveis em


objetos JComboBox;
d) Implementar uma classe executvel que disponibilize um Menu
com opes de acesso para as telas implementadas nos itens a, b e
c.

Stored Procedures
So procedimentos armazenados no banco de dados, prontas para execuo, que podem ou
no ter parmetros, e tambm podem ou no ter algum resultado.

Para isso, usa-se a classe CallabeStatement. Supondo que exista uma stored procedure
no nosso banco, chamada: sp_teste, que recebe dois parmetros, um cdigo de entrada e um
nome de sada. Para cham-la, faz-se:
CallableStatement cstmt = con.prepareCall({call sp_teste(?, ?)});
cstmt.setInt(1, 1);
cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
cstmt.executeUpdate();
System.out.println(cstmt.getString(2));

Quando se quer que a Stored Procedure retorne um valor, sem ser um parmetro de retorno,
a sintaxe da string dentro do prepareCall :
{?= call [,, ...]}

Nesse caso, a primeira interrogao ({ ?= ...) ter o ndice 1 para o


registerOutParameter.
Todos os parmetros de sada (OUT) devem ser registrados com
registerOutParameter, antes de chamar o procedimento.

Fechando Recursos

Depois de usados, as conexes, Statemets e ResultSets devem ser fechadas:


con.close();
st.close();
pstmt.close();
cstmt.close();
rs.close();

Transaes
Uma transao um conjunto de um ou mais comandos que so executados, completados e
ento validados (commit) ou cancelados (rollback). Quando uma transao validada ou
cancelada, uma outra transao se inicia.
Java bsico 2

81

A conexo em java , por default, auto-commit. Isso significa que sempre que um comando
executado, um commit executado no banco de dados. Se o comando auto-commit for
desabilitado, ento deve-se fazer explicitamente o commit ou rollback das transaes. A
maioria dos drivers JDBC suportam transaes.
Um exemplo de cdigo:

con.setAutoCommit(false);
Statement st = con.createStatement();
....
con.commit();
con.setAutoCommit(true);
O comando setAutoCommit aplicado conexo, e define se os commits e rollbacks sero
ou no efetuados automaticamente. Caso no sejam, a conexo disponibiliza os comandos
commit() e rollback().

Execuo em Batch

usado quando se tem muitas atualizaes para serem feitas no banco de dados. Muitas
vezes, atualizaes em batch so mais rpidas do que atualizaes feitas uma a uma.
Exemplo:
con.setAutoCommit(false);
Statement stmt = con.createStatement();

stmt.addBatch("INSERT INTO COFFEES " +


"VALUES('Amaretto', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Hazelnut', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Amaretto_decaf', 49,
10.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Hazelnut_decaf', 49,
10.99, 0, 0)");
int [] updateCounts = stmt.executeBatch();
con.commit();
con.setAutoCommit(true);

A linha:

con.setAutoCommit(false);
usada para desabilitar o auto-commit da conexo. Isso usado para que no aconteam
erros imprevistos na execuo do batch.
82

Java bsico 2

A linha:

int [] updateCounts = stmt.executeBatch();


executa todos os comandos que foram inseridos com addBatch, na ordem em que foram
inseridos. Quando terminados, esse mtodo retorna, para cada um dos comandos, a
quantidade de linhas afetas por eles (por isso que retorna um array de inteiros). Como o
auto-commit foi desligado, deve-se explicitamente efetuar o commit.

Sesso 09 JDBC
Exerccios de Fixao 9 Java JDBC
Liste as principais recursos que voc consegue identificar que sejam necessrios para o
desenvolvimento de aplicaes java que possibilitem acesso a banco de dados?

Atividade 1 Java JDBC


1.

Uma loja decidiu fazer o levantamento de informaes em relao aos produtos que
disponibiliza para venda, juntamente com informaes de seus fornecedores. Durante a
fase de especificao de requisitos e entrevistas com o usurio os analistas conseguiram
identificar a necessidade da criao da entidade Produto (nome, preo de compra, preo
de venda, estoque e estoque mnimo) e tambm a entidade Fornecedor (nome, endereo,
telefone, contato). Verificou-se tambm que a relao entre estas entidades de (1:N),
sendo necessria a criao de um relacionamento entre Produto e Fornecedor, visto que
um produto pode ser fornecido por apenas um fornecedor e um fornecedor pode
fornecer mais de um produto para esta empresa.

Desenvolva os problemas descritos abaixo:

2.1. Crie um banco de dados no PostgreSQL com o nome de estoque.


2.1.1. Crie as tabelas, com base nas estruturas de dados descritas anteriormente, que
iro compor o banco de dados no SGBD PostgreSQL.
2.2. Desenvolva uma aplicao GUI Java que disponibilize as seguintes funcionalidades:
2.2.1. Classes modelos para cada uma das tabelas implementadas no banco de dados
da aplicao;

Java bsico 2

83

2.2.2. Classes DAO que iro possibilitar o acesso ao banco de dados para manuteno
de registros das tabelas implementadas no banco de dados da aplicao;
2.2.3. Menu principal que possibilite acesso as telas para manuteno de registros da
tabela produto, fornecedor e tambm para relao entre produto-fornecedor;
2.2.4. Tela que possibilite a manuteno de dados de produtos (incluso, alterao,
consulta, excluso).
2.2.5. Tela que possibilite a manuteno de dados de fornecedores (incluso,
alterao, consulta, excluso).
2.2.6. Tela que possibilite, atravs de cliques em botes, a visualizao dos
resultados das seguintes consultas SQL:
2.2.6.1. A mdia geral da quantidade em estoque dos produtos da empresa;
2.2.6.2. O nome e o contato do fornecedor do produto que tem o menor preo de
venda;
2.2.6.3. O nome do produto que tem o maior preo de compra, juntamente com
seu fornecedor e contato;
2.2.6.4. Para cada fornecedor, o total de produto que ele fornece;
2.2.6.5. A mdia dos preos de compra de cada um dos fornecedores
2.2.6.6. O total em R$ dos produtos armazenados na empresa, tendo como base
o preo de compra.

3. Atividade 2 Java JDBC


1.

Uma indstria deseja manter um banco de dados sobre a folha de pagamento mensal de

seus funcionrios. Para isso, lido de cada funcionrio: o nome, o salrio-base e uma
categoria funcional (numrica: 1-operrio, 2-administrativo ou 3-gerncia). Os dados

devem ficar armazenados em uma tabela no PostgreSQL e a cada vez que for solicitado, o

contracheque de um funcionrio deve ser exibido, com as seguintes informaes: nome


do funcionrio, salrio bruto (se da categoria 1, o prprio salrio-base; se da categoria

2, o salrio-base + 5%; se da categoria 3, o salrio-base + 15%), descontos (se salrio

bruto maior ou igual a 1000, 3% sobre o salrio bruto; caso contrrio, 1% sobre o salrio
bruto) e salrio lquido (salrio bruto descontos). Desenvolva um aplicao GUI em

Java que apresente as seguintes opes:

a) Incluir (solicitao dos dados de um funcionrio e gravao de um


registro com os dados da folha de pagamento no arquivo).
b) Listar (leitura dos dados da folha de pagamento de um funcionrio do

3.

arquivo, mostrando as informaes do contracheque).

A comisso organizadora de um campeonato de atletismo decidiu apurar os resultados

da competio atravs de um processamento eletrnico. De cada atleta so lidos: cdigo

de identificao, nome e o tempo gasto em cada uma das 5 provas que formam a

competio. Esses dados so armazenados em um arquivo. Ao final de cada prova, a


pontuao atribuda de acordo com o tempo realizado em cada prova (quem gastou

84

Java bsico 2

menos tempo est em 1 lugar) e feita da seguinte maneira: 1 colocado: 5 pontos, 2


colocado: 3 pontos e 3 colocado: 1 ponto. Essa pontuao atualizada na pontuao
geral do campeonato. Desenvolva uma aplicao GUI em Java que apresente as seguintes
opes:

a) Incluso dos dados (solicitao dos dados de um atleta e gravao


de um registro no arquivo)
b) Classificao (leitura dos dados dos atletas e processamento dos tempos e
pontos)

Java bsico 2

85

6
Threads sesso 10
Exerccio de nivelamento JDBC
Voc j desenvolveu alguma aplicao que utilizou acesso a banco de dados? Em que
linguagem? Que banco de dados utilizou?

Sistema Operacional e Processos


O que Thread?

Threads em Java

Classe Thread ou Interface Runnable


Operaes sobre Threads
Prioridades de Threads

Sincronizao

Programao concorrente

Uma thread uma ramificao do programa, ou trecho, em execuo, que executada


paralelamente. A JVM permite que uma aplicao tenha mltiplas threads executando
concorrentemente.

Toda thread tem uma prioridade. As que possuem alta prioridade so executadas
preferencialmente quelas com baixa prioridade. Quando um cdigo rodando em alguma
thread cria um novo objeto Thread, este ter sua prioridade inicialmente configurada igual
thread que o criou.

Existem dois tipos de threads: daemon e user. As threads daemon so do sistema e user so
as criadas pelo usurio.
86

Java bsico 2

Quando JVM inicia, existe usualmente uma thread do usurio, que tipicamente chama o
mtodo main de alguma classe. O JVM continua a execuo at:

O mtodo exit da classe Runtime tenha sido chamado e o gerenciador de segurana


tenha permitido a operao de sada;

Todas as threads que no so daemon tenham terminado, ou retornando da chamada run,


ou levantando uma exceo que se propaga at o mtodo run.

Mltiplas Linhas de Execuo (Thread)

Muitos dos problemas de software propostos em situaes reais podem ser resolvidos
utilizando vrias threads de controle. Por exemplo, programas interativos que exibem dados
graficamente frequentemente precisam permitir aos usurios alterar parmetros de exibio
em tempo real. Os programas interativos geralmente tm um melhor comportamento
dinmico utilizando threads.

Esse captulo discute profundamente os conceitos de thread e, atravs de exemplos


detalhados, esclarece o modelo Java de threading.

O que so?

Uma perspectiva simples, mais til, de um computador a de que ele possui uma CPU, que
realiza a computao, uma ROM, que contm o programa que a CPU executa, e uma RAM, que
armazena os dados em que o programa opera. Nessa perspectiva simples, somente um
trabalho realizado por vez. Uma perspectiva mais completa da maioria dos sistemas de
computao modernos permite a possibilidade de um ou mais trabalhos realizados ao
mesmo tempo, ao menos, aparentemente.

importante considerar as implicaes do ponto de vista da programao. A realizao de


mais de um trabalho semelhante existncia de mais de um computador. Sendo assim,
considere um thread ou linha de execuo como o encapsulamento de uma CPU virtual com
seus prprios dados e cdigo de programa. A classe Java.lang.Thread nas principais
bibliotecas Java permite criar e controlar threads.

Incio do Thread e Programao de Thread

Apesar do Thread ter sido criado sua execuo no comea imediatamente. Para inicia-la
torna-se necessria a utilizao do mtodo start(). Esse mtodo pertence classe Thread do
Java e a forma de utilizao t.start(), onde t um objeto instanciado da classe Thread. Nesse
ponto, a CPU virtual, incorporada ao thread, torna-se executvel. Voc pode pensar nesse
evento como a ligao da CPU virtual.
Apesar do thread se tornar executvel, ele no necessariamente iniciado de imediato. Em
uma mquina que tenha efetivamente apenas uma CPU, bvio que ela s pode executar
uma instruo por vez. Consideraremos, agora, a forma como a CPU alocada quando mais
de um thread puder estar trabalhando com utilidade.
Java bsico 2

87

Na tecnologia Java, os threads normalmente so preemptivos, mas no necessariamente


fracionados no tempo, ( um erro comum acreditar que preemptivo seja uma palavra
sofisticada para "fracionada no tempo"). O modelo de um programador preemptivo
estabelece que vrios threads podem estar prontos para execuo, mas somente um est
efetivamente sendo executado.

Esse processo continua a ser executado at que ele no seja mais executvel ou que outro
processo de prioridade maior se torne executvel. Nesse caso, dizemos que o thread de
menor prioridade precedido pelo thread de maior prioridade.

Um thread pode deixar de estar pronto por uma srie de motivos. Ele pode executar uma
chamada a Thread.sleep(), que solicita deliberadamente uma pausa por um perodo, ou pode
precisar aguardar um dispositivo externo mais lento, como uma unidade de disco ou de uma
interao com o usurio.

Todos os threads executveis, mas no executados, so mantidos em filas segundo as


respectivas prioridades. O primeiro thread da fila de maior prioridade que no estiver vazia
ser executado. Quando um thread para de ser executado por causa de uma precedncia, ele
tirado do estado de execuo e colocado no fim da fila de espera.

Analogamente, um thread que se torna executvel aps estar bloqueado (inativo ou


aguardando operaes de E/S, por exemplo) sempre se posiciona no fim da fila.

Figura 08 thread, fila de executveis.

Pelo fato dos threads em Java no dividirem necessariamente o tempo, na ausncia de uma
compreenso mais avanada e para tornar a estrutura do programa mais adequada, voc
deve garantir que o cdigo dos seus threads d chance a outros threads de serem executados
de tempos em tempos. Como mostrado no exemplo a seguir, isso pode ser obtido emitindo a
chamada sleep() em intervalos, como um lao principal.

88

Java bsico 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14

public class xyz implements Runnable {


public void run() {
while (true) {
// faz vrias coisas interessantes
...
// D oportunidade a outros threads
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// Esse thread foi interrompido por outro
}
}
}
}

Observe a utilizao de try e catch. Observe tambm que a chamada sleep() um mtodo
static na classe Thread, e por isso referida como Thread.sleep(x). O argumento especifica o
nmero de milissegundos que o thread deve permanecer inativo. A execuo do thread no
ser retomada at o fim desse perodo e mais algum tempo para que outros threads sejam
bloqueados, permitindo que esse thread realmente inicie.

Outro mtodo na classe Thread, o yield(), pode ser emitido para dar oportunidade a outros
threads de serem executados sem interromper efetivamente o thread atual, a menos que seja
necessrio. Se outros threads de mesma prioridade forem executveis, yield() coloca o
thread chamador no fim da respectiva fila executvel e permite que outro thread inicie. Se
nenhum outro thread for executvel com a mesma prioridade, yield() no atuar.
importante observar que uma chamada sleep() pode conceder a threads de menor
prioridade uma oportunidade de serem executados. O mtodo yield() s d a mesma
oportunidade a threads de mesma prioridade.

Quando um thread retorna do fim do respectivo mtodo run(), ele morre. Em seguida, ele
no pode ser executado novamente.

O mtodo stop() pode ser emitido para forar a parada de um thread. Deve ser utilizado em
uma instncia especfica da classe Thread. Na linha 11 do exemplo abaixo, o thread t
forado a parar.
1
public class xyz implements Runnable {
2
// Algumas coisas que queremos em um thread
3
}
-------------------------------------------------------------------------------4
public class tTest {
5
public static void main(String args[]) {
6
Runnable r = new xyz();
7
Thread t = new Thread(r);
8
t.start();
9
// faz outras coisas
10
if (time_to_kill)
11
t.stop();
12
}
13 }

Java bsico 2

89

Em um determinado trecho de cdigo, possvel obter uma referncia ao thread atual


utilizando o mtodo currentThread() do Thread esttico, como mostrado no prximo
exemplo na linha 6.
1
2
3
4
5
6
7
8
9

public class xyz implements Runnable {


public void run() {
while (true) {
// vrias coisas interessantes
if (time_to_die)
Thread.currentThread().stop();
}
}
}

Observe que, nesse caso, a execuo de stop() destruir o contexto de execuo atual e,
portanto, o lao run() no ser mais executado nesse contexto.

Teste de um Thread

s vezes, possvel para um thread estar em um estado desconhecido (isso pode ocorrer se o
cdigo no estiver controlando diretamente um determinado thread). possvel descobrir se
um thread ainda vivel atravs do mtodo isAlive().
Estar vivo no implica que o thread esteja sendo executado. Apenas indica que ele foi
iniciado e no foi interrompido por meio de stop(), nem atingiu o fim do mtodo run().

Suspendendo Threads

Existem vrios mecanismos capazes de interromper a execuo de um thread


temporariamente. Aps esse tipo de suspenso, a execuo pode ser retomada como se nada
tivesse acontecido. O thread aparenta simplesmente ter executado uma instruo muito
devagar.

O mtodo sleep() foi introduzido anteriormente e utilizado para pausar um thread por um
perodo de tempo. Lembre-se de que, normalmente, o thread no retomado no instante em
que o perodo de inatividade termina, pois provvel que outro thread esteja sendo
executado nesse instante e no possa ser desprogramado, a menos que: a) o thread reativado
seja de prioridade superior; b) o thread que est sendo executado seja bloqueado por algum
motivo; ou c) a diviso do tempo esteja habilitada. Na maioria dos casos, nenhuma das duas
ltimas condies prevalece imediatamente.
s vezes, conveniente suspender a execuo de um thread indefinidamente. Nesse caso,
algum outro thread ser responsvel pela retomada da execuo. suspend() e resume()
foram criados com esse propsito.
Observe que, em geral, um thread pode ser suspenso por qualquer trecho de cdigo que
possua um handle do thread ou seja, uma varivel que o referencie.
Obviamente, contudo, o thread s pode ser reiniciado por outro thread que no seja o
prprio, pois o thread suspenso no est executando nenhum cdigo.

90

Java bsico 2

1
2

public class xyz implements Runnable {


public void run() {

// faz vrias coisas interessantes...

// aguarda at receber ordem para continuar

Thread.currentThread().suspend ();

7
8
9

// faz mais coisas...


}

-------------------------------------------------------------------------------10

...

12

Thread t = new Thread(r);

11
13
14
15

Runnable r = new xyz();


t.start();

// pausa para xyz ser executado por um momento


// pressupor que atinge seu suspend()...

16

Thread.sleep(1000);

18

// torna xyz executvel novamente

17
19

t.resume();

21

// executa efetivamente

20

22

Thread.yield();

Alm dos mtodos speep(), suspend() e resume(), um outro mtodo pode ser utilizado para
interromper a execuo de um thread temporariamente, o mtodo join().

O mtodo join() faz com que o thread atual aguarde o trmino do thread em que o mtodo
join foi chamado. Como mostrado no exemplo a seguir, a chamada a join() na linha 6 provoca
a espera do thread atual at que TimerThread tt termine.
Como mostrado na linha 6 do exemplo a seguir, join() tambm pode ser chamado com um
valor de tempo de espera em milissegundos. O mtodo join() suspender o thread atual pelo
nmero de milissegundos do tempo de espera ou at que o thread tt termine, o que ocorrer
primeiro.

1
2
3
4
5
6
7
8
9
10

TimerThread tt = new TimerThread (100);


tt.start ();
...
public void timeout() {
// Aguarda aqui o thread temporizador concluir
tt.join ();
...
// Continua nesse thread
...
}

Java bsico 2

91

Implementar Runnable Versus Estender Thread


Dadas s possibilidades de criao de threads, como decidir entre elas? H alguns pontos a
favor de cada tcnica:
A favor da implementao de Runnable:

Do ponto de vista da orientao a objetos, a classe Thread estritamente um


encapsulamento de uma CPU virtual, e como tal deve ser estendida somente quando o
comportamento desse modelo de CPU for alterado ou estendido de alguma forma.
Normalmente, essa alterao ou extenso no objeto do nosso exerccio. Por causa
disso, e devido importncia de fazer a distino entre as partes de CPU, cdigo e
dados de um thread executado, esse mdulo utilizou esse mtodo de implementao.
Como a tecnologia Java s permite uma nica herana, no possvel estender
nenhuma outra classe, como Applet, se Thread j foi estendida. Em algumas
situaes, essa limitao forar a utilizao do mtodo da implementao de
Runnable.

Como s vezes obrigatrio implementar Runnable, voc pode preferir fazer sempre
dessa forma, por uma questo de consistncia.

A favor da extenso de Thread:

Quando um mtodo de execuo est incorporado a uma classe que estende a classe
Thread, a referncia this refere-se efetivamente instncia de Thread que est
realmente controlando a execuo. Por isso, o cdigo no precisa mais utilizar
controles longos como Thread.currentThread().suspend();. Pode,
simplesmente, utilizar suspend();

Como o cdigo resultante ligeiramente mais simples, muitos programadores Java utilizam o
mecanismo de estender o thread. Tenha em mente, entretanto, que o modelo de herana
nica pode resultar em dificuldades posteriores no ciclo de vida do cdigo, caso voc adote
essa tcnica.

As Trs Partes de um Thread

Um thread composto de trs partes principais: a CPU, o cdigo executado pela CPU e os
dados em que o cdigo trabalha, como ilustrado na figura 09.

Na tecnologia Java, a CPU representada pela classe Thread. Quando um thread construdo,
so passados, atravs dos argumentos do construtor, o cdigo que deve executar e os dados
que devem ser trabalhados.
importante observar que esses trs aspectos so efetivamente independentes. Um thread
pode executar um cdigo diferente do cdigo de outro thread. Um thread pode ter acesso aos
mesmos dados de outro thread ou no.

92

Java bsico 2

Figura 09 As trs partes de um thread.

Java a nica entre as linguagens de programao a de uso geral e popular, no sentido de


que torna as primitivas de concorrncia disponveis para o programador de aplicativos. O
programador especifica quais aplicativos contm fluxos de execuo (threads1), cada thread
designando uma parte de um programa que pode executar concorrentemente com outros
threads. Essa capacidade, chamanda multithreading, fornece recursos poderoso para o
programador Java no disponveis em outras linguagens como C ou C++, chamadas de
linguagens de um nico thread.
Uma dos exemplos mais contundentes de uma aplicao multithread um browser web.
Como voc sabe, a maior parte dos browsers permite que voc abra mais de uma janela e
descarregue vrios arquivos ao mesmo tempo. Para permitir que voc execute vrias tarefas
dessa maneira, o browser utiliza as nultithreds.

Implementando uma Thread Mtodo Mais Comum

Voc pode implementar threads em programas Java de duas maneiras. Normalmente


implementa-se threads atravs da instncia de objetos que estendem a classe Thread. Como
voc j sabe, estender uma classe permite que o novo objeto herde as propriedades da classe
progenitora. Logo aps s reescrever o mtodo run() como ilustrado no trecho que cdigo
a seguir:
class ExemploThread extends Thread
{
public void run(){
}

//Implemente aqui o cdigo para as threads da classe

1 Embora o termo thread venha sendo traduzido por fluxo de execuo, preferimos mantlo no original por se tratar de uso j consagrado no meio acadmico.

Java bsico 2

93

Esta primeira forma no possvel de implementao caso a sua classe j herde de qualquer
outra classe que no a classe Thread. Isso poder ocorrer uma vez que Java no permite
herana mltipla. A soluo implementar a interface Runnable, que o segundo mtodo de
criao de um thread. Lembre-se que de interfaces so o modo de Java proporcionar as
vantagens da herana mltipla.

O exemplo a seguir implementa threads para executar um aplicativo que disponibiliza


relgios com horrios de 6 pases diferentes. A execuo deste aplicativo utiliza de threads
para efetuar a movimentao do ponteiro de todos os relgios.
import
import
import
import

java.awt.*;
java.awt.event.*;
javax.swing.*;
java.util.*;

public class TimerTest


{ public static void main(String[] args)
{ JFrame f = new TimerTestFrame();
f.show();
}
}
class TimerTestFrame extends JFrame
{ public TimerTestFrame()
{ setSize(450, 300);
setTitle("TimerTest");
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
} );

Container c = getContentPane();
c.setLayout(new GridLayout(2, 3));
c.add(new ClockCanvas("Brasil", "GMT-2"));
c.add(new ClockCanvas("Taipei", "GMT+8"));
c.add(new ClockCanvas("Berlin", "GMT+1"));
c.add(new ClockCanvas("New York", "GMT-5"));
c.add(new ClockCanvas("Cairo", "GMT+2"));
c.add(new ClockCanvas("Bombay", "GMT+5"));

interface TimerListener
{ void timeElapsed(Timer t);
}
class Timer extends Thread
{ public Timer(int i, TimerListener t)
{ target = t;
interval = i;
setDaemon(true);
}
public void run()
{ try
{ while (!interrupted())
{ sleep(interval);
target.timeElapsed(this);
}
}
catch(InterruptedException e) {}
}
private TimerListener target;
private int interval;

94

Java bsico 2

}
class ClockCanvas extends JPanel
implements TimerListener
{ public ClockCanvas(String c, String tz)
{ city = c;
calendar = new GregorianCalendar(TimeZone.getTimeZone(tz));
Timer t = new Timer(1000, this);
t.start();
setSize(125, 125);
}
public void paintComponent(Graphics g)
{ super.paintComponent(g);
super.setBackground(Color.white);
g.drawOval(0, 0, 100, 100);
double hourAngle = 2 * Math.PI
* (seconds - 3 * 60 * 60) / (12 * 60 * 60);
double minuteAngle = 2 * Math.PI
* (seconds - 15 * 60) / (60 * 60);
double secondAngle = 2 * Math.PI
* (seconds - 15) / 60;
g.drawLine(50, 50, 50 + (int)(30
* Math.cos(hourAngle)),
50 + (int)(30 * Math.sin(hourAngle)));
g.drawLine(50, 50, 50 + (int)(40
* Math.cos(minuteAngle)),
50 + (int)(40 * Math.sin(minuteAngle)));
g.drawLine(50, 50, 50 + (int)(45
* Math.cos(secondAngle)),
50 + (int)(45 * Math.sin(secondAngle)));
g.drawString(city, 0, 115);
}
public void timeElapsed(Timer t)
{ calendar.setTime(new Date());
seconds = calendar.get(Calendar.HOUR) * 60 * 60
+ calendar.get(Calendar.MINUTE) * 60
+ calendar.get(Calendar.SECOND);
repaint();
}
private
private
private
private
}

int seconds = 0;
String city;
int offset;
GregorianCalendar calendar;

private final int LOCAL = 16;

Tratamento de Regies Crticas com Threads


O problema de regies crticas em certas aplicaes deve ser considerado para que no
exista erro no processamento de dados. Tais erros ocorrem devido falta de controle de
acesso a recursos sem o devido controle de compartilhamento. Suponha que voc esteja
desenvolvendo uma aplicao java onde duas ou mais threads tentam executar
simultaneamente uma instruo de adio da saldo monetrio a uma conta corrente. Vale
lembrar que estas so operaes atmicas, sendo que a instruo de adio poderia ser
processada da seguinte forma pelas threads:
1.
2.

Carregue saldo da conta corrente em um registrador;

Adicione o novo valor monetrio ao saldo da conta corrente;

Java bsico 2

95

3.

Mova o resultado do atualizado saldo da conta corrente para a varivel em memria

O problema que, durante a execuo de uma das threads, por exemplo, a primeira, esta
conseguisse executar apenas as etapas 1 e 2, sendo interrompida logo a seguir. Neste ponto
uma segunda thread iniciaria a sua execuo e modificaria os valores de entrada para a
primeira thread. Quando a primeira thread voltar a ser executada, o total monetrio para o
saldo da conta corrente no estaria mais correto, gerando problemas de consistncias de
dados manipulados pela aplicao desenvolvida.

Para que esse tipo de problema no ocorra, devemos ter alguma garantia de que, quando
uma thread comear a inserir um elemento no buffer, ela poder completar a operao sem
ser interrompida. A maioria dos ambientes de programao foram os programadores a
mexer com os chamados semforos e regies crticas para obter acesso sem interrupo a
um recurso. J a linguagem de programao Java disponibiliza um recurso inspirado nos
monitores inventados por Tony Hoare. Para tanto, basta que qualquer operao
compartilhada por vrias threads seja marcada como synchronized, da seguinte forma:
Public synchronized void transferir_saldo(int de, int para, int quantia){
//implementar funcionalidades do mtodo

Com isso, a aplicao desenvolvida em Java consegue garantir que, qualquer thread que
inicie a execuo de um mtodo sincronizado conclua a sua execuo ante que outra thread
passe executar o mesmo mtodo sobre o mesmo objeto. O mtodo sincronizado desativa
automaticamente a chamada da segunda thread e fica em espera at que o mtodo seja
liberado para execuo. Essa espera ocorre numa fila de espera onde so colocadas as
threads que esto esperando para manipular o objeto que est sendo utilizado atravs de
mtodos sincronizados. Esta fila obedece a uma ordem de prioridade existente dentre as
threads que se encontram nela.
Em java, os responsveis por bloquear e notificar quando um objeto est disponvel so os
objetos monitores. Esses objetos so instncias de classes que implementam um ou mais
mtodos sincronizados.

O problema que existem aplicaes que possam querer que threads que estejam com
acesso exclusivo a um determinado objeto de uma aplicao seja interrompida para que os
valores de terminados atributos satisfaam as necessidades da aplicao (por exemplo, s
transferir saldo entre contas se a conta de origem tiver saldo suficiente). Para tanto, torna-se
necessrio o uso do mtodo wait().
Quando uma thread chama o mtodo wait() dentro de um mtodo sincronizado, ela
desativada sendo colocada na fila de espera para o objeto em questo. Com isso, outras
threads passaram a ter acesso ao objeto. Com isso, esperasse que dentro de um determinado
tempo de execuo da aplicao o objeto passe a ter saldo suficiente para executar a
transferncia e, atravs do mtodo notify() o java desperta a thread original que esperava
pela chance de executar sua funcionalidade.
O ponto a se considerar que o mtodo notify() dever ser chamado por alguma outra
thread que esteja trabalhando sobre o objeto em questo, pois as threads em espera no so

96

Java bsico 2

ativadas automaticamente quando nenhuma outra thread est trabalhando no objeto. Como
resultado de implementao teramos o teste de condio e ao de transferncia dentro do
mesmo mtodo synchronized, como mostrado abaixo:
Public synchronized void transferir_saldo(int de, int para, int quantia){
While(saldo < quantia){
Wait();
}
//transferir fundos
}

Um Resumo do Funcionamento do Mecanismo de Sincronismo


Apresentamos a seguir um resumo do funcionamento do mecanismo de sincronismo para
controle de concorrncia em threads sobre um determinado objeto da aplicao:
1.

Para chamar um mtodo synchronized, o parmetro implcito no pode ser bloqueado. Chamar
o mtodo bloqueia o objeto. Retornar da chamada desbloqueia o objeto parmetro implcito.
Assim, apenas uma linha de execuo por vez pode executar mtodos synchronized em um
objeto especfico.

2.

Quando uma linha de execuo executa uma chamada wait(), ela renuncia ao bloqueio do
objeto e entre em uma lista de espera.

3. Para remover uma linha de execuo da lista de espera, alguma outra linha de execuo deve
fazer uma chamada a notifyAll() ou notify(), no mesmo objeto.
As regras de agendamento so incontestavelmente complexas, mas realmente muito
simples coloc-las em prtica. Basta seguir estas quatro regras:
1.

Se duas ou mais linhas de execuo modificam um objeto, declare os mtodos que realizam as
modificaes como synchronized. Os mtodos somente de leitura que so afetados por
modificadores de objeto tambm ser synchronized.

2.

Se uam linha de execuo precisa esperar que o estado de um objeto mude, ele deve esperar
dentro do objeto, e no fora, entrando em um mtodo synchronized e chamando wait().

3.

Quando um mtodo muda o estado de um objeto, ele deve chamar notifyAll(). Isso d s
linhas de execuo que esto esperando uma chance de ver se as circunstncias mudaram.

4.

Lembre-se de que wait() e notify()/notifyAll() so mtodos da classe Object e no da classe


Thread. Confira se suas chamadas a wait() correspondem a uma notificao no nomes de
objetos.

Java bsico 2

97

Exerccios de Fixao 10 Thread


Os comandos a seguir esto corretos ou no? Justifique.
Thread myThread = new Thread() ;
myThread.run() ;

Atividade 1 Thread
1.

2.

3.
4.

98

Escreva um programa que instancie e inicie duas threads: uma que conta at 10 e outra
que conta at 20, atravs do mtodo construtor.

Implemente uma classe Fila cujos mtodos acrescentar e remover so sincronizados. O


tamanho da fila 10. Fornea uma thread, chamada produtor, que insira um dado de
valor aleatrio (de 1 a 50) continuamente. Quando a fila ficar cheia, a thread espera.
Fornea uma segunda thread, chamada consumidor, que remova um dado da fila e
imprima seu valor continuamente, contanto que a fila no esteja vazia. Quando a fila
estiver vazia, a thread espera. Tanto a thread consumidor quanto a produtor devem
executar 50 iteraes.
Fazer um programa em Java que implemente uma classe Java que possibilite a instncia
de objetos da classe Pessoa (nome, idade e sexo) e posterior gravao dos mesmos num
arquivo em disco. Os objetos instanciados devero ser ativados com tempos aleatrios
de pausa e possibilitar a gravao dos mesmos em arquivo.
Fazer um programa em Java que implemente mtodos de leitura e clculos serializados
para objetos de consulta distintos que sero ativados atravs de uma interface JFrame
que iro consultar o arquivo gerado no exerccio 2 para calcular e responder o total de
pessoas do sexo feminino e a mdia geral de idades das pessoas cadastradas.

Java bsico 2

Atividade 2 Thread
1.

2.

Construa, na forma de Thread, uma classe capaz de realizar a ordenao de um array de


valores do tipo double (passado como argumento ao construtor). A ordenao pode ser
feita com o mtodo sort da classe Array ou ento implementada com qualquer mtodo
direto de ordenao (bubble sort, por exemplo). Escreva um programa que seja capaz de
criar vrias dessas threads, passando arrays de tamanho determinado pelo usurio e
preenchidos com valores aleatrios entre 0 e o tamanho do prprio array.
Fazer um programa em Java que implemente uma classe Java que possibilite a instncia
de 4 objetos onde cada um possibilitar a realizao de um dos quatro clculos
numricos bsicos entre dois nmeros. Os objetos devero ser instancias de uma classe
extends Thread que dever receber os nmeros e o sinal da operao bsica como
parmetro e escrever o resultado do clculo. Durante a chamada devero ser informados
tempos aleatrios de pausa na execuo dos objetos.

Java bsico 2

99

Bibliografia
DEITEL. Java Como Programar. 6a. ed. So Paulo: Pearson Prentice Hall, 2005.

HORSTMANN, Cay. CORNELL, Gary. Core Java 2 Fundamentals. The Sun Microsystems
Press Java Series. Vol. I. 2003.
JANDL Junior, Peter. Java Guia do Programador. So Paulo: Novatec, 2007.

POSTGRESQL. The Java Tutorials. Disponvel em:


http://docs.PostgreSQL.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.

100

Java bsico 2

Você também pode gostar