Escolar Documentos
Profissional Documentos
Cultura Documentos
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
Java bsico 1
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
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).
Java bsico 1
Java bsico 1
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
Dadas 4 notas de um aluno, informar se ele est aprovado ou reprovado, considerando a mdia
de aprovao igual ou superior a 7.
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
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?
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
12
Java bsico 1
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
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
Java bsico 1
15
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
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.
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.
20
Java bsico 1
Nome
Valor Unicode
\b
Backspace
\u0008
\t
Tabulao
\u0009
\n
Linefeed
\u000A
\r
Carriage return
\u000D
Aspas duplas
\u0022
\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
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;
+=
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;
-=
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;
*=
x *= 10; // x = x * 10
Diviso, inteira
x = 5 / 10;
x = 5.0 / 10.5;
/=
x /= 10; // x = x / 10
Resto da diviso
x = 5 % 10;
%=
x %= 10; // x = x % 10
++
--
23
Operador
Significado
Exemplo
==
Igual
if (x == 10) ...
!=
Diferente
if (x != 10) ...
>
Maior
>=
Maior ou igual
<
Menor
<=
Menor ou igual
&&
E lgico
||
Ou lgico
No lgico
?:
Condicional ternrio
x = (y==10) ? 0 : 1; // se
y==10, x recebe 0, seno
recebe 1
24
Operador
Significado
Exemplo
&
E bit a bit
x = y & 32;
&=
Ou bit a bit
x = y | 32;
|=
x |= 32; // x = x | 32
Ou exclusivo (XOR)
x = y ^ 32;
^=
x ^= 32; // x = x ^ 32
x = ~y;
>>
>>=
x >>= 3; // x = x >> 3
<<
<<=
x <<= 3; // x = x << 3
>>>
x = y >>> 3;
Java bsico 1
Operador
Significado
Exemplo
>>>=
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) ...
26
Java bsico 1
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?
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.
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.
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)
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.
Operao
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 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
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
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.
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 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
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.
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
Byte
Byte
byte ou String
Short
Short
short ou String
Java bsico 1
45
Tipo primitivo
Classe wrapper
Int
Integer
int ou String
Long
Long
long ou String
Float
Float
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.
46
Java bsico 1
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
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.
Significado
Dgito
Sinal de menos
Separador de agrupamento
Java bsico 1
49
Symbol
Significado
\u2030
'
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
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.
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.
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.
55
Nesse caso, o objeto carro da classe carro est sendo passado como parmetro para o
mtodo estacionar do objeto estacionamento.
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
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.
59
Java bsico 1
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()
Java bsico 1
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
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 bsico 1
Java bsico 1
65
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
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
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
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
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++.
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
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
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.
Para voc, os recursos de POO facilitam a organizao, proteo e acesso aos recursos de uma
aplicao Java em desenvolvimento?
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).
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).
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.
84
Java bsico 1
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
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.
Java bsico 1
Um conjunto representado pela interface Set e tem como suas principais implementaes as
classes HashSet, LinkedHashSet e TreeSet.
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
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.
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
90
a.
b.
c.
d.
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
Rio de Janeiro
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
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:
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.
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
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);
}
}
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:
Por exemplo:
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 class HelloWorld {
public static void main(String[] args) {
JFrame frame = new HelloWorldFrame();
frame.show();
}
}
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);
g.setColor(Color.pink);
g.drawString(Hello, 75, 100);
g.setColor(new Color(0, 128, 128));
g.drawString(World, 75, 125);
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);
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:
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:
Java bsico 2
11
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
12
Java bsico 2
ccField.requestFocus();
Eventos de Teclado
Outros mtodos podem ser sobrepostos como keyReleased, que diz quando uma tecla foi
liberada.
Eventos de Mouse
13
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;
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.
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.
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.
Java bsico 2
17
Por exemplo:
...
}
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
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);
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.
Box b = Box.createVerticalBox();
Depois, adicionam-se elementos de maneira usual:
b.add(okButton);
b.add(cancelButton);
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
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.
Por exemplo:
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.
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.
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;
Java bsico 2
Java bsico 2
23
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.
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 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:
25
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.
reas de Texto
reas de texto podem ser criadas atravs do seguinte exemplo:
26
Java bsico 2
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;
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
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);
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);
...
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.
c.
Entalhe (etched)
b.
d.
e.
f.
Fosco (matte)
Vazio (empty)
2.
Se
quiser,
adicione
um
ttulo
borda,
BorderFactory.createTitledBorder(String).
4.
3.
passando-o
combinar
ao
mtodo
bordas
com
Por exemplo:
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
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:
Java bsico 2
31
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
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.
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);
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)) ...
...
}
}
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:
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:
popup.show(painel, x, y);
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:
36
Java bsico 2
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:
Para se criar uma janela de dilogo prpria, como a janela sobre, deve-se derivar uma classe
de JDialog.
37
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.
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.
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
java.applet.Applet ou javax.swing.JApplet
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.
40
Java bsico 2
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.
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.
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
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
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
O applet apresentado no item 2.2 est completo, tal como est. O nico mtodo substitudo
o mtodo de pintura paint().
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>.
43
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;
A exibio de um applet em uma pgina HTML pode ser feita com o uso da tag e APPLET e
pela tag 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.
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.
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.
46
Java bsico 2
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.
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.
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.
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.
Java bsico 2
47
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
49
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 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)
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
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.
5.
Java bsico 2
53
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
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:
Java bsico 2
Tentar encontrar um objeto Class atravs de uma string que no denota uma classe
existente.
Java bsico 2
57
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.
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.);
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();
}
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.
2.
3.
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
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.
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.
b.
c.
5.
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?
Leitura/Escrita de Dados
Serializao de Objetos
Outros
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.
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.
Java bsico 2
63
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.
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.
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.*;
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.*;
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
Java bsico 2
69
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
bruto maior ou igual a 1000, 3% sobre o salrio bruto; caso contrrio, 1% sobre o salrio
6.
de identificao, nome e o tempo gasto em cada uma das 5 provas que formam a
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
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
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:
Java bsico 2
73
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
}
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";
Obtendo Conexes
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");
Java bsico 2
75
Sesso 07 JDBC
Exerccios de Fixao 7 Java JDBC
Quais as principais diferenas dos objetos Statement e PreparedStatement?
76
Java bsico 2
3.
4.
5.
6.
7.
8.
9.
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.
77
12. Para cada departamento, recupere o nome do departamento e a mdia salarial de todos
os empregados que trabalham nesse departamento.
1.
2.
4.
3.
5.
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:
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.
pstmt.executeUpdate();
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
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
devem ficar armazenados em uma tabela no PostgreSQL e a cada vez que for solicitado, o
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
Defina um novo banco de dados no PostgreSQL que dever possuir trs tabelas. A
JDBC:
80
Java bsico 2
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 [,, ...]}
Fechando Recursos
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();
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:
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?
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.
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.
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
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
3.
de identificao, nome e o tempo gasto em cada uma das 5 provas que formam a
84
Java bsico 2
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?
Threads em Java
Sincronizao
Programao concorrente
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:
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.
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.
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
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.
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
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
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
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
Thread.currentThread().suspend ();
7
8
9
-------------------------------------------------------------------------------10
...
12
11
13
14
15
16
Thread.sleep(1000);
18
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
Java bsico 2
91
Como s vezes obrigatrio implementar Runnable, voc pode preferir fazer sempre
dessa forma, por uma questo de consistncia.
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.
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
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.
java.awt.*;
java.awt.event.*;
javax.swing.*;
java.util.*;
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;
Java bsico 2
95
3.
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
}
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.
Java bsico 2
97
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.
Java bsico 2
Atividade 2 Thread
1.
2.
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.
SIERRA, Kathy; BATES, Bert. Certificao Sun Para Programador Java 6 Guia de Estudo.
So Paulo: Rio de Janeiro, 2008.
100
Java bsico 2