Você está na página 1de 199

Java bsico 1

Paulo Henrique Cayres

Rio de Janeiro Escola Superior de Redes 2013

Java bsico 1

Java bsico 1

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

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

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

Java bsico 1

iii

iv

Java bsico 1

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

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

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

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

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

Mtodo para a Construo de Algoritmos


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

Java bsico 1

Figura 1.1 Passos lgicos para desenvolvimento de programas. Para a construo de qualquer tipo de algoritmo so necessrios os passos descritos a seguir: 1. ler atentamente o enunciado, destacando os pontos mais importantes; 2. definir os dados de entrada, ou seja, quais dados sero fornecidos; 3. definir o processamento, ou seja, quais clculos sero efetuados e quais as restries para esses clculos. O processamento responsvel por transformar os dados de entrada em dados de sada; 4. definir os dados de sada, ou seja, quais dados sero gerados depois do processamento; 5. construir o algoritmo; 6. testar o algoritmo realizando simulaes. De posse deste mtodo, ns podemos observar vrias situaes do dia-a-dia e imaginarmos uma sequncia de passos lgicos para solucionarmos, conforme os exemplos descritos a seguir:

Java bsico 1

Soma de dois nmeros inteiros Passo 1 ler os dois nmeros Passo 2 somar os dois nmeros Passo 3 escrever o resultado do somatrio dos dois nmeros Sacar dinheiro no caixa eletrnico Passo 1 Ir at um caixa eletrnico Passo 2 Inserir o carto no leitor de cartes Passo 3 Informar a quantia que deseja sacar Passo 4 Retirar a quantia informada caso tenha saldo disponvel Passo 5 Retirar o carto Passo 6 Sair do caixa eletrnico

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

Java bsico 1

Exerccios de Fixao 1 Lgica de Programao


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

Dadas 4 notas de um aluno, informar se ele est aprovado ou reprovado, considerando a mdia de aprovao igual ou superior a 7.

Calcular e escrever o resultado da multiplicao de trs nmeros.

Java bsico 1

2
Histrico da linguagem de programao Java
A linguagem Java comeou em 1991, quando um grupo de engenheiros da Sun, liderados por Patrick Naughton, Sun Fellow e James Gosling, quiseram projetar uma pequena linguagem de programao que pudesse ser usada em equipamentos de consumo como caixas de comutao de TV a cabo. Com esses dispositivos no tinham uma grande capacidade de processamento ou memria, a linguagem tinha de ser pequena para gerar um cdigo bem limitado em tamanho. Alm disso, como fabricantes diferentes podiam escolher CPUs diferentes, era importante no ficar preso a uma nica arquitetura. O projeto recebeu o nome de Green (HORSTMANN, 2003). As exigncias de um cdigo pequeno e compacto levaram a equipe a ressuscitar o modelo de uma linguagem chamada UCSD Pascal que havia tentado nos primrdios dos PCs e da qual Niklaus Wirth havia sido pioneiro. O que Wirth havia desbravado, que o UCSD Pascal fez comercialmente e que os engenheiros do projeto Green tambm adoraram foi projetar uma linguagem portvel que gerava cdigo intermedirio para uma linguagem hipottica. (Estas so frequentemente chamadas de mquinas virtuais). Esse cdigo intermedirio poderia ento ser usado em qualquer mquina que tivesse o interpretador correto. O cdigo intermedirio gerado nesse modelo sempre pequeno e os interpretadores de cdigo intermedirio podem ser bastante pequenos, de modo que isso resolvia o problema principal que eles tinham. J o pessoal da Sun, que tinha experincia com UNIX, baseou sua linguagem no C++ em vez do Pascal. Em particular, eles fizeram a linguagem orientada a objetos em vez de orientada a procedimentos. Porm, como Gosling diz na entrevista, Desde o incio, a linguagem era uma ferramenta, no o fim. Gosling decidiu chamar essa linguagem de Oak (presumivelmente porque ele gostava da aparncia de um carvalho, oak em ingls, que ficava bem frente de sua janela na Sun). O pessoal da Sun, mais tarde descobriu que Oak era o nome de uma linguagem de computador j existente, de modo que trocaram o nome para Java. Em 1992, o projeto Green apresentava seu primeiro produto, chamado *7. Ele era um controle remoto extremamente inteligente. (Tinha o poder de uma SPARC station numa caixa de 15 x 10 x 10 cm). Infelizmente, ningum estava interessado em produzi-lo na Sun e o pessoal do projeto Green teve que procurar outras formas de comercializar a tecnologia. Mesmo assim, nenhuma das empresas de equipamentos eletrnicos de consumo estava interessada. O grupo ento ofereceu um projeto de construo de uma caixa de TV a cabo que pudesse lidar com novos servios de cabo como vdeo sob demanda. Eles no conseguiram o contrato. (Ironicamente, a empresa que o fez era liderada por Jim Clark, que comeou a Netscape uma empresa que fez muito pelo sucesso da linguagem Java). O projeto Green (com o novo nome de First Person Inc.) gastou todo o ano de 1993 e a metade de 1994 procurando quem comprasse sua tecnologia. Ningum quis. (Patrick Naughton, um dos fundadores do grupo e a pessoa que acabou fazendo a maior parte da comercializao, afirma 6 Java bsico 1

que acumulou mais de 300000 milhas em viagens areas tentando vender a tecnologia). A First Person foi dissolvida em 1994. Enquanto tudo isso ocorria na Sun, a parte World Wide Web da internet estava crescendo cada vez mais. A chave para a Web o navegador (browser) que converte a pgina de hipertexto para a tela. Em 1994, a maioria usava Mosaic, um navegador Web no comercial que surgiu no centro de supercomputao da Universidade de Illinois, em 1993. (O Mosaic foi parcialmente escrito por Marc Andreessen por U$ 6.85 a hora como estudante de ps-graduao em um projeto acadmico. Ele passou para a fama e a fortuna como um dos co-fundadores e cabea do grupo Netscape.) Em uma entrevista para a SunWorld, Gosling disse que na metade de 1994 os desenvolvedores de linguagem perceberam que Ns podamos elaborar um navegador bom de verdade. Isso era uma das poucas coisas do processo cliente/servidor que precisava de algumas das coisas esquisitas que havamos feito: neutralidade de arquitetura, tempo real, confiabilidade, segurana questes que no eram terrivelmente importantes no mundo das estaes de trabalho. Assim, construmos um navegador. O navegador em si foi elaborado por Patrick Naughton e Jonathan Payne e evoluiu at o navegador HotJava existente hoje em dia. Este foi escrito em Java para mostrar seu poder. Mas os responsveis pela sua elaborao tambm tiveram em mente o poder do que agora chamamos de applets, de modo que eles fizeram o navegador capaz de interpretar os bytecodes intermedirios. Essa demonstrao de tecnologia foi exibida na SunWorld 95 em 23 de maio de 1995 e inspirou a moda Java que continua at hoje. A grande jogada que espalhou a utilizao da linguagem Java ocorreu na primavera de 1995 (hemisfrio sul), quando a Netscape decidiu fazer a verso 2.0 do navegador Netscape com capacidade Java. O Netscape 2.0 foi lanado em janeiro de 1996 e tinha capacidade Java (assim como todas as verses posteriores). Outros licenciados incluram empresas IBM, Symantec, Inprise e outras. At mesmo a Microsoft foi licenciada e deu suporte linguagem Java. O Internet Explorer tem capacidade Java e o Windows contm uma mquina virtual Java. (Note-se, porm que a Microsoft no suporta a verso mais recente da linguagem Java, e que sua implementao difere do Java padro). A Sun lanou a primeira verso da linguagem Java no incio de 1996. Ela foi seguida pelo Java 1.02 alguns meses depois. As pessoas rapidamente perceberam que o Java 1.02 no seria usado no desenvolvimento de aplicativos srios. Certamente algum poderia usar o Java 1.02 para fazer um applet de texto nervoso (que move o texto ao acaso na tela). Mas no era possvel sequer imprimir em Java 1.02! Para ser franco, o Java 1.02 no estava pronto para o horrio nobre. Os grandes anncios sobre os futuros recursos da linguagem Java apareceram nos primeiros meses de 1996. Somente a conferncia JavaOne, ocorrida em San Francisco em maio de 1996, apresentou um quadro completo mais claro de para onde o Java estava indo. No JavaOne, o pessoal da Sun Microsystems esboou sua viso do futuro da linguagem Java com uma srie aparentemente sem fim de aprimoramentos e novas bibliotecas. Havia a desconfiana de que isso levaria anos para acontecer. No foi o que aconteceu porque num prazo relativamente curto a maioria das coisas prometidas tinham sido implementadas. Java bsico 1 7

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 9

do bytecode. So os compiladores JIT vistos acima que chegam a acelerar 10 a 20 vezes a execuo de um programa.

Suporte para Programao de Sistemas Distribudos


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

Exerccios de Fixao 2 Histrico da linguagem de programao Java


Liste as principais caractersticas da linguagem de programao Java.

10

Java bsico 1

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

Voc j desenvolveu programas? Que linguagem de programao utilizou?

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

Java bsico 1

11

Figura 3.1 Estrutura da linguagem Java.

Recursos da Linguagem Java


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

Mquina Virtual Java


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

12

Java bsico 1

Figura 3.2 Especificao da JVM Java.

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

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

Java bsico 1

13

Figura 3.3 Segurana de cdigo em Java.

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

14

Java bsico 1

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

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

Java bsico 1

15

Alguns cuidados ao escrever e executar programas Java


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

Comentrios
Os comentrios podem ser ou de uma linha (//) ou de vrias linhas (/* e */). Por Exemplo: // imprime na tela comentrio de uma linha System.out.printl(Hello World!!!); 16 Java bsico 1

/* Aqui sera impresso uma linha de texto na tela: Hello World!!! */ System.out.printl(Hello World!!!); Existe ainda um terceiro tipo de comentrio, utilizado para documentao automtica do programa em desenvolvimento pela ferramenta javadoc do Java. Neste caso, devemos utilizar /** para comear e */ para terminar os textos que sero utilizados no processo de criao dos arquivos de documentao do programa em desenvolvimento. Os comentrios devem estar localizados imediatamente antes da definio da classe ou membro comentado. Cada comentrio pode conter uma descrio textual sobre a classe ou membro, possivelmente incluindo tags HTML, e diretrizes para javadoc. As diretrizes para javadoc so sempre precedidas por @, como em: @see nomeClasseOuMembro: gera na documentao um link para a classe ou membro especificado, precedido pela frase "See also ". A documentao de uma classe pode incluir as diretrizes: @author: inclui informao sobre o autor na documentao. @version: inclui informao sobre a verso na documentao. A documentao de um mtodo pode incluir as diretrizes: @param nome descrio para a descrio de argumentos. @return descrio para a descrio do valor de retorno. @exception nomeClasseExceo: descrio para a descrio de excees lanadas pelo mtodo. Apresentamos, a seguir, um exemplo de cdigo java com comentrios para gerao de documentao pelo javadoc: /** * @(#)PrimeiroExemplo.java * * * @author Paulo Henrique Cayres * @version 1.00 2010/3/2 */

public class PrimeiroExemplo { public static void main(String args[]) { System.out.println("Meu primeiro Programa em Java."); } } Java bsico 1 17

Como resultado o javadoc ir gerar arquivos html com a estrutura de classes presente nos pacotes de classes do projeto em desenvolvimento. A figura seguinte apresenta o resultado da documentao de uma classe aps a execuo do javadoc.

Figura 3.6 Documentao de classes Java pelo javadoc.

Exerccio de Fixao 3 Linguagem de Programao


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

18

Java bsico 1

Variveis Exerccios de nivelamento 3 - Variveis


Voc sabe como o computador armazena informaes na memria?

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

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

Java bsico 1

19

Inteiros
So nmeros sem parte fracionria. Veja a tabela a seguir: Tipo Byte short Int Long Armazenamento 8 bits 1 byte 16 bits 2 bytes 32 bits 4 bytes 64 bits 8 bytes Intervalo -128 a 127 -32.768 a 32.767 -2.147.483.648 a 2.147.483.687 -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 Float Double Armazenamento 32 bits 4 byte 64 bits 8 bytes Intervalo Aproximadamente 3.40282347E+38F (6-7 dgitos decimais significativos) Aproximadamente 1.79769313486231570E+308 (15 dgitos significativos)

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

Tipo Caractere, char


Apstrofes, ou aspas simples, so usados para denotar constantes char. Deve-se tomar cuidado com a diferena: H : caractere H H : string contendo um s caractere Em Java, o tipo caractere representado em Unicode. Normalmente no se precisa saber como funciona o Unicode, exceto se for necessrio escrever aplicativos internacionais. Isto , o Unicode foi desenvolvido para poder representar todos os caracteres de todos os idiomas possveis do planeta. Para isso possui 2 bytes, sendo assim, permitindo representar at 65536 caracteres, mas atualmente cerca de 35000 somente esto sendo usados. No formato ASCII/ANSI, somente 1 byte utilizado, com um total de 256 caracteres. Em Unicode, isso representado pelos primeiros 255 caracteres.

20

Java bsico 1

Os caracteres Unicode seguem uma codificao em hexadecimal que vai de \u0000 a \uffff, sendo os caracteres de \u0000 at \u00ff os caracteres ASCII j conhecidos. O prefixo \u significa a codificao Unicode. Alm dessa codificao, existe um conjunto de caracteres de controle vlidos, conforme apresentado na tabela a seguir: Sequncia \b \t \n \r \ \ \\ \b Nome Backspace Tabulao Linefeed Carriage return Aspas duplas Apostrofe (aspas simples) Barra invertida Backspace Valor Unicode \u0008 \u0009 \u000A \u000D \u0022 \u0027 \u005c \u0008

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

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

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

Java bsico 1

21

Converses entre Tipos Numricos


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

Constantes
Para se definir uma constante em Java, usa-se a palavra chave final: public class UsaConstantes { public static void main(String[] args) { final double CM_POR_SOL = 2.54; double largPapel = 8.5; double altPapel = 11; System.out.println(Tamanho papel em cm: + largPapel * CM_POR_SOL + por + altPapel * CM_POR_SOL); } } A palavra chave final significa que a varivel s pode receber valor uma vez, e fica definido para sempre. costume dar nomes totalmente em maisculas para constantes.

22

Java bsico 1

O mais comum em Java declarar uma constante e fazer com que ela fique disponvel para vrios mtodos dentro de uma classe. So geralmente chamadas de constantes de classe. Podese defini-las atravs das palavras-chave static final. public UsaConstante2 { public static final double G = 9.81; public static void main(String[] args) { System.out.println(G + metros por Segundo ao quadrado.); } }

Operadores
Segue uma tabela com os operadores aritmticos: Operador + += ++ -= -* *= / /= % %= Significado Soma Soma com atribuio Incremento de 1, aps Incremento de 1, antes Subtrao Subtrao com atribuio Decremento de 1, aps Decremento de 1, antes Multiplicao Multiplicao com atribuio Diviso, inteira Diviso com ponto flutuante Diviso com atribuio Resto da diviso Resto da diviso com atribuio Exemplo x = 5 + 10; x += 10; // x = x + 1 x++; // x = x + 1 ++x; // x = x + 1 x = 5 10; x -= 10; // x = x 10 x--;. // x = x 1 --x;. // x = x 1 x = 5 * 10; x *= 10; // x = x * 10 x = 5 / 10; x = 5.0 / 10.5; x /= 10; // x = x / 10 x = 5 % 10; x %= 10; // x = x % 10

A exponenciao feita atravs da funo pow da classe Math, encontrada em java.lang. Exemplo: double y = Math.pow(x, a); O mtodo pow recebe parmetros double e retorna um double tambm. Segue uma tabela com os operadores Lgicos e Relacionais: Java bsico 1 23

Operador == != > >= < <= && || ! ?:

Significado Igual Diferente Maior Maior ou igual Menor Menor ou igual E lgico Ou lgico No lgico Condicional ternrio

Exemplo if (x == 10) ... if (x != 10) ... if (x > 10) ... if (x >= 10) ... if (x < 10) ... if (x <= 10) ... if (x > 10) && (x < 20) ... if (x > 10) || (x < 20) ... if (!(x > 10)) ... x = (y==10) ? 0 : 1; // se y==10, x recebe 0, seno recebe 1

Segue uma tabela com os operadores de bit a bit: Operador & &= | |= ^ ^= ~ >> >>= << <<= >>> 24 Java bsico 1 Significado E bit a bit E bit a bit com atribuio Ou bit a bit Ou bit a bit com atribuio Ou exclusivo (XOR) Ou exclusivo com atribuio Negao bit a bit Deslocamento de bits direita, estendendo o sinal Deslocamento de bits direita, estendendo o sinal, com atribuio Deslocamento de bits esquerda Deslocamento de bits esquerda, com atribuio Deslocamento de bits direita, com preenchimento de zeros Exemplo x = y & 32; x &= 32; // x = x & 32 x = y | 32; x |= 32; // x = x | 32 x = y ^ 32; x ^= 32; // x = x ^ 32 x = ~y; x = y >> 3; // desloca 3 bits direita x >>= 3; // x = x >> 3 x = y << 3; // desloca 3 bits esquerda x <<= 3; // x = x << 3 x = y >>> 3;

Operador >>>=

Significado Deslocamento de bits direita, com preenchimento de zeros, com atribuio

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

Manipulando dados em Java


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

26

Java bsico 1

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

Exerccios de Fixao 4 Variveis


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

Quais so as trs principais funcionalidades que um programa deve apresentar para possibilitar a manipulao e gerao de informaes tendo como base um conjunto de dados fornecidos?

Atividade 1 Variveis e manipulao de dados


1. Faa uma classe executvel que dados o valor do depsito em uma poupana e a taxa de juros, informe a valor do rendimento (lucro) e o valor final (saldo resultante).

Java bsico 1

27

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

Atividade 2 Variveis e manipulao de dados (Complementar)


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

28

Java bsico 1

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

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

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

Escopo de um Bloco de comandos


Um bloco de comandos consiste de vrios comandos agrupados com o objetivo de relacion-los com determinado comando ou funo em busca da soluo de um problema. Podemos utilizar blocos de comandos em instrues como if, for, while, switch e em declaraes de funes para permitir que instrues faam parte de um contexto desejado que permita solucionar um problema. Blocos de comandos em Java so delimitados pelos caracteres { e }. A utilizao dos delimitadores de bloco em uma parte qualquer do cdigo no relacionada com os comandos citados ou funes no produzir efeito algum, e ser tratada normalmente pelo interpretador. Java bsico 1 29

Pode-se inclusive aninhar blocos, isto , blocos dentro de blocos. A restrio que no se pode declarar variveis com mesmo nome dentro de blocos aninhados. Exemplo: public static void main(String[] args) { int n; { int k; int n; // erro!!! Variveis com mesmo nome } }

Estruturas de Deciso
Tambm chamadas de estruturas condicionais, os comandos de seleo permitem executar instrues ou blocos de comandos com base em testes lgicos feitos durante a execuo de um programa.

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

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

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

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

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

Exerccio de Fixao 5 Estruturas de Deciso


1. Crie uma classe executvel Java que leia dois nmero e imprima o menor. 2. Crie uma classe executvel Java que receba dois nmeros e execute as operaes listadas abaixo de acordo com a escolha do usurio. Escolha do usurio 1 2 3 4 Operao Mdia entre os nmeros digitados Diferena do maior pelo menor Produto entre os nmeros digitados Diviso do primeiro pelo segundo

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

32

Java bsico 1

Estruturas de Repetio Exerccio de nivelamento 5 Estruturas de Repetio


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

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

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

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

Comando do ... while


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

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

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

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

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

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

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

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

36

Java bsico 1

Exerccios de Fixao 6 Controle de fluxo


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

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

Atividade 1 Controle de fluxo


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

Atividade 2 Controle de fluxo (complementar)


1. Faa uma classe executvel que calcule e imprima o somatrio dos nmeros pares existentes entre 100 e 500. 2. Faa uma classe executvel que calcule e imprima o somatrio dos nmeros impares existentes em 300 e 700. 3. Faa uma classe executvel que dado um nmero, informe se ele divisvel por 5. 4. Uma prefeitura abriu uma linha de crdito para seus funcionrios. O valor mximo da prestao no poder ultrapassar 25% do salrio bruto. Faa uma classe executvel que dados o valor do salrio bruto e o valor da prestao, informe se o emprstimo pode ou no ser concedido.

Java bsico 1

37

5. Faa uma classe executvel que dados os limites de um intervalo [a; b], informe a soma de todos os nmeros naturais neste intervalo. Exemplo: [4, 7] => 4+5+6+7=22.

38

Java bsico 1

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

Definio
Um array uma varivel composta homognea unidimensional formada por uma sequncia de valores, todas do mesmo tipo, com o mesmo identificador (mesmo nome) e alocadas sequencialmente na memria. Uma vez que os valores so alocados sequencialmente e tem o mesmo nome, a forma utilizada para acess-los e atravs de um ndice, que referencia a localizao de um valor dentro da estrutura onde ele est armazenado. Arrays so objetos em Java que possibilitam o armazenamento de dados primitivos. Arrays servem para manipular uma grande quantidade de dados sem que se precise declarar vrias variveis do mesmo tipo. Aprender a usar arrays sempre um problema em qualquer linguagem de programao. Isso porque envolve uma srie de conceitos, sintaxe e outras definies de manipulao de endereo de memria no computador. No Java, muitas vezes utilizamos outros recursos em vez de arrays, em especial os pacotes de colees do Java, que veremos mais a frente neste curso. Portanto, fique tranquilo caso no consiga digerir toda sintaxe dos arrays num primeiro momento. Um array uma estrutura de dados que armazena um conjunto de valores de mesmo tipo. Voc acessa cada valor individual atravs de um ndice inteiro. Por exemplo, se x um array de inteiros, ento x[i] o i-simo inteiro no array.

Java bsico 1

39

Figura 5.1 Representao de array na memria do computador. Voc declara uma varivel de array especificando o tipo primitivo de dados que ele armazenar seguido de [] (abre e fecha colchetes) e o nome da varivel do tipo array. Por exemplo, a representa a declarao de um array de inteiros: int[] a; Entretanto, essa instruo apenas declara a varivel a como sendo um array. Ela ainda no foi inicializa como um array, no sendo possvel, ainda, armazenar valores em a. O operador new utilizado para criar o array na memria do computador. Utilize a instruo abaixo para informar o total de endereos de memria que sero referenciados pelo identificador a. int[] a = new int[100]; Essa instruo configura um array que pode conter no mximo 100 nmeros inteiros. As entradas do array so numeradas de 0 a 99 (e no de 1 a 100). Uma vez que o array foi criado, voc pode preencher suas entradas (endereos de memria) usando, por exemplo, uma estrutura de repetio:

int[] a = new int[100]; for (int i = 0; i < 100; i++) a[i] = i; // preenche o array com 0 a 99

Ateno: Se voc construir um array com 100 elementos e depois tentar acessar o elemento a[100] (ou qualquer outro ndice fora do intervalo 0 . . . 99), o seu programa terminar com uma exceo array index out of bounds que indica que voc esta tentando acessar um endereo de memria que no pode ser referenciado pela varivel a. Voc pode utilizar o Para encontrar o nmero de elementos de um array, use arrayName.length. Por exemplo, for (int i = 0; i < a.length; i++) System.out.println(a[i]);

40

Java bsico 1

Uma vez que voc crie um array, voc no poder mudar seu tamanho, embora voc possa, claro, mudar um elemento especfico do array. Voc pode definir uma varivel de array, como segue: int[] a; ou como: int a[]; A maioria dos programadores Java prefere o primeiro estilo, pois ele separa corretamente o tipo int[] (array de inteiros) do nome da varivel.

Tamanho de uma array


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

Java bsico 1

41

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

Arrays como Argumentos


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

Arrays como Valores de Retorno


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

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

42

Java bsico 1

Exerccios de Fixao 7 Arrays


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

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

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

Atividade 2 Arrays (Complementar)


1. Faa uma classe executvel que leia a altura, a idade e o sexo de 50 pessoas e fornea as seguintes informaes: a. A maior altura e a menor altura; b. A mdia de altura de mulheres; c. A idade do homem mais velho.

Java bsico 1

43

2. Faa uma classe executvel que leia uma matriz quadrada de ordem 4x4 e fornea as seguintes informaes: a. Imprima os elementos da diagonal principal; b. Imprima os elementos da diagonal secundria; c. Imprima a mdia aritmtica de todos os elementos da matriz.

44

Java bsico 1

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

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

Tipo primitivo Int Long Float Double Char Boolean

Classe wrapper Integer Long Float Double Character Boolean

Parmetro para o construtor int ou String long ou String float, double ou String double ou String char boolean ou String

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

Date, DateFormat e Calendar Date


A classe Date representa um instante especfico no tempo, com preciso de milissegundos. Embora a classe Date pretenda reproduzir o tempo universal coordenado (UTC), ela no o faz exatamente. O processo de reproduo dependente do ambiente onde a mquina virtual Java esta hospedado. Quase todos os sistemas operacionais modernos assumem que 1 (um) dia igual a 86400 segundos (24 horas 60 minutos 60 segundos). No UTC, no entanto, cerca de uma vez a cada ano ou dois, h um segundo extra, chamada de "segundo bissexto". O saldo de um segundo sempre adicionado como o ltimo segundo do dia, e sempre em 31 de dezembro ou 30 de junho de um determinado ano. Por exemplo, o ltimo minuto do ano de 1995 foi de 61 segundos de durao, graas ao salto de um segundo. A maioria dos relgios de computadores no precisa o suficiente para ser capaz de acrescentar o salto de segundo previsto no UTC. Alguns padres de computador so definidos em termos do meridiano de Greenwich (GMT), o que equivale hora universal (UT). GMT o nome "civil" para o padro; UT o nome "cientfico" para o mesmo padro. A distino entre o UTC e UT que UTC baseado em um relgio atmico e UT baseado em observaes astronmicas, que para todos os efeitos prticos, um fino de cabelo invisvel para se dividir, devido rotao da Terra no ser uniforme (que desacelera e acelera de maneiras complicadas), UT nem sempre flui de maneira uniforme. Os saltos de segundos so introduzidos conforme a necessidade em UTC, de modo a manter dentro de 0,9 segundo UTC de UT1, que uma verso de UT com determinadas correes aplicadas. H outra hora e sistemas de datas, bem como, por exemplo, a escala de tempo utilizado pelo sistema de posicionamento por satlite (GPS), que sincronizada para UTC, mas no est ajustada para os segundos bissextos. Em todos os mtodos da classe Date que aceitar ou voltar ano, ms, dia, hora, minuto, segundo e os valores, as representaes seguintes so utilizados: Um ano y representado pelo nmero inteiro y - 1900.

46

Java bsico 1

Um ms representado por um nmero inteiro de 0 a 11; 0 de Janeiro, 1 de Fevereiro, e assim por diante, assim 11 de Dezembro. A data (dia do ms) representada por um inteiro de 1 a 31. Uma hora representada por um nmero inteiro de 0 a 23. Assim, a hora a partir de meianoite s 01:00 horas 0, e na hora do meio-dia s 01:00 de 12 horas. Um minuto representado por um inteiro de 0 a 59. Um segundo representado por um inteiro de 0 a 61; os valores 60 e 61 ocorrem apenas durante segundos bissextos e mesmo assim apenas em implementaes Java que efetivamente controlam segundos intercalados corretamente.

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

Voc pode usar um DateFormat para converter uma string em data tambm. Java bsico 1 47

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

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

NumberFormat
NumberFormat a classe base abstrata para todos os formatos de nmero. Essa classe fornece a interface para formatao e anlise de nmeros. NumberFormat tambm fornece mtodos para determinar quais locais tm formatos de nmeros. NumberFormat ajuda a formatar e analisar os nmeros para qualquer localidade (Locale). Seu cdigo pode ser completamente independente das convenes Locale para pontos decimais, milhares-separadores, ou at mesmo para a particularidade do uso de dgitos decimais, ou se o formato do nmero esta na base decimal. 48 Java bsico 1

Para formatar um nmero para o Locale atual, use um dos mtodos de classe: myString = NumberFormat.getInstance().format(myNumber); Para formatar um nmero para uma localidade diferente, especific-lo na chamada para getInstance. NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH); Voc tambm pode usar um NumberFormat para analisar nmeros: myNumber = nf.parse(myString); Use getInstance ou getNumberInstance para obter o formato do nmero normal. Use getIntegerInstance para obter um formato de nmero inteiro. Use getCurrencyInstance para obter o formato de nmero de moeda. E usar getPercentInstance para obter um formato para apresentar porcentagens. Com getPercentInstance, por exemplo, a fraco 0,53 ser mostrada como 53%.

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

Padro de Caracteres Especiais


Symbol 0 # . , Significado Dgito Dgito. Suprime a impresso de zeros esquerda Separador de casas decimais para nmeros fracionrios e valores monetrios Sinal de menos Separador de agrupamento

Java bsico 1

49

Symbol E ; % \u2030 '

Significado Separa mantissa e expoente em nmeros com em notao cientfica Separa subpadres positivos e negativos Multiplica por 100 e mostra como presencial Multiplica por 1000 e mostra como por milhagem Usado para incluir caracteres especiais em um prefixo ou sufixo, por exemplo, "'#' #" formatos de 123 para "# 123".

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

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

50

Java bsico 1

Exerccios de Fixao 8 Classes Especializadas


Para que servem as classes especializadas?

Atividade 1 Classes Especializadas


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

Atividade 2 Classes Especializadas (Complementar)


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

Java bsico 1

51

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

52

Java bsico 1

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

Programao Orientada a Objetos


A POO o paradigma de programao predominante nos dias atuais, vindo substituir os paradigmas estruturados. Java totalmente orientada a objetos. Ela surgiu da ideia de distribuio de funcionalidades e de certas propriedades que so comuns em unidades do mesmo tipo. Um programa feito de objetos com certas propriedades e operaes que os objetos podem executar. O estado atual, ou seu interior pode variar, mas deve-se tomar cuidado para que os objetos no interajam de forma no documentada. Na POO voc s se preocupa com o que o objeto expe. A POO inverte a maneira de pensar dos antigos programadores, que sempre pensavam primeiro nos algoritmos e depois nas estruturas de dados. Agora, as estruturas so mais importantes e depois sua manipulao. A chave da produtividade em POO tornar cada objeto responsvel pela realizao de um conjunto de tarefas relacionadas. Se um objeto depender de uma tarefa que no seja de sua responsabilidade, mas sim de outro, deve ento pedir para o outro objeto, cujas responsabilidades incluam essa tarefa, realiz-la. Isso feito por uma verso mais generalizada da chamada de funes usada na programao estruturada: a chamada de mtodos. Em particular, um objeto nunca deveria manipular diretamente dados internos de outro objeto. Isso chamado de Encapsulamento (tambm diz respeito ao ocultamento da implementao de alguma tarefa, sendo essa somente visvel atravs da sua interface, o mtodo que a dispara). Toda comunicao deve ser atravs de mensagens, ou seja, chamada de mtodos. Com isso, obtm-se um alto grau de reusabilidade e pouca dependncia entre os objetos. Java bsico 1 53

Classes
Uma classe um conjunto de variveis e funes relacionadas a essas variveis. Uma vantagem da utilizao de programao orientada a objetos poder usufruir o recurso de encapsulamento de informao. Com o encapsulamento o usurio de uma classe no precisa saber como ela implementada, bastando para a utilizao conhecer a interface, ou seja, os mtodos disponveis. Uma classe um tipo, e, portanto no pode ser atribuda a uma varivel. Para definir uma classe, deve-se utilizar a seguinte sintaxe: <modificador_acesso> class Nome_da_classe { <atributos>; <mtodos>; } Onde <modificador_acesso> uma palavra reservada que indica se a classe visvel em todos os sistemas ou no. Podendo ser pblica ou privada. Quando se cria um objeto a partir de uma classe, diz-se que foi criada uma instncia da classe. Exemplo: CursoJava curso = new CursoJava(); Como visto, tudo em Java est dentro de classes. Ento, existem disponveis vrias classes em Java para realizar diversas tarefas, como por exemplo, formatao de nmeros para o usurio. Mas mesmo assim, quando se est desenvolvendo um sistema, o programador deve desenvolver suas prprias classes, particulares, para realizar as tarefas prprias da aplicao que est desenvolvendo. Outro recurso da POO poder criar classes atravs de outras. Isso chamado Herana, e em Java diz-se que uma classe estende a outra, quando ela herda seus dados e mtodos. Todas as classes em Java estendem a classe bsica Object. Inicialmente a classe nova contm todos os mtodos e atributos da classe bsica, e pode-se escolher por manter ou modificar esses objetos, e adicionar outros novos.

Relaes entre Classes


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

54

Java bsico 1

Objetos
Como foi dito anteriormente, classes so tipos, e no podem ser atribudas a variveis. Variveis do tipo de uma classe so chamadas de objetos, e devem ser criadas utilizando o operador new, seguindo o exemplo abaixo: variavel = new nome_da_classe; Por exemplo: CursoJava curso = new CursoJava(); Onde curso uma varivel, uma instncia, um objeto da classe CursoJava. Para se trabalhar em POO, deve-se saber identificar trs caractersticas-chave dos objetos: Qual o comportamento do objeto? Qual o estado do objeto? Qual a identidade do objeto? Todos os objetos, que so instncias da mesma classe, tm uma semelhana no seu comportamento que revelado pelas mensagens que ele aceita. Em seguida, cada objeto guarda informaes sobre o que ele no momento e como chegou a isso. Isso o que geralmente se chama de estado do objeto. O estado de um objeto pode mudar com o tempo, mas no espontaneamente. Uma mudana de estado num objeto s pode ser resultado de envio de mensagens, caso contrrio, o encapsulamento estaria sendo violado. Contudo somente o estado do objeto no descreve completamente o objeto, pois cada objeto tem uma identidade distinta. Por exemplo, num sistema de processamento de encomendas, duas encomendas so distintas, mesmo se pedirem a mesma coisa. Em um programa tradicional, orientado a procedimentos, comea-se o processo de cima, com a funo main. Ao projetar um sistema POO, no existe topo ou incio, e os novatos em POO frequentemente ficam perguntando onde comear. A resposta : primeiro se encontram ou determinam as classes e depois se acrescentam mtodos a cada classe.

Objetos como Argumentos


Pode-se passar como argumento de mtodos (funes) objetos de uma determinada classe. Por exemplo: Na classe Estacionamento: static void estacionar(Carro c) { ... } Em algum outro ponto do programa: Carro carro = new Carro(); estacionamento.estacionar(carro); Java bsico 1 55

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

Auto referncia a um objeto


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

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

} public void alterarDataItem(Date d) { ... } } Como visto, atributos podem ser de qualquer tipo no Java, inclusive outras classes.

Mtodos
Mtodos so as aes que um objeto prov como interface para o sistema. E no s isso, mas tambm aes internas, no visveis para outros objetos. Basicamente so funes, com argumentos, retorno e visibilidade. A visibilidade pode ser public, private ou protected. Um detalhe importante que sempre, os atributos de uma classe, podem ser manipulados atravs de um mtodo dela, obviamente, sejam privados ou pblicos. Os mtodos pblicos definem a interface da classe, as aes que ela pode executar. Os mtodos privados fazem operaes internas, que no devem estar disponveis para os outros objetos. Por exemplo: public class Evento { private int Id; private ItemEvento Item; public int getId() { return Id; } private boolean dataValidaItem(Date d) { ... } public void alterarDataItem(Date d) { if (dataValidaItem(d)) ... } } O mtodo privado dataValidaItem serve como validao interna e quando a classe foi projetada no se tinha a inteno de torn-lo visvel para os outros objetos, portanto, foi implementado como private.

Getters e Setters
Como j vimos, o ideal que sejam implementados mtodos para disponibilizar acesso aos valores de atributos dos objetos instanciados na aplicao em desenvolvimento. Uma pratica bastante comum adotada a criao de mtodos de acesso, que possuem o prefixo get, e os mtodos modificadores, que possuem o prefixo set. Estes mtodos nos possibilitam a manuteno de acesso aos atributos privados, encapsulando-os e dando ao programador a

Java bsico 1

57

flexibilidade de acessar ou alterar valores de acordo com a necessidade da aplicao em desenvolvimento. Por exemplo, podemos definir o mtodos de acesso getNome() e o mtodo modificador setNome(String n) para a classe Pessoa. Estes mtodos sero utilizados pelo programador sempre que este necessitar consultar ou atualizar o valor do atributo nome de um objetivo instanciado da classe Pessoa.

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

Construtores
Construtores so mtodos especiais que servem para fazer a inicializao de um objeto recm instanciado. Esses mtodos so chamados toda vez que um objeto novo construdo, isto , atravs do operador new. Seu nome o mesmo que o nome da classe. Por exemplo: class Cliente { public Cliente (String n) { nome = n; } ... } Onde public Cliente um construtor da classe Cliente. Cliente c = new Cliente(Microsoft);

58

Java bsico 1

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

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

Mtodos e Atributos static


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

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

Exerccios de Fixao 9 Classes e Objetos


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

Descreva a importncia da identificao de atributos e mtodos para a POO. 60 Java bsico 1

Atividade 1 Classes e Objetos


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

Atividade 2 Classes e Objetos (Complementar)


1. Implemente a classe Tringulo representada abaixo. Crie um programa que leia os 3 lados do tringulo e diga se ele equiltero, issceles ou escaleno, utilizando a interface pblica do objeto. Tringulo int lado1 int lado2 int lado3 <getters...>, <setters...> Triangulo (int l1, int l2, int l3)

// Propriedade: cada lado de um tringulo menor do que a soma dos outros dois lados
boolean ehEscaleno() // tem o comprimento de seus trs lados diferentes.

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

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

Exerccios de Fixao Classes e Objetos


A proteo de atributos e mtodos das classes, fazendo com que estas se comuniquem com o meio externo atravs da visibilidade permitida, define o conceito de: a. especializao b. polimorfismo c. encapsulamento d. herana e. agregao

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

Usando pacotes
Uma classe pode usar todas as classes de seu prprio pacote e todas as classes pblicas de outros pacotes. Voc pode acessar as classes pblicas de outro pacote, de duas maneiras. A primeira simplesmente adicionar o nome do pacote completo na frente de todo nome de classe. Por exemplo: Java bsico 1 63

java.util.Date today = new java.util.Date(); Obviamente, isso maante. A estratgia mais simples e comum usar a palavra-chave import. O objetivo da instruo import simplesmente fornecer um atalho para voc fazer referncia s classes do pacote. Quando voc usa import, no precisa mais fornecer s classes seus nomes completos. Voc pode importar uma classe especfica ou o pacote inteiro. Voc coloca instrues import no incio de seus arquivos-fonte (mas abaixo de todas as instrues package). Por exemplo, voc pode importar todas as classes do pacote java.util com a instruo: import java.util.*; Ento, voc pode usar Date today = new Date(); Sem um prefixo de pacote. Voc tambm pode importar uma classe especfica dentro de um pacote. import java.util.Date; Importar todas as classes de um pacote mais simples. Isso no tem nenhum efeito negativo sobre o tamanho do cdigo; portanto, geralmente no h razo para no usar. Entretanto, note que voc pode usar apenas a notao * para importar um pacote. Voc no pode usar import java.* ou import java.*.* para importar todos os pacotes com o prefixo java. Ateno: Voc s pode importar classes e no objetos. Por exemplo, voc nunca importaria System.out. Na maioria das vezes, voc importa apenas os pacotes que precisa, sem se preocupar muito com eles. A nica vez em que voc precisa prestar ateno nos pacotes quando tem um conflito de nome. Por exemplo, os pacotes java.util e java.sql tm uma classe Date. Suponha que voc escreva um programa que importa os dois pacotes. import java.util.*; import java.sql.*; Se agora voc usar a classe Date, ento receber um erro de tempo de compilao: Date today; // ERRO--java.util.Date ou java.sql.Date? O compilador no consegue descobrir qual classe Date voc deseja. Voc pode resolver esse problema adicionando uma instruo import especfica: import java.util.*; import java.sql.*; import java.util.Date; E se voc realmente precisar das duas classes Date? Ento, precisar usar o nome completo do pacote, com cada nome de classe. java.util.Date deadline = new java.util.Date(); 64 Java bsico 1

java.sql.Date today = new java.sql.Date(); Localizar classes em pacotes uma atividade do compilador. Os cdigos de byte nos arquivos de classe sempre usam nomes de pacote completos para fazer referncia a outras classes. Em Java, voc pode evitar completamente o mecanismo import, nomeando todos os pacotes explicitamente, como em java.util.Date. A nica vantagem da instruo import a convenincia. Voc pode se referir a uma classe por um nome mais curto do que o nome de pacote completo. Por exemplo, aps uma instruo import java.util.* (ou import java.util.Date), voc pode se referir classe java.util.Date simplesmente como Date.

Adicionando uma classe em um pacote


Para colocar classes dentro de um pacote, voc deve colocar o nome do pacote no incio de seu arquivo-fonte, antes do cdigo que define as classes no pacote. Por exemplo, o arquivo Empregado.java comea como segue: package com.cursojava.empresa; public class Empregado { . . . } Se voc no colocar uma instruo package no arquivo-fonte, ento as classes desse arquivofonte pertencero ao pacote padro. O pacote padro no tem nome de pacote. At agora, todas as nossas classes de exemplo estavam localizadas no pacote padro. Voc coloca os arquivos de um pacote em um subdiretrio que corresponda ao nome do pacote completo. Por exemplo, todos os arquivos de classe do pacote com.cursojava.empresa devem estar no subdiretrio com/cursojava/empresa (com\cursojava\empresa, no Windows). Portanto, o arquivo Empregado.java deve estar contido em um subdiretrio com/cursojava/empresa. Em outras palavras, a estrutura de diretrio a seguinte: . (diretrio corrente) TesteEmpregado.java com/ cursojava/ empresa/ Empregado.java Para compilar esse programa, basta mudar para o diretrio que contm TesteEmpregado.java e executar o comando: javac TesteEmpregado.java

Java bsico 1

65

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

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

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

Hierarquia de Heranas
A herana no est limitada a um nvel somente. Pode-se, por exemplo, fazer com que uma classe chamada Executivo derive da classe Gerente. Pode-se tambm fazer uma classe 67

Java bsico 1

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

Figura 7.1 Hierarquia de Heranas.

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

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

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

Java bsico 1

69

Figura 7.2 Herana sem o emprego de polimorfismo. Quando se usa polimorfismo, basta fazer: Empregado.aumentarSalario();

Figura 7.3 Herana com o emprego de polimorfismo.

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

Classes Abstratas
Ao subir na hierarquia de classes, estas vo se tornando mais genricas. Chega um ponto que elas so to genricas que acabam se tornando somente um modelo de como devem ser implementadas. Suponha um sistema de gerenciamento de mensagens por voz, fax ou texto. Criamos ento as classes VoxMessage, FaxMessage e TextMessage. Como o sistema ter que manter e manipular uma mistura desses trs tipos de mensagens, ento cria-se um classes me comum a todas as demais, chamada Message. Mas quando se manda reproduzir uma mensagem, atravs da classe me Message, no se sabe o que reproduzir, ou voz, ou fax ou texto. Ento se usa a palavra reservada abstract para dizer 70 Java bsico 1

que esse mtodo no pode ser definido nessa classe, mas sim em uma subclasse. Um detalhe que se uma classe possui um ou mais mtodos abstratos, ento ela mesma tem que ser abstrata: public abstract class Message { public abstract void play(); } Alm dos mtodos abstratos, as classes abstratas podem ter mtodos e atributos concretos. Por exemplo, a classe Message pode armazenar o remetente da mensagem postal e ter um mtodo concreto que retorne o nome do remetente: public abstract class Message { private String sender; public Message(String s) { sender = s; } public abstract void play(); public String getSender() { return sender; } } No possvel criar objetos a partir de classes abstratas. Ou seja, se uma classe declarada abstrata, ento nenhum objeto dessa classe pode ser criado. Ser necessrio ampliar essa classe a fim de criar uma instncia da classe. Observe que ainda assim podem-se criar variveis objeto de uma classe abstrata, embora essas variveis tenham de fazer referncia a um objeto de uma subclasse no abstrata. Por exemplo: Message msg = new VoiceMessage(greeting.au); Aqui msg uma varivel do tipo abstrato Message que faz referncia a uma instncia da subclasse no abstrata VoiceMessage.

Ligao
Dependendo das caractersticas da linguagem e do tipo de polimorfismo suportado por ela, a implementao do polimorfismo pode exigir facilidades proporcionadas pela ligao dinmica. De um modo geral, uma ligao (binding) uma associao, possivelmente entre um atributo e uma entidade ou entre uma operao e um smbolo. Uma ligao dita esttica se ocorre em tempo de compilao ou de interligao (linking) e no mais modificada durante toda a execuo do programa. A ligao dinmica feita em tempo de execuo ou pode ser alterada no decorrer da execuo do programa. Com a ligao dinmica, a ligao do operador a uma particular operao pode ser feita em tempo de execuo, isto , o cdigo compilado para um tipo abstrato de dados pode ser usado para diferentes tipos de dados, aumentando consideravelmente sua reusabilidade. Entretanto, o uso de ligao dinmica compromete a eficincia de implementao.

Java bsico 1

71

Por default, Java faz ligao dinmica (late binding) dos mtodos das classes. Para que um mtodo seja implementado com ligao esttica (early binding) deve-se torn-la final. Deve-se ter em mente que isso no mais permitir que um mtodo seja sobrescrito.

Classe Class
A classe Class serve para fazer identificao de tipos em tempo de execuo. Essa informao acompanha a classe qual o objeto pertence e usada pela linguagem para selecionar os mtodos corretos a executar em tempo de execuo. Essas informaes esto acessveis para o programador atravs do mtodo getClass da classe Object, que retorna uma instncia de Class. Empregado e; ... Class c1 = e.getClass(); Provavelmente o mtodo mais usado da classe Class o getName, que retorna o nome da classe. System.out.println(e.getClass().getName()); Pode-se obter um objeto Class

tambm atravs de uma string contendo o nome da

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

72

Java bsico 1

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

Anlise de Recursos das Classes


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

Anlise de Objetos em Tempo de Execuo


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

Superclasse abstrata
Suponha o exemplo tpico de modelar classes de ordenamento genrico. Vamos inicialmente implementar um algoritmo de ordenao, e uma classe abstrata Sortable, contento o mtodo nico compareTo, que determina se um objeto ordenvel menor, igual ou maior que o outro. abstract class Sortable { Java bsico 1 73

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

Interfaces
Na linguagem de programao Java, uma interface no uma classe, mas um conjunto de requisitos para classes que queiram se adequar interface. Normalmente, o fornecedor de algum servio diz: se sua classe obedecer a uma interface em particular, ento executarei o servio. Vamos ver um exemplo concreto. O mtodo sort da classe

74

Java bsico 1

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

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

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

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

Classes Internas
Classes internas so classes definidas dentro de classes. H quatro motivos para seu uso: Um objeto de uma classe interna pode acessar a implementao do objeto que a criou, incluindo dados que seriam, de outra forma, privados; As classes internas podem ser invisveis para outras classes do mesmo pacote; As classes internas annimas so prticas quando se quer definir callbacks em tempo de execuo; As classes internas so muito convenientes quando se quer escrever programas orientados por eventos. Aqui est um exemplo tpico: uma classe de lista encadeada define uma classe para conter os links e uma classe para definir a posio de um iterador. class LinkedList { public class Iterator // uma classe aninhada { public: Java bsico 1 77

void insert(int x); int erase(); . . . }; . . . private class Link // uma classe aninhada { public: Link* next; int data; }; . . . }; O aninhamento um relacionamento entre classes e no objetos. Um objeto LinkedList no tem sub-objetos de tipo Iterator ou Link. Existem duas vantagens: controle de nome e controle de acesso. Como o nome Iterator est aninhado dentro da classe LinkedList, ele conhecido externamente como LinkedList::Iterator e no pode entrar em conflito com outra classe chamada Iterator. Em Java, essa vantagem no to importante, pois os pacotes fornecem o mesmo tipo de controle de nome. Note que a classe Link est na parte privada da classe LinkedList. Ela fica completamente oculta de todo outro cdigo. Por isso, seguro tornar seus campos de dados pblicos. Eles podem ser acessados pelos mtodos da classe LinkedList (que tem a necessidade legtima de acess-los) e no so visveis em outro lugar. Em Java, esse tipo de controle no era possvel at que as classes internas fossem introduzidas. Entretanto, as classes internas Java tm um recurso adicional que as torna mais ricas e teis do que as classes aninhadas em C++. Um objeto proveniente de uma classe interna tem uma referncia impltica para o objeto da classe externa que o instanciou. Atravs desse ponteiro, ele tem acesso ao estado total do objeto externo. Apenas as classes internas static no tm esse ponteiro adicional. Elas so as anlogas Java exatas das classes aninhadas em C++. Por exemplo: class UmaClasse { ... private class InnerClass { ... } ... } Pode-se criar classes internas dentro de mtodos, e tambm criar classes annimas. Classes internas no so um conceito comum e Java as implementa como classes diferentes, inserindo mtodos acessadores classe que contm a classe interna. Qualquer classe declarada dentro do corpo de outra classe ou interface conhecido como uma classe aninhada. Se a classe aninhada no tem um nome, ento ela considerada uma classe 78 Java bsico 1

annima. Se a classe aninhada tem um nome, ento no annima. Se a classe aninhada tem um nome e no declarada dentro de um mtodo, construtor ou qualquer bloco, ento ela uma classe membro. Se uma classe membro no for decladrada como esttica, ento ela uma classe interna. Se uma classe no estiver aninhada, ento uma classe de nvel superior.

Exerccio de Fixao 10 Classes e Objetos


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

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

Atividade 5 Classes e Objetos


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

IMC Abaixo de 20 A partir de 20 at 25 Acima de 25 at 30 Acima de 30 at 35 Acima de 35

Faixa de risco Abaixo do peso Normal Excesso de peso Obesidade Obesidade mrbida 79

Java bsico 1

b. Desenvolva uma interface para instanciar um objeto da classe Pessoa, calcular e escrever na tela a faixa de risco do mesmo do mesmo. 2. Defina uma classe abstrata Veculo, cujos objetos representam veculos, contendo as seguintes informaes: nmero de cilindradas, preo e combustvel. Implemente construtor(es), e um mtodo abstrato que possibilite a impresso de todos os atributos do objeto instanciado. a. Defina uma classe Moto, subclasse da classe Veculo, que contenha as seguintes informaes adicionais: tipo de motor (2 ou 4 tempos, carburado, etc.) e tipo de freio (ventilado, a disco etc.). Redefina o construtor de objetos da classe e de impresso de suas informaes de maneira apropriada. b. Defina uma classe Carro, subclasse da classe Veculo, que contenha as seguintes informaes adicionais: nmero de passageiros e capacidade do porta-malas. Redefina o construtor de objetos da classe e de impresso de suas informaes de maneira apropriada. c. Defina uma classe Caminho, subclasse da classe Veculo, que contenha as seguintes informaes adicionais: peso do veculo e peso da carga. Redefina o construtor de objetos da classe e de impresso de suas informaes de maneira apropriada. d. Desenvolva uma interface para instanciar um objeto de cada uma das classes implementadas e que imprima uma frase composta por todos os valores de seus atributos prprios e herdados. A classe de interface dever estar no pacote viso (viso).

Atividade 6 Classes e Objetos (Complementar)


1. Defina uma classe abstrata Conta, cujos objetos representam contas bancrias, contendo as seguintes informaes: nmero da conta e saldo. Defina um construtor de objetos dessa classe, que tenha como parmetros essas informaes, exceto saldo que ser igual a zero inicialmente. Defina um mtodo para depsito que ir atualizar o valor do saldo da conta atravs de um parmetro passado ao objeto instanciado na interface. Defina tambm os mtodos abstratos para saque. a. Defina uma classe ChequeEspecial, subclasse da classe Conta, que contenha o valor do limite para o saldo da conta. Redefina o construtor da classe e o mtodo de saque, de forma que possa utilizar o valor do limite, caso seja necessrio. b. Desenvolva uma interface para instanciar um objeto da classe ChequeEspecial, faa e imprima uma frase composta por todos os valores de seus atributos prprios e herdados. A classe de interface dever estar no pacote viso (visao). 2. Defina uma classe Veculo com os atributos: nmero da placa, cor, ano de fabricao, tanque (quantidade de combustvel em litros), quantidade de litros da reserva e consumo mdio (Km/l). Implemente os mtodos: andar, dado o nmero de Km a percorrer. Atualize a quantidade de combustvel no tanque, considerando o consumo mdio do veculo e, tambm, informar quando o veculo entrar no consumo da reserva de combustvel e, caso o veculo no tenha mais combustvel no tanque, informar que o veculo parou. abastecer, dado o nmero de litros de combustvel. Atualize a quantidade de combustvel no tanque. 80 Java bsico 1

a. Defina duas subclasses, Caminho com o atributo capacidade de carga (em toneladas) e nibus com o atributo capacidade de passageiros (nmero de lugares). Objetos dessas classes mudam o comportamento de consumo mdio (reduzem em 10%) quando sua capacidade de carga supera 50%. Implemente os mtodos de alterarOcupao (de carga ou pessoas) para cada uma delas e faa o veculo andar novamente.

Java bsico 1

81

82

Java bsico 1

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

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

O que o Java Collections Framework?


O Java Collecions Framework uma arquitetura unificada para representar e manipular colees de dados. Todas as estruturas das colees conter o seguinte: Interfaces: Estes so os tipos de dados abstratos que representam colees. Interfaces permitem colees para ser manipulado independentemente dos detalhes de sua representao. Em linguagens orientadas a objeto, interfaces geralmente formam uma hierarquia. Implementaes: Estas so as implementaes concretas das interfaces de coleta. Em essncia, so estruturas de dados reutilizveis. Algoritmos: Estes so os mtodos que executam clculos teis, como pesquisa e classificao, em objetos que implementam interfaces de coleta. Os algoritmos seriam polimrficos: isto , o mesmo mtodo pode ser usado em muitas aplicaes diferentes da interface. Em essncia, os algoritmos so funcionalidades reutilizveis. Alm do Java Collections Framework, os exemplos mais conhecidos de estruturas Collections so o C + + Standard Template Library (STL) e hierarquia Collections do Smalltalk. Java bsico 1 83

Historicamente, estruturas das colees tm sido bastante complexo, o que lhes deu uma reputao de ter uma curva de aprendizagem difcil. O Java Collections Framework veio para quebra esta tradio.

Benefcios do Java Collections Framework


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

84

Java bsico 1

Figura 8.1 API do Collections.

Listas
Um primeiro recurso que a API de Collections traz so as listas. Uma lista uma coleo que permite elementos duplicados e mantm uma ordenao especfica entre os elementos. Em outras palavras, voc tem a garantia de que, quando percorrer a lista, os elementos sero encontrados em uma ordem pr-determinada, definida na hora da insero dos mesmos. Ela resolve todos os problemas que levantamos em relao ao array (busca, remoo, tamanho "infinito",...). Esse cdigo j est pronto! A API de Collections traz a interface java.util.List, que especifica o que uma classe deve ser capaz de fazer para ser uma lista. H diversas implementaes disponveis, cada uma com uma forma diferente de representar uma lista. A implementao mais utilizada da interface List a ArrayList, que trabalha com um array interno para gerar uma lista. Portanto, ela mais rpida na pesquisa do que sua concorrente, a LinkedList, que mais rpida na insero e remoo de itens nas pontas. A interface List possui dois mtodos add, um que recebe o objeto a ser inserido e o coloca no final da lista, e um segundo que permite adicionar o elemento em qualquer posio da mesma. Note que, em momento algum, dizemos qual o tamanho da lista; podemos acrescentar quantos elementos quisermos que a lista cresce conforme for necessrio. Toda lista (na verdade, toda Collection) trabalha do modo mais genrico possvel. Isto , no h uma ArrayList especfica para Strings, outra para Nmeros, outra para Datas etc. Todos os mtodos trabalham com Object. List lista = new ArrayList(); lista.add("Manoel"); lista.add("Joaquim"); lista.add("Maria"); A interface List e algumas classes que a implementam podem ser vistas no diagrama a seguir:

Java bsico 1

85

Figura 8.2 Interface List e classes que a implementam.

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

Figura 8.3 Interface Set e classes que a implementam. 86 Java bsico 1

Um conjunto representado pela interface Set e tem como suas principais implementaes as classes HashSet, LinkedHashSet e TreeSet.

public static void main(String[] args) { Set<String> nomes = new HashSet<String>(); nomes.add("Joo"); nomes.add("Jos"); nomes.add("Maria"); nomes.add("Bianca"); System.out.println("Nmero de elementos: "+nomes.size()); if(nomes.contains("Maria")){ System.out.println("Contm Maria!!!"); } for(String temp : nomes){ System.out.println(temp); } Iterator<String> i = nomes.iterator(); while(i.hasNext()) System.out.println(i.next()); } O uso de um Set pode parecer desvantajoso, j que ele no armazena a ordem, e no aceita elementos repetidos. No h mtodos que trabalham com ndices, como o get(int) que as listas possuem. A grande vantagem do Set que existem implementaes, como a HashSet, que possui uma performance incomparvel com as Lists quando usado para pesquisa (mtodo contains por exemplo).

Mapas
Muitas vezes queremos buscar rapidamente um objeto dado alguma informao sobre ele. Um exemplo seria, dada a placa do carro, obter todos os dados do carro. Poderamos utilizar uma lista para isso e percorrer todos os seus elementos, mas isso pode ser pssimo para a performance, mesmo para listas no muito grandes. Aqui entra o mapa. Um mapa composto por um conjunto de associaes entre um objeto chave a um objeto valor. java.util.Map um mapa, pois possvel us-lo para mapear uma chave a um valor, por exemplo: mapeie chave "empresa" o valor "Nome da Empresa", ou ento mapeie chave "rua" ao valor "Endereo da Empresa". Semelhante a associaes de palavras que podemos fazer em um dicionrio. O mtodo put(Object, Object) da interface Map recebe a chave e o valor de uma nova associao. Para saber o que est associado a um determinado objeto-chave, passa-se esse Java bsico 1 87

objeto no mtodo get(Object). Sem dvida essas so as duas operaes principais e mais frequentes realizadas sobre um mapa. public static void main(String[] args) { HashMap<String, String> nomes = new HashMap<String, String>(); nomes.put("joao", "Joo da Silva"); nomes.put("jose", "Jos Matos"); nomes.put("maria", "Maria das Dores"); nomes.put("bianca", "Bianca Patrcia"); System.out.println("Nmero de elementos: "+nomes.size()); String temp = nomes.get("bianca"); System.out.println(temp); } Um mapa muito usado para "indexar" objetos de acordo com determinado critrio, para podermos buscar esses objetos rapidamente. Um mapa costuma aparecer juntamente com outras colees, para poder realizar essas buscas! Ele, assim como as colees, trabalha diretamente com Objects (tanto na chave quanto no valor), o que tornaria necessrio o casting no momento que recuperar elementos. Usando os generics, como fizemos aqui, no precisamos mais do casting. Suas principais implementaes so o HashMap, o TreeMap e o Hashtable. Apesar do mapa fazer parte do framework, ele no estende a interface Collection, por ter um comportamento bem diferente. Porm, as colees internas de um mapa so acessveis por mtodos definidos na interface Map.

88

Java bsico 1

Figura 8.4 Interface Map e classes que a implementam.

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

Exerccio de Fixao 11 Collections


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

Para voc, os recursos de Collections facilitam a organizao e manipulao de conjuntos de dados em aplicaes Java?

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

Java bsico 1

89

Atividade 2 Collections (Complementar)


1. Uma empresa decidiu fazer um levantamento de informaes em relao aos candidatos que se apresentaram para o preenchimento de vagas no seu quadro de funcionrios. Para resolver este problema, necessrio ter os seguintes dados sobre cada candidato: nmero de inscrio, nome, cdigo da vaga, a idade (em anos), o sexo (Mmasculino ou Ffeminino) e a experincia no servio (Ssim ou Nno). Escreva uma classe principal que leia os dados dos candidatos e armazene em um ArrayList de Objetos da classe Candidato e informe: a. b. c. d. O total de candidatos do sexo feminino A mdia de idades entre candidatos que tem experincia. O cdigo da vaga mais concorrida (Interface Compareble). O percentual de candidatos sem experincia.

90

Java bsico 1

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

Java bsico 1

91

Java bsico 2

Paulo Henrique Cayres

Rio de Janeiro 2013


Java bsico 2

Escola Superior de Redes

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 1

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

Java bsico 2

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

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

Breve histrico:

AWT (Abstract Window Toolkit)

Java Foundation Classes (JFC)-Swing Desenvolvimento de GUIs Java Java bsico 2

Principais componentes visuais grficos GUI

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

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

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.

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.

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

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

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

Janelas

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

Java bsico 2

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

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

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

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

public public public public

void void void void

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

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

No modelo de eventos do Swing, deve-se definir a constante pertencente a classe WindowsConstantis como parmetro do mtodo setDefaultCloseOperation() para que a instncia de JFrame consiga tratar o evento que correspondente ao fechamento da janela da aplicao em desenvolvimento. A configurao da chamada do mtodo seria setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);.

Exibio de Informaes

Desenhar uma string diretamente num quadro no considerada uma boa tcnica de programao, apesar de possvel. Mas esse componente projetado para ser um continer de outros componentes, estes sim podendo possuir dados. A estrutura de um JFrame complexa, mas o que nos interessa a rea de contedo. Essa a rea onde os componentes sero adicionados. // obteno da rea de contedo Container painelConteudo = frame.getContentPane(); // criao do componente JPanel p = new JPanel(); // adio do componente ao frame painelConteudo.add(p); Suponha que se queira inserir no frame um painel (JPanel) para se imprimir uma string dentro. O cdigo seria:

Objetos Grficos e o Mtodo paintComponent


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

Para desenhar um painel, deve-se:

Definir uma classe que estenda JPanel;

class MyPanel extends JPanel { public void paintComponent(Graphics g) { // o cdigo de desenho vem aqui } } Um detalhe importante nunca chamar o mtodo paintComponent diretamente. Ele chamado automaticamente toda vez que uma parte do sistema tenha que ser refeita, redesenhada. Ao invs, deve-se chamar o mtodo repaint. g.drawString(Hello World, 75, 100); Que deve ser colocado dentro do paintComponent. Por exemplo: class MyPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); g.drawString(Hello World, 75, 100); } }

Por exemplo:

Sobrepor o mtodo paintComponent dessa classe.

A exibio do texto se d por:

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

public void windowClosing(WindowEvent e) { System.exit(0); }); Conteiner contentPane = getContentPane(); contentPane.add(new HelloWorldPanel());

Texto, Fontes e Cores


Pode-se selecionar fontes diferentes deve-se informar ao objeto Graphics qual fonte usar. A classe responsvel por criar fontes Font. Por exemplo: Font sans = new Font(SansSerif, Font.BOLD, 14); Onde 14 o tamanho da fonte. Para setar uma fonte dentro do paintComponent, antes de imprimir faz-se: Font sans = new Font(SansSerif, Font.BOLD, 14); g.setFont(f); g.drawString(Hello World, 75, 100);

Um detalhe importante que atravs da classe FontMetrics se consegue saber qual a altura de uma determinada fonte (Font) e tambm o comprimento de uma string usando uma determinada fonte (Font). Isso muito til quando se quer imprimir vrias strings na tela, alinhado, e tambm no to dispersos. g.setColor(Color.pink); g.drawString(Hello, 75, 100); g.setColor(new Color(0, 128, 128)); g.drawString(World, 75, 125); Cores tambm so facilmente alteradas atravs da classe Color. Por exemplo:

Para especificar a cor de fundo de um painel, pode-se usar o seguinte exemplo: JPanel p = new MeuPainel(); p.setBackGround(Color.white); contexPane.add(p. Center);

Java bsico 2

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

Para retngulos e elipses usa-se drawRect, drawRoundRect, draw3DRect e drawOval. Para preencher as formas geomtricas uma srie de funes so disponibilizadas: fillRect, fillOval, fillPolygon, etc.

Imagens

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

Eventos
A manipulao de eventos ponto imprescindvel no desenvolvimento de aplicativos com interface grfica para o usurio. Frequentemente dito que a aplicao Orientada a Eventos.

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

Um objeto ouvinte uma instncia de uma classe que implementa uma interface especial, chamada naturalmente de interface ouvinte; Uma origem do evento um objeto que pode registrar objetos ouvintes e envia a estes os objetos eventos; Os objetos ouvintes vo ento usar a informao do objeto evento recebido para determinar sua reao ao evento. A origem do evento envia objetos eventos para todos os ouvintes registrados quando esse evento ocorre;

10

Java bsico 2

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

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

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

String command = evt.getActionCommand(); if (command.equals(OK)) ...

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:

Que retorna o label, o texto do boto que foi impresso. Ou: Object source = evt.getSource(); if (source == btnOk) ... Que retorna o objeto que gerou o evento.

Java bsico 2

11

Hierarquia de Eventos do AWT

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.

Figura 02 Hierarquia de eventos AWT.

Eventos de Foco

Na linguagem Java, um componente tem o foco se pode receber pressionamento de teclas. Esse componente pode receber o foco ou perder o foco. Tambm pode-se pressionar TAB para mover o foco sequencialmente componente a componente, de cima para baixo, da esquerda para direita. Um ouvinte de foco precisa implementar dois mtodos: focusGained e focusLost. Esses eventos so acionados quando a origem ganhar ou perder o foco, respectivamente. Cada um esses mtodos tem um parmetro FocusEvent. H dois mtodos teis nessa classe: getComponent que retorna o componente que recebeu ou perdeu o foco, e isTemporary que retorna true se a mudana do foco foi temporria. Uma mudana temporria do foco acontece quando um componente perde o controle temporariamente para depois recuperalo automaticamente. public void focusLost(FocusEvent evt) { if (evt.getComponent()==ccField && !!evt.isTemporary()) { If (!checarFormato(ccField.getText())) Java bsico 2 Exemplo: Pode-se evitar que um componente receba o foco simplesmente sobrepondo o mtodo isFocusTransversable para que retorne false.

12

ccField.requestFocus();

Onde o mtodo requestFocus coloca o foco num controle especfico.

Eventos de Teclado

Eventos de teclado so ouvidos por classes que implementam a interface KeyListener. O evento keyPressed informa a tecla pressionada: public void keyPressed(KeyEvent evt) { int keyCode = evt.getKeyCode(); }

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

Eventos de Mouse

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

13

Componentes visuais-grficos do pacote Swing

Figura 03 Componentes Swing.

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

O padro especifica precisamente como os trs objetos interagem. O Modelo armazena o contedo e no tem interface. Para um boto, o contedo bem trivial, contm apenas um 14 Java bsico 2

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

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

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

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

Figura 04 Interao do padro MVC.

Gerenciamento de Layout de Visualizao


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

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

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

Figura 05 Exemplo de uso de botes em interfaces grficas. 16 Java bsico 2

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

Figura 06 Exemplo BorderLayout.

Java bsico 2

17

Por exemplo:

Class MyPanel extends Jpanel { ... jButton1.setText("Norte"); getContentPane().add(jButton1, java.awt.BorderLayout.PAGE_START); jButton2.setText("Sul"); getContentPane().add(jButton2, java.awt.BorderLayout.PAGE_END); jButton3.setText("Oeste"); getContentPane().add(jButton3, java.awt.BorderLayout.LINE_START); jButton4.setText("Leste"); getContentPane().add(jButton4, java.awt.BorderLayout.LINE_END); jButton5.setText("Centro"); getContentPane().add(jButton5, java.awt.BorderLayout.CENTER);

... }

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

Painis

O problema do Layout de Borda, quanto ao redimensionamento dos componentes para que ocupem o espao disponvel em cada uma das regies disponveis, pode ser contornado atravs do uso de painis adicionais. Esses painis agem como continers para controles. Dentro desses painis pode-se utilizar outro layout, podendo assim fazer uma mescla de vrios tipos. Por exemplo: Conteiner contentPane = getContentPane(); Jpanel panel = new JPanel(); panel.add(yellowButton); panel.add(blueButton); panel.add(redButton); contentPane.add(panel, South);

18

Java bsico 2

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

Pode-se tambm espeficificar os espaamentos horizontal e vertical (respectivamente e em pixels) desejados: panel.setLayout(new GridLayout(5, 4, 3, 3); Adicionam-se componentes comeando com a primeira entrada da primerira linha, depois a segunda entrada da primeira linha e assim sucessivamente.

Figura 07 Exemplo GridLayout.

Java bsico 2

19

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

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

Box b = Box.createVerticalBox(); Depois, adicionam-se elementos de maneira usual: b.add(okButton); b.add(cancelButton); Na caixa horizontal, os componentes so organizados da esquerda para a direita. Na vertical de cima para baixo.

Para no se ter problemas com um controle que dentro de um layout de caixa fique com uma altura no desejada, faz-se com que seu tamanho mximo seja o tamanho preferencial. Por exemplo: textField.setMaximumSize(textField.getPreferredSize()); Para se adicionar algum espao entre, por exemplo, botes OK e Cancel numa tela, pode-se fazer: b.add(okButton); b.add(Box.createHorizontalStrut(5)); b.add(cancelButton);

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

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

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

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

20

Figura 08 Exemplo BoxLayout.

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

Para descrever o layout do gerenciador de bolsa de grade, necessrio percorrer o seguinte procedimento: Criar um objeto do tipo GridBagLayout. No se informa quantas linhas e colunas a grade tem. Em vez disso, o gerenciador de layout ir tentar descobrir isso a partir das informaes fornecidas mais tarde; Especificar esse objeto GridBagLayout como sendo o gerenciador de layout do componente; Criar um objeto do tipo GridBagConstraints. Esse objeto ir especificar como os componentes so colocados dentro da bolsa de grade; Por exemplo: Java bsico 2

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

Para cada componente, preencher o objeto GridBagConstraints. Depois, adicionar o componente com as restries.

GridBagLayout layout = new GridBagLayout();

21

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

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

O campo anchor usado quando o componente no ocupa o espao todo da rea. Pode-se ancor-lo em algum espao dentro do campo. Pode ser: GridBagConstraints.CENTER, GridBagConstraints.NORTH, GridBagConstraints.NORTHEAST, GridBagConstraints.EAST, etc. 1. Para tornar a confeco desse layout mais tranquilo, pode-se usar a seguinte receita: 2. Esboar o layout do componente numa folha de papel; Encontrar uma grade tal que os pequenos componentes fiquem contidos, cada um, em uma clula, e os componentes grandes ocupem diversas clulas;

3.

4.

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

Escrever cdigo. Conferir cuidadosamente os valores de GridBagConstraints, pois um nico valor errado poder arruinar todo o layout.

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;

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;

22

Java bsico 2

No usar Gerenciador de Layout


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

Java bsico 2

23

Sesso 01 GUI em Java Exerccios de Fixao 1 GUI em Java


O que so gerenciadores de layout? Quais so os gerenciadores de layout do Java?

Atividade 1 GUI em Java


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

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

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

Atividade 2 GUI em Java (complementar)


1. 2.

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.

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

24

Java bsico 2

Campos de Entrada de Texto


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

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

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

Figura 09 Exemplo jTextField e jTextArea.

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

O segundo parmetro do construtor do JTextField o tamanho, no caso 20 colunas. Podese alterar o tamanho depois de criado, usando setColumns(15), por exemplo. Logo aps, deve-se executar um validate(). JTextField textField = new JTextField(20); Para alterar a fonte, usa-se setFont. Java bsico 2 25 Para adicionar um campo em branco:

O tratamento de eventos de alterao de texto pode ser feito atravs da instalao de um ouvinte na interface Document. textField.getDocument().addDocumentListener(ouvinte); Quando um texto alterado, um dos trs mtodos a seguir chamado: void insertUpdate(DocumentEvent e); void removeUpdate(DocumentEvent e); void changeUpdate(DocumentEvent e);

Os dois primeiros mtodos so chamados quando caracteres tiverem sido inseridos ou removidos. O terceiro mtodo chamado quando mudanas como formatao, ocorrem, e tambm quando alteraes no texto so feitas.

Campos de Senha

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

Figura 10 Exemplo jPasswordField.

reas de Texto
reas de texto podem ser criadas atravs do seguinte exemplo: JTextArea textArea = new JTextArea(8, 40); // 8 linhas e 40 colunas GetContentePane().add(textArea); Pode-se setar as linhas e colunas atravs de setColumns e setRows. Se houver mais texto a ser mostrado, ele ser truncado. Java bsico 2

26

No Swing rea de texto no possui barra de rolagem, se a quiser, deve-se usar um ScrollPane, como a seguir: TextArea = new JTextArea(8, 40); JScrollPane scrollPane = new JScrollPane(textArea); getContentPane().add(scrollPane, Center);

Quando se quer que as linhas maiores sejam quebradas, usa-se textArea.setLineWrap(true). Essa quebra de linha completamente visual, o texto continua inalterado.

Figura 11 Exemplo jTextArea com JScrollPane e setTollTip.

Seleo de Texto
Usam-se os mtodos da superclasse JTextComponent. void selectAll();: seleciona todo o texto; void select(int inicio, int fim);: seleciona o texto com incio e fim especificados; int getSelectionStart();: retorna incio da seleo; int getSelectionEnd();: retorna o fim da seleo;

String getSelectedText();: retorna o texto selecionado.

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

Caixas de Seleo

Figura 12 Exemplo jLabel.

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

Usa-se o mtodo setSelected para marcar ou desmarcar uma caixa de seleo. public void actionPerformed(ActionEvent evt) { Int m = (bold.isSelected() ? Font.BOLD : 0) + (italic.isSelected() ? Font.ITALIC : 0); panel.setFont(m); }

Quando o usurio clica no check box um evento de ao gerado.Com o mtodo isSelected consegue-se descobrir se o controle est ou no selecionado. Por exemplo:

Figura 13 Exemplo jCheckBox.

28

Java bsico 2

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

Novamente, quando o radio pressionado, um evento de ao gerado. Por exemplo: public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); If (source == smallButton) panel.setSize(8); Else if(source == mediumButton) panel.setSize(12); ... }

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

Figura 14 Exemplo jRadioButton e buttonGroup.

Java bsico 2

29

Borda
So usados para delimitar partes da interface, como diferentes grupos de rdio. Para isso, pode-se seguir os seguintes passos: 1. a. c. f. Relevo abaixado (lowered bevel) Relevo destacado (raised bevel) Entalhe (etched) Linha (line) Fosco (matte) Vazio (empty)

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

2. 3. 4.

Se quiser, adicione um ttulo borda, BorderFactory.createTitledBorder(String).

Se voc quiser experimentar de tudo, pode-se BorderFactory.createCompoundBorder().

passando-o

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

Por exemplo:

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

combinar

bordas

ao

mtodo

com

Figura 15 Exemplo jPanel e BorderFactory.

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

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

String[] words = {quick, brown, hungry, wild}; JList wordList = new JList(words); As listas no possuem barra de rolagem automaticamente, para isso deve-se adicion-la dentro de um painel de rolagem: JScrollPane scrollPane = new JScrollPane(wordList); Depois, deve-se adicionar o painel de rolagem, e no a lista, no painel que a conter. wordList.setVisibleRowCount(10); // mostra 10 itens

Para fazer com que um nmero definido de elementos seja mostrado a cada momento, usase: Por default a lista permite mltipla seleo, para usar seleo nica, usa-se:

wordList.setSelectionModel(ListSelectionModel.SINGLE_SELECTION); O mtodo de notificao, tratamento de eventos, no se d atravs do monitoramento de eventos de ao, mas sim eventos de seleo de lista. Deve-se implementar o mtodo: public void valueChanged(ListSelectionEvent evt) no ouvinte, e a interface ListSelectionListener. Por exemplo: class ListFrame extends JFrame implements ListSelectionListener { public ListFrame() { ... JList wordList = new JList(words); wordlist.addListSelectionListener(this); } public void valueChanged(ListSelectionEvent evt) { JList source = (JList)evt.getSource(); Object[] values = source.getSelectedValues(); String text=; for (int i=0; i<values.length; i++) text += (String)values[i] + ; } }

Java bsico 2

31

Figura 16 Exemplo jList.

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

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

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

32

Java bsico 2

Figura 17 Exemplo jList.

Sesso 02 GUI em Java Exerccios de Fixao 2 GUI em Java


Liste os recursos que o pacote swing do java disponibiliza para desenvolvimento de interfaces grficas que voc aprendeu at o momento.

Atividade 1 GUI em Java


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

2. 3.

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.

Atividade 2 GUI em Java (complementar)


1.

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.

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

Menus
No necessrio um gerenciador de layout para se colocar um menu numa janela. Sua elaborao direta: JMenuBar menuBar = new JMenuBar(); Uma barra de menu pode ser colocada onde se queira, mas normalmente aparece na parte superior do frame. Usa-se: frame.setJMenuBar(menuBar); Para cada menu cria-se um objeto menu:

JMenu editMenu = new JMenu(Edit); Ento se adicionam os itens, separadores e submenus:

JMenuItem pasteItem = new JMenuItem(Paste); editMenu.add(pasteItem); editMenu.addSeparator(); ... Tambm se adiciona menus de nvel mais alto barra de menus: menuBar.addMenu(editMenu); Quando o usurio seleciona um menu ocorre um evento de ao. necessrio instalar um ouvinte de evento de ao para cada item do menu: pasteItem.addActionListener(this); A gerao desse cdigo todo um tanto quanto trabalhosa, por exemplo: JMenu menu = new JMenu(Edit); item = new JMenuItem(Cut); Java bsico 2

34

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

As teclas de atalho podem ser especificadas no construtor dos itens de menu: JMenuItem cutItem = new JMenuItem(Cut, T); Para teclas de atalho para o menu principal, deve-se usar o seguinte: JMenu helpMenu = new JMenu(Help); HelpMenu.setMnemonic(H); Para acessar as teclas de atalho usa-se ALT+ letra.

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

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.

JMenuItem cutItem = new JMenuItem(Cut, new ImageIcon(cut.gif)); Para criar itens de menu usando botes de rdio e check boxes, usa-se outros objetos:

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

ButtonGroup group = new ButtonGroup(); JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem(Insert); Java bsico 2 35

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

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

popup.show(painel, x, y);

Os menus flutuantes normalmente esto associados ao pressionamento de um boto particular do mouse, como no Windows. Para que isso acontea, deve-se: public void mouseReleased(MouseEvent evt) { if (evt.isPopupTrigger()) popup.show(evt.getComponent(), evt.getX(), evt.getY()); } Para habilitar e desabilitar itens de menu, pode-se usar: saveItem.setEnabled(false); Mas isso pode levar o cdigo a ficar cheio de instrues lidando com os menus. Ento podese usar um tratador de eventos de menu. Existe o MenuListener, com trs mtodos:

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

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

36

Java bsico 2

Figura 18 Exemplo jList.

Caixas de Dilogo
So janelas pr-definidas que so usadas para informao para o usurio. Existem dois tipos: modais que quando aparecem, o usurio no pode fazer mais nada antes de fech-la e as no modais que o usurio pode continuar o que est fazendo. Algumas janelas pr-definidas so: JOptionPane.showMessageDialog : Exibe uma mensagem e espera o usurio clicar OK; JOptionPane.showConfirmDialog : Exibe uma mensagem e obtm confirmao (OK/Cancelar); JOptionPane.showOptionDialog : Exibe uma mensagem e obtm uma opo do usurio dentre vrias;

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

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

Figura 18 Exemplo JOptionPane. Java bsico 2

37

Ordem de Travessia: Tab Order


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

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

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

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

Sesso 03 GUI em Java Exerccios de Fixao 3 GUI em Java


O que so componentes e o que so os event listeners?

Atividade 1 GUI em Java


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

38

Java bsico 2

2.

Atividade 2 GUI em Java (complementar)


3.

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

Browser com suporte a tecnologia Java Podem ser baixado pela internet subclasse

Normalmente embutido numa pgina web, executado no contexto do browser java.applet.Applet ou javax.swing.JApplet Entre o applet e blowser

Applet ou JApplet fornece a interface padro 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

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

Applets so projetados para ser incorporado em uma pgina HTML.

Quando um usurio visualiza uma pgina HTML que contm um applet, o cdigo do applet baixado para a mquina do usurio. A JVM na mquina do usurio cria uma instncia da classe do applet e invoca vrios mtodos durante a vida do applet.

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. Applets tm regras rgidas de segurana que so aplicadas pelo browser. A segurana de um applet muitas vezes referida como rea de segurana, comparando o applet para uma criana brincando em uma sandbox com vrias regras que devem ser seguidas. Outras classes que as necessidades de applets podem ser baixados em um nico arquivo Java Archive (JAR).

Ciclo de Vida de um Applet


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

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

star(): Este mtodo chamado automaticamente aps o navegador chama o mtodo init. Ele tambm chamado sempre que o usurio retorna para a pgina que contm o applet depois de ter ido para outras pginas. stop(): Este mtodo chamado automaticamente quando o usurio navega para uma pgina em que o applet no foi referenciado. destroy(): Este mtodo s chamado quando o browser for fechado normalmente. Applets so feitos para serem executados em uma pgina HTML, sendo que os recursos alocados para a sua execuo, sero removidos pelo garbage colector aps a sinalizao do mtodo destroy(), chamado quando a instncia do browser que estiver executando a pgina HTML que contm um applet for fechada.

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

paint(): Invocado imediatamente aps o mtodo start(), e tambm a qualquer momento o applet precisa se redesenhar no prprio navegador. O mtodo do paint() herdado do java.awt.

41

Um primeiro exemplo de Applet


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

Estas declaraes de importao trazer as classes no mbito da nossa classe applet: java.applet.Applet; java.awt.Graphics.

Sem essas declaraes de importao, o compilador Java no reconheceria a classe Applet, bem como os objetos visuais grficos, que a classe do applet se refere.

A classe Applet
Cada applet uma extenso da classe java.applet.Applet ou da classe javax.swing.applet.JApplet. A classe Applet base fornece mtodos que uma classe Applet derivada pode chamar para obter informaes e servios a partir do contexto browser. Estes incluem mtodos que fazem o seguinte: Obter parmetros de applet Obter a localizao de rede do arquivo HTML que contm o applet Obter a localizao de rede do diretrio da classe do applet Imprimir uma mensagem de status no navegador Buscar uma imagem Buscar um clipe de udio Redimensionar o applet

Reproduzir um clipe de udio Java bsico 2

42

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

iniciar a execuo do applet

A classe Applet fornece implementaes padro de cada um desses mtodos. Estas implementaes podem ser substitudas quando necessrio.

interromper a execuo do applet

Invocando um Applet no browser

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

Se um applet usa parmetros, os valores podem ser passados para os parmetros adicionando marcas <param> entre <applet> e </ applet>. O browser ignora texto e outras marcas entre as tags applet. Java bsico 2

43

Navegadores no-habilitados para Java no processam <applet> e </applet>. Portanto, qualquer coisa que aparece entre as tags, no relacionada com o applet, visvel em navegadores no-habilitados para Java. <applet codebase="http://amrood.com/applets" code="HelloWorldApplet.class" width="320" height="120">

O usurio ou o navegador procura o cdigo Java compilado no local do documento. Para especificar caso contrrio, use o atributo codebase da tag <applet> como mostrado: Se um applet for implementado em um pacote diferente do padro, o cominho para este pacote dever ser especificado no atributo de cdigo usando o caractere ponto (.) para separar os componentes do pacote / classe. Por exemplo: <applet code="mypackage.subpackage.TestApplet.class" width="320" height="120"> A ideia bsica de como usar applets em uma pgina Web simples: a pgina HTML deve dizer ao navegador quais applets deve carregar e, ento, onde colocar cada applet na pgina da Web. Como se poderia esperar, a tag necessria para usar um applet deve dizer ao navegador o seguinte: De onde obter os arquivos de classe; Como o applet se situa na pgina da Web (tamanho, localizao etc.).

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

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

Obtendo parmetros no Applet

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 mtodo Applet.getParameter () obtm um parmetro dado o nome do parmetro (o valor de um parmetro sempre uma string). Se o valor for numrico ou outros dados nocaracteres, a sequncia deve ser analisada e convertida atravs de classes Wrappers, por exemplo. package visao; import java.awt.BorderLayout; import javax.swing.JApplet; import javax.swing.JLabel; /** * * @author Paulo Henrique Cayres */ public class VerificarParImparApplet extends JApplet { //Executado quando o applet for carregado no browser. @Override public void init() { setSize(250, 100); JLabel lbl = new JLabel("Exemplo com passagem de parmetros",JLabel.CENTER); setLayout(new BorderLayout()); add(lbl,BorderLayout.CENTER); int num = Integer.parseInt(getParameter("numero")); Java bsico 2 O Applet Viewer ou o navegador chama o mtodo init() de cada applet que executado. O usurio chama init() uma vez ao carregar a pgina html.

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

45

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

Na sequncia o applet realiza um teste de condio e chama o mtodo showMessageDialog() de javax.swing.JOptionPane para exibir uma mensagem informando se o nmero e par ou impar. Note que estamos utilizando os mesmos componentes visuais grficos utilizados para desenvolver aplicativos desktop em Java.

Passando parmetros para o Applet

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

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

46

Java bsico 2

Applets Java versus Aplicativos


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

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

Converso de aplicao em Applet:

fcil converter um aplicativo Java grfica (isto , um aplicativo que usa o AWT ou SWING e que voc pode comear com o lanador de programa java) em um applet que voc pode inserir em uma pgina web. Aqui esto os passos necessrios para a converso de um aplicativo para um applet: Faa uma pgina HTML com a tag <APPLET></APPLET> apropriada para carregar o cdigo do applet. Fornecer uma subclasse da classe JApplet. Esta subclasse deve ser declarada como pblica. Caso contrrio, o applet no pode ser carregado. Eliminar o mtodo principal na aplicao. No construa um Frame para a aplicao. A sua aplicao ser exibida dentro do navegador.

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

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

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

Java bsico 2

47

Manipulao de eventos no Applet


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

Para possibilitar controle de eventos, um applet deve implementar a classe de interface especfica do evento apropriado e reescrev-lo para atender a especificidade da aplicao em desenvolvimento. O cdigo abaixo implementa a interface MouseListener para controlar eventos do mouse no applet implementado: package visao; import import import import java.awt.Graphics; java.awt.event.MouseEvent; java.awt.event.MouseListener; javax.swing.JApplet;

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

addItem("unloading the applet");

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

49

Exibindo imagens no Applet


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

/** * * @author Paulo Henrique Cayres */ public class ExemploImgApplet extends JApplet { private Image image; private AppletContext context; public void init() { 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!"); }

50

Java bsico 2

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

Reproduo de udio no Applet


Um applet pode reproduzir um arquivo de udio representado pela interface AudioClip no pacote java.applet. A interface AudioClip tem trs mtodos, incluindo: public void play(): Reproduz o clipe de udio uma vez, desde o incio. public void stop(): Para a reproduo do clipe de udio. public void loop(): Faz com que o clipe de udio seja reproduzido continuamente. 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. formato de arquivo Sun Audio (.au) Windows wave (.wav) Macintosh AIFF (.aif ou .AIFF)

O mecanismo de som que reproduz os clipes de udio suporta vrios formatos de arquivo de udio, incluindo:

package visao; import import import import import /** * Java bsico 2

Segue-se o exemplo mostrando todos os passos para ter um udio: java.applet.AppletContext; java.applet.AudioClip; java.net.MalformedURLException; java.net.URL; javax.swing.JApplet;

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

51

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

Exerccios de Fixao 4 Applets


Qual a diferena entre lanar uma exceo e capturar uma exceo? 52 Java bsico 2

Atividade 1 Applets
1. 2. 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.

3.

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.

5. 6.

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

Implemente na interface do exerccio 3 botes de ao (JButton) para possibilitar incluso, consulta e excluso de objetos instanciados da classe Pessoa em um ArrayList. A excluso ser realizada por meio do nome da Pessoa. Implemente na interface do exerccio 3 um JTextArea onde sero listados os objetos em ordem alfabtica. A ordenao ser executada aps clique num boto.

Java bsico 2

53

Atividade 2 GUI em Java (complementar)


1. Construa um Applet Java que apresente uma tela com uma campo de entrada de dados ou impar. (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.

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.

54

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 Erro de lgica

Durante a execuo de mtodos Uso inadequado da API

Uso de classes especializadas

No compromete a inteligibilidade do cdigo Implementado por meio de interfaces

Os erros em Java so tratados como em C++, atravs de excees. Em Java, todas as excees descendem de Throwable, mas a hierarquia se divide em Error e Exception. Os erros da classe Error descrevem erros internos e de exausto de recursos. Pouco se pode fazer numa situao dessas, alm de informar ao usurio e deixar o programa de forma segura. Essas situaes so raras. Ao programar em Java, deve-se focalizar a hierarquia Exception. Esta tambm se divide em excees que derivam de RuntimeException e as que no. A regra geral a seguinte: As excees que derivam da RuntimeError 56 Java bsico 2 Uma RuntimeError ocorre porque houve um erro de programao. Qualquer outra exceo ocorre devido a algo errado, como erro de I/O que tenha ocorrido no programa.

incluem problemas como:

Converso explcita de tipo (cast); Acesso de ponteiro nulo.

Acesso a elemento de array alm dos limites; As excees que no derivam do RuntimeError incluem: Tentar ler alm do final de um arquivo; Tentar abrir uma URL incorreta; Tentar encontrar um objeto Class atravs de uma string que no denota uma classe existente.

Figura 19 Hierarquia de excees.

Descrever Excees em Mtodos


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

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

Java bsico 2

57

Num erro de programao; 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: Num erro interno do Java.

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

Levantar uma Exceo


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

EOFException e = new EOFException(); throw e; E para juntar tudo que foi visto nesta sesso:

String lerDados(BufferedReader ent) throws EOFException { ... while (...) { Java bsico 2

58

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

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

Criar Novas Excees


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

String lerDados(BufferedReader ent) throws ExecucaoTamanhoArquivo { ... while (...) { if (ch == -1) // encontrou EOF throw new ExecucaoTamanhoArquivo(); } }

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

59

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

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

Exerccios de Fixao 5 Tratamento de Erros


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

Atividade 1 GUI em Java


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

60

Java bsico 2

3.

4. 5.

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

Atividade 2 GUI em Java (complementar)


1.

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.

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

Defina a classe ContaCorrente contendo os atributos nmero da conta, nome do cliente e negativo e quando se saca uma quantidade maior que o saldo atual.

saldo para lanar excees (definidas por voc) quando a conta construda com saldo Faa uma aplicao Java com uma interface que possibilite a digitao de informaes armazenar num ArrayList.

2.

para instanciar objetos da classe ContaCorrente (criada no enunciado anterior) e Faa uma aplicao Java com uma interface que possibilite informar o nmero de uma

3.

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 em caso de saque de valores superiores ao saldo atual da conta.

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. valores mnimo e mximo aceitos. valores mnimo e mximo aceitos.

getInt para leitura de um inteiro, com parmetros que representem os getFloat para leitura de um flutuante, com parmetros que representem os getChar para leitura de um caractere , com um parmetro do tipo String

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.

contendo um conjunto de caracteres aceitos.

Java bsico 2

61

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

Controle de entrada e sada Pacote java.io

Leitura/Escrita de Dados

Orientada a bytes (modo binrio)

Serializao de Objetos Outros

Orientada a caracteres (modo texto)

Acesso Aleatrio: classe RandomAccessFile

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

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

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.

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.

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.

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.

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

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

Os arquivos abertos desta maneira retornam um manipulador de arquivo, um valor inteiro que utilizado para fazer referncia ao arquivo em operaes subseqentes. Em geral, uma prtica ruim de programao misturar funes de I/O stream com rotinas de baixo nvel.

Java bsico 2

63

Como as funes stream so bufferizadas e as funes de baixo nvel no, a tentativa de acessar o mesmo arquivo ou dispositivo por dois mtodos diferentes leva confuso e eventual perda de dados nos buffers.

Stream em Java

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

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

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

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

Deve-se considerar a serializao de objetos semelhante diviso de um objeto em pequenos pedaos para poder escrev-los em uma stream de bytes. O termo para este processo serializao de objetos.

Entrada e Sada baseada em Bytes

A classe abstrata OutputStream contm definies de mtodos write para gravao de bytes de um arquivo. O mtodo de gravao de byte abstrato, devendo ser redefinido em subclasses, como FileOutputStream e DataOutputStream. O cdigo abaixo ilustra a utilizao dos mtodos writeInt() e writeDouble() utilizados para gravao de bytes de um arquivo informado pelo usurio. import java.io.*; public class EscritaBytes { public static void main(String a[]) { // verifica presena do argumento obrigatrio com nome do arquivo if (a.length==0) { System.out.println("uso:\njava EscritaBytes <nomeArquivo> [quant]"); System.exit(-1); } // efetua abertura do arquivo DataOutputStream dos = null; try { dos = new DataOutputStream(new FileOutputStream(a[0])); System.out.println("Arquivo '" + a[0] + "' aberto."); } catch(FileNotFoundException e) { System.out.println(e); System.exit(-1); } // converte quantidade dada pelo usurio ou usa default int quant = 10; try { Java bsico 2 65

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

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

O cdigo abaixo ilustra a utilizao dos mtodos readInt() e readDouble() utilizados para leitura de bytes de um arquivo informado pelo usurio. public class LeituraBytes { public static void main(String a[]) { // verifica presena de argumento com nome do arquivo if (a.length==0) { System.out.println("uso:\njava LeituraBytes <nomeArquivo>"); System.exit(-1); } // efetua a abertura do arquivo, para leitura de bytes DataInputStream dis = null; try { dis = new DataInputStream(new FileInputStream(a[0])); System.out.println("Arquivo '" + a[0] + "' aberto."); } catch(FileNotFoundException e) { System.out.println(e); System.exit(-1); } // efetua a leitura do arquivo enquanto existirem dados Java bsico 2

66

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

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

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

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

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

Exerccios de Fixao 6 Java I/O


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

Atividade 1 Java I/O


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

Java bsico 2

69

2. Atividade 2 Java I/O (complementar)


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

bruto maior ou igual a 1000, 3% sobre o salrio bruto; caso contrrio, 1% sobre o salrio Java que apresente as seguintes opes:

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

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

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

bruto) e salrio lquido (salrio bruto descontos). Desenvolva um aplicao GUI em a) Incluir (solicitao dos dados de um funcionrio e gravao de um registro com os dados da folha de pagamento no arquivo) b) Listar (leitura dos dados da folha de pagamento de um funcionrio do arquivo, mostrando as informaes do contra-cheque)

6.

A comisso organizadora de um campeonato de atletismo decidiu apurar os resultados da competio atravs de um processamento eletrnico. De cada atleta so lidos: cdigo de identificao, nome e o tempo gasto em cada uma das 5 provas que formam a competio. Esses dados so armazenados em um arquivo. Ao final de cada prova, a pontuao atribuda de acordo com o tempo realizado em cada prova (quem gastou geral do campeonato. Desenvolva uma aplicao GUI em Java que apresente as seguintes opes: menos tempo est em 1 lugar) e feita da seguinte maneira: 1 colocado: 5 pontos, 2 colocado: 3 pontos e 3 colocado: 1 ponto. Essa pontuao atualizada na pontuao

a) Incluso dos dados (solicitao dos dados de um atleta e gravao de um registro no arquivo)
b) Classificao (leitura dos dados dos atletas e processamento dos tempos e pontos)

70

Java bsico 2

Java bsico 2

71

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

JDBC

O que JDBC

Arquitetura e API

Detalhes e uso da API Drivers

Drivers de acesso a banco de dados

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

72

Java bsico 2

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

Alm disso, precisa-se de um driver para acesso ao banco de dados que se quer. Atualmente os drivers de acesso a banco de dados para aplicaes desenvolvidas em java esto disponveis no site do fornecedor do SGBD que voc necessita acessar. Por exemplo, para acesso ao PostgreSQL, usa-se o driver JDBC para PostgreSQL. O driver deve ser colocado no CLASSPATH do projeto para que possa ser referenciado. Os passos para o acesso so: 1. Instalao do driver e insero no CLASSPATH; 2. Registro do driver no cdigo 3. Criao de uma conexo 4. Executar consultas SQL. Alm de acessos usando-se drivers, pode-se usar uma ponte que vai desde o JDBC ao ODBC, para acesso de bases Win32.

Java bsico 2

73

A arquitetura JDBC pode ser melhor visualizada na seguinte figura:

Figura 22 Arquitetura JDBC.

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

74

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

rs = st.executeQuery("select * from tb_cliente"); while (rs.next()) { System.out.println(rs.getString("nome_cliente")); } st.close(); con.close();

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

Obtendo Conexes

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

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

Executando Consultas

O objeto Connection tambm responsvel pela dinmica de atualizao das alteraes no banco: commit e rollback.

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

Java bsico 2

75

Sesso 07 JDBC Exerccios de Fixao 7 Java JDBC


Quais as principais diferenas dos objetos Statement e PreparedStatement?

Atividade 1 Java JDBC


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

76

Java bsico 2

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

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

Encontre os nomes (primeiro nome) de todos os empregados que so diretamente supervisionados por Joaquim. Faa uma lista dos nmeros e nomes de projetos que envolvam um empregado cujo ltimo nome seja Will, mesmo que esse trabalhador seja o gerente do departamento que controla o projeto.

Para todo projeto localizado em Araucaria, liste o nome do projeto, o nome do departamento de controle e o ltimo nome, endereo e data de nascimento do gerente do departamento.

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

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

Recupere os nomes de todos os empregados que trabalhem mais de 10 horas por semana no projeto Automatizacao.

77

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

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

Atividade 2 Java JDBC

1. 2. 4. 5. 3.

Liste os nomes de todos os empregados com dois ou mais dependentes. Recupere o nome de empregados que no tenham dependentes.

Encontre o nome e o endereo de todos os empregados que trabalhem em pelo menos um projeto localizado em Curitiba, mas cujo departamento no se localiza em Curitiba.

Liste o ltimo nome de todos os gerentes de departamento que no tenham dependentes. Liste os nomes dos gerentes que tenham, pelo menos, um dependente.

Executando Alteraes

Para executar alteraes no banco, como inserts, updates, criao de tabelas, usa-se: Esse mtodo no retorna resultado, somente gera exceo caso haja erro.

st = con.createStatement(); st.executeUpdate("create table teste (cod int, nome char(50))");

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. String name = rs.getString(nome); int cod = rs.getInt(cod);

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. PreparedStatement pstmt = con.prepareStatement( insert into teste (cod, nome) values (?, ?));

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

Repare que h dois pontos de interrogao (?) na instruo. Isso so parmetros da instruo, que devem ser preenchidos antes da sua execuo: pstmt.setInt(1, 1); pstmt.setString(2, Camila); Onde o primeiro parmetro (1 e 2) a posio do parmetro. O segundo o valor a ser colocado no lugar das interrogaes. Assim como as funes get*, as funes set* podem inserir qualquer tipo de dados numa instruo preparada. pstmt.executeUpdate(); Depois de inseridos os parmetros, pode-se executar a consulta:

Se fosse uma query (select) pode-se tambm usar: pstmt.executeQuery();

Sesso 08 JDBC Exerccios de Fixao 8 Java JDBC


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

Java bsico 2

79

Atividade 1 Java JDBC


1. Uma indstria deseja manter um banco de dados sobre a folha de pagamento mensal de seus funcionrios. Para isso, lido de cada funcionrio: o nome, o salrio-base e uma

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

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

bruto maior ou igual a 1000, 3% sobre o salrio bruto; caso contrrio, 1% sobre o salrio Java que apresente as seguintes opes: bruto) e salrio lquido (salrio bruto descontos). Desenvolva uma aplicao GUI em

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

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

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

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

Atividade 2 Java JDBC


1.

Defina um novo banco de dados no PostgreSQL que dever possuir trs tabelas. A inteiro) e sua descrio (literal). A terceira, denominada FUNCIONRIO, dever conter o

primeira, denominada DEPARTAMENTO, dever conter o cdigo (valor inteiro) e seu nome (literal). A segunda, denominada OCUPAO, dever conter o cdigo (valor o cdigo do departamento em que esta lotado. JDBC: nmero de registro do funcionrio (valor inteiro), o nome (literal), o cdigo de ocupao,

2.

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

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

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

80

Java bsico 2

Os dados das tabelas relacionadas devero estar acessveis em objetos JComboBox; d) Implementar uma classe executvel que disponibilize um Menu com opes de acesso para as telas implementadas nos itens a, b e c.

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

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

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

Nesse caso, a primeira interrogao ({ ?= ...) ter o ndice 1 para o registerOutParameter. Todos os parmetros de sada (OUT) devem ser registrados com registerOutParameter, antes de chamar o procedimento.

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

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

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

81

A conexo em java , por default, auto-commit. Isso significa que sempre que um comando executado, um commit executado no banco de dados. Se o comando auto-commit for desabilitado, ento deve-se fazer explicitamente o commit ou rollback das transaes. A maioria dos drivers JDBC suportam transaes. Um exemplo de cdigo: con.setAutoCommit(false); Statement st = con.createStatement(); .... con.commit(); con.setAutoCommit(true); O comando setAutoCommit aplicado conexo, e define se os commits e rollbacks sero ou no efetuados automaticamente. Caso no sejam, a conexo disponibiliza os comandos commit() e rollback().

Execuo em Batch

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

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

A linha:

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

A linha:

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

Sesso 09 JDBC Exerccios de Fixao 9 Java JDBC


Liste as principais recursos que voc consegue identificar que sejam necessrios para o desenvolvimento de aplicaes java que possibilitem acesso a banco de dados?

Atividade 1 Java JDBC


1. Uma loja decidiu fazer o levantamento de informaes em relao aos produtos que disponibiliza para venda, juntamente com informaes de seus fornecedores. Durante a fase de especificao de requisitos e entrevistas com o usurio os analistas conseguiram identificar a necessidade da criao da entidade Produto (nome, preo de compra, preo de venda, estoque e estoque mnimo) e tambm a entidade Fornecedor (nome, endereo, telefone, contato). Verificou-se tambm que a relao entre estas entidades de (1:N), sendo necessria a criao de um relacionamento entre Produto e Fornecedor, visto que um produto pode ser fornecido por apenas um fornecedor e um fornecedor pode fornecer mais de um produto para esta empresa. 2.1. Crie um banco de dados no PostgreSQL com o nome de estoque. 2.1.1. Crie as tabelas, com base nas estruturas de dados descritas anteriormente, que iro compor o banco de dados no SGBD PostgreSQL. 2.2. Desenvolva uma aplicao GUI Java que disponibilize as seguintes funcionalidades: 2.2.1. Classes modelos para cada uma das tabelas implementadas no banco de dados da aplicao; 83

Desenvolva os problemas descritos abaixo:

Java bsico 2

3. Atividade 2 Java JDBC


1.

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 devem ficar armazenados em uma tabela no PostgreSQL e a cada vez que for solicitado, o categoria funcional (numrica: 1-operrio, 2-administrativo ou 3-gerncia). Os dados contracheque de um funcionrio deve ser exibido, com as seguintes informaes: nome do funcionrio, salrio bruto (se da categoria 1, o prprio salrio-base; se da categoria

bruto maior ou igual a 1000, 3% sobre o salrio bruto; caso contrrio, 1% sobre o salrio Java que apresente as seguintes opes: bruto) e salrio lquido (salrio bruto descontos). Desenvolva um aplicao GUI em

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

a) Incluir (solicitao dos dados de um funcionrio e gravao de um registro com os dados da folha de pagamento no arquivo).
b) Listar (leitura dos dados da folha de pagamento de um funcionrio do arquivo, mostrando as informaes do contracheque).

3.

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

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

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

competio. Esses dados so armazenados em um arquivo. Ao final de cada prova, a Java bsico 2 pontuao atribuda de acordo com o tempo realizado em cada prova (quem gastou

84

menos tempo est em 1 lugar) e feita da seguinte maneira: 1 colocado: 5 pontos, 2 colocado: 3 pontos e 3 colocado: 1 ponto. Essa pontuao atualizada na pontuao geral do campeonato. Desenvolva uma aplicao GUI em Java que apresente as seguintes opes:

a) Incluso dos dados (solicitao dos dados de um atleta e gravao de um registro no arquivo)
b) Classificao (leitura dos dados dos atletas e processamento dos tempos e pontos)

Java bsico 2

85

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

Sistema Operacional e Processos Threads em Java O que Thread?

Classe Thread ou Interface Runnable Operaes sobre Threads Prioridades de Threads

Sincronizao

Programao concorrente

Uma thread uma ramificao do programa, ou trecho, em execuo, que executada paralelamente. A JVM permite que uma aplicao tenha mltiplas threads executando concorrentemente.

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

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.

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

O mtodo exit da classe Runtime tenha sido chamado e o gerenciador de segurana tenha permitido a operao de sada;

Mltiplas Linhas de Execuo (Thread)

Todas as threads que no so daemon tenham terminado, ou retornando da chamada run, ou levantando uma exceo que se propaga at o mtodo run.

Esse captulo discute profundamente os conceitos de thread e, atravs de exemplos detalhados, esclarece o modelo Java de threading.

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?

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

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.

Incio do Thread e Programao de Thread

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

87

Analogamente, um thread que se torna executvel aps estar bloqueado (inativo ou aguardando operaes de E/S, por exemplo) sempre se posiciona no fim da fila.

Todos os threads executveis, mas no executados, so mantidos em filas segundo as respectivas prioridades. O primeiro thread da fila de maior prioridade que no estiver vazia ser executado. Quando um thread para de ser executado por causa de uma precedncia, ele tirado do estado de execuo e colocado no fim da fila de espera.

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.

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.

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

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.

Figura 08 thread, fila de executveis.

88

Java bsico 2

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

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

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.

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.

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 }

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

Java bsico 2

89

Em um determinado trecho de cdigo, possvel obter uma referncia ao thread atual utilizando o mtodo currentThread() do Thread esttico, como mostrado no prximo exemplo na linha 6.
1 2 3 4 5 6 7 8 9 public class xyz implements Runnable { public void run() { while (true) { // vrias coisas interessantes if (time_to_die) Thread.currentThread().stop(); } } }

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

Teste de um Thread

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

Suspendendo Threads

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

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

90

1 2 3 5 6 7 8 9 4

public class xyz implements Runnable { public void run() { // faz vrias coisas interessantes... // aguarda at receber ordem para continuar Thread.currentThread().suspend (); // faz mais coisas... } }

-------------------------------------------------------------------------------10 11 12 13 14 15 16 17 18 19 21 22 20 ... Runnable r = new xyz(); t.start();

Thread t = new Thread(r); // pausa para xyz ser executado por um momento // pressupor que atinge seu suspend()... Thread.sleep(1000); // torna xyz executvel novamente t.resume(); // executa efetivamente Thread.yield();

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.
TimerThread tt = new TimerThread (100); tt.start (); ... public void timeout() { // Aguarda aqui o thread temporizador concluir tt.join (); ... // Continua nesse thread ... }

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

1 2 3 4 5 6 7 8 9 10

Java bsico 2

91

Implementar Runnable Versus Estender Thread


Dadas s possibilidades de criao de threads, como decidir entre elas? H alguns pontos a favor de cada tcnica: A favor da implementao de Runnable: Do ponto de vista da orientao a objetos, a classe Thread estritamente um encapsulamento de uma CPU virtual, e como tal deve ser estendida somente quando o comportamento desse modelo de CPU for alterado ou estendido de alguma forma. Normalmente, essa alterao ou extenso no objeto do nosso exerccio. Por causa disso, e devido importncia de fazer a distino entre as partes de CPU, cdigo e dados de um thread executado, esse mdulo utilizou esse mtodo de implementao. Como a tecnologia Java s permite uma nica herana, no possvel estender nenhuma outra classe, como Applet, se Thread j foi estendida. Em algumas situaes, essa limitao forar a utilizao do mtodo da implementao de Runnable. A favor da extenso de Thread:

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

As Trs Partes de um Thread

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.

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.

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.

92

Java bsico 2

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

Figura 09 As trs partes de um thread.

Implementando uma Thread Mtodo Mais Comum

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

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

Java bsico 2

93

O exemplo a seguir implementa threads para executar um aplicativo que disponibiliza relgios com horrios de 6 pases diferentes. A execuo deste aplicativo utiliza de threads para efetuar a movimentao do ponteiro de todos os relgios.
import import import import java.awt.*; java.awt.event.*; javax.swing.*; java.util.*;

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.

public class TimerTest { public static void main(String[] args) { JFrame f = new TimerTestFrame(); f.show(); } } class TimerTestFrame extends JFrame { public TimerTestFrame() { setSize(450, 300); setTitle("TimerTest"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); Container c = getContentPane(); c.setLayout(new GridLayout(2, 3)); c.add(new ClockCanvas("Brasil", "GMT-2")); c.add(new ClockCanvas("Taipei", "GMT+8")); c.add(new ClockCanvas("Berlin", "GMT+1")); c.add(new ClockCanvas("New York", "GMT-5")); c.add(new ClockCanvas("Cairo", "GMT+2")); c.add(new ClockCanvas("Bombay", "GMT+5"));

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

94

Java bsico 2

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

private final int LOCAL = 16;

Tratamento de Regies Crticas com Threads


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

Java bsico 2

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.

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

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

96

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

Um Resumo do Funcionamento do Mecanismo de Sincronismo


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

Para chamar um mtodo synchronized, o parmetro implcito no pode ser bloqueado. Chamar o mtodo bloqueia o objeto. Retornar da chamada desbloqueia o objeto parmetro implcito. Assim, apenas uma linha de execuo por vez pode executar mtodos synchronized em um objeto especfico. Quando uma linha de execuo executa uma chamada wait(), ela renuncia ao bloqueio do objeto e entre em uma lista de espera.

2.

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

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

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. Lembre-se de que wait() e notify()/notifyAll() so mtodos da classe Object e no da classe Thread. Confira se suas chamadas a wait() correspondem a uma notificao no nomes de objetos.

Java bsico 2

97

Exerccios de Fixao 10 Thread


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

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

2.

3. 4.

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

98

Java bsico 2

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

2.

Java bsico 2

99

Bibliografia
DEITEL. Java Como Programar. 6a. ed. So Paulo: Pearson Prentice Hall, 2005. JANDL Junior, Peter. Java Guia do Programador. So Paulo: Novatec, 2007. HORSTMANN, Cay. CORNELL, Gary. Core Java 2 Fundamentals. The Sun Microsystems Press Java Series. Vol. I. 2003. POSTGRESQL. The Java Tutorials. Disponvel em: http://docs.PostgreSQL.com/javase/tutorial/. Acessado em: 29 jan. 2013.

SIERRA, Kathy; BATES, Bert. Certificao Sun Para Programador Java 6 Guia de Estudo. So Paulo: Rio de Janeiro, 2008.

100

Java bsico 2

Você também pode gostar