Vous êtes sur la page 1sur 26

2 - JAVA: Tecnologia e Introduo Linguagem

2.1 Introduo
Ainda que o objectivo fundamental deste curso seja a Programao por Objectos (PPO) usando a linguagem JAVA5, JAVA hoje em dia uma palavra reservada que significa muito mais do que uma outra linguagem de programao por objectos, pelo que se torna importante compreender as razes que fazem com que seja actualmente to relevante conhecer tal linguagem, saber us-la como ferramenta para programar por objectos, bem como conhecer a tecnologia subjacente linguagem e perceber as razes do to grande impacto causado na rea da Informtica por esta tecnologia, genericamente designada tecnologia JAVA.

2.2 Gnese da tecnologia JAVA


A Engenharia de Software sempre procurou solues para a mxima "escrever cdigo uma vez e reutilizlo sempre que possvel". A deu, por vrias razes, algumas esperanas quanto possibilidade de implementar tal mxima. Porm, questo simples onde, em que plataforma, tal reutilizao pode ter lugar?, as respostas no foram satisfatrias. Ou seja, tal mxima poderia at ser cumprida em ambientes monolticos, monoplataforma, mas a estes se limitava. Em termos concretos, tal no era sequer completamente aplicvel s grandes organizaes, que tipicamente se baseiam em ambientes multiplataforma e multitecnologia. A linguagem Smalltalk foi durante muitos anos um bom exemplo desta filosofia de reutilizao, j que se baseava num compilador que gerava um cdigo intermdio, para o qual haveria apenas que desenvolver interpretadores especficos para cada possvel plataforma. A ideia estava, pois, e desde os anos 70, perfeitamente correcta. Porm, o aparecimento da linguagem C++ e de outras linguagens de PPO tais como Objective-C e ObjectPascal, bem como outras que, no o sendo de forma muito pura, ofereciam ambientes atractivos de desenvolvimento de programas (pelo menos para PC), tais como VisualBasic, Delphi e VisualC++, fez com que a adopo de uma destas linguagens e uma sria aposta a uma escala mais alta do que a da simples programao (o projecto, o desenvolvimento, a manuteno, etc.) fosse sendo adiada pelos grandes construtores e pelas grandes empresas de software. A IBM ainda chegou a anunciar em 1994/95 a linguagem Smalltalk como a sua linguagem de PPO, tendo at desenvolvido um ambiente de projecto, o VisualAge-Smalltalk. Hoje restam, pragmaticamente, C++, C# e JAVA. A linguagem JAVA comeou a ser desenvolvida no incio dos anos 90 no seio de uma pequena equipa de engenheiros de software da Sun Microsystems, liderada por James Gosling. O objectivo era desenvolver uma pequena linguagem para equipamentos electrnicos com chips programveis, tais como torradeiras, mquinas de lavar, agendas electrnicas de bolso, etc. Os principais requisitos da linguagem a desenvolver eram a robustez e a segurana (os utilizadores destes dispositivos no admitem erros ou falhas), o baixo custo (os programas teriam que ser simples) e a independncia dos chips (dado que os construtores com grande facilidade os substituem). O projecto, de 1991, designava-se Green. Numa primeira fase, o modelo do UCSD Pascal, uma das mais bem sucedidas linguagens para PC, ainda ter sido considerado, ou seja, a gerao de um cdigo intermdio aps a compilao o p-code e a criao de interpretadores para arquitecturas especficas. Em geral, o p-code era pequeno e os interpretadores de p-code eram igualmente de reduzida dimenso. A maioria dos engenheiros de software do grupo tinha formao em Unix e, portanto, grandes conhecimentos de C e C++, pelo que pretenderam usar os conhecimentos j
Tecnologia Java
1

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

adquiridos e a sua segurana nestas linguagens. Porm, as anlises feitas pela equipa s linguagens C e C++ revelaram no serem estas as linguagens adequadas, por um lado, dada a sua complexidade e dificuldade associada em escrever cdigo garantidamente seguro e, por outro, por necessitarem de um compilador especfico para cada tipo de chip. A equipa desenvolveu ento a linguagem JAVA, inicialmente designada Oak, simples, segura e independente de arquitecturas (1992). O primeiro produto lanado foi um controlo remoto extremamente inteligente, o *7, que, apesar de tudo, ningum pretendeu produzir. Em 1993, a equipa confrontada com o aparecimento da World Wide Web via Internet e do extraordinrio impacto produzido. JAVA perfila-se ento, dadas as suas caractersticas, como uma linguagem fundamental para a Internet. A sua neutralidade relativamente a arquitecturas torna-a ideal para o desenvolvimento de aplicaes que, com facilidade, pudessem ser executadas em qualquer das diferentes mquinas ligadas Internet. A grande demonstrao das capacidades da linguagem JAVA como linguagem de programao para a Internet (www) foi o aparecimento dos applets JAVA, consistindo em pequenas aplicaes programadas em JAVA e que podiam ser executadas no contexto de outras aplicaes. A equipa de Gosling desenvolveu, ento, um Web browser JAVA, o HotJava, que foi o primeiro browser a poder executar applets no contexto de pginas HTML, tornando-as assim no apenas interactivas mas tambm dinmicas, ou seja, mutveis em contedo e aparncia. HotJava foi provavelmente a maior demonstrao do poder da linguagem JAVA e, possivelmente, o ponto fulcral de consagrao e aceitao desta tecnologia desenvolvida pela Sun Microsystems. Companhias como a IBM, a Netscape, a Oracle, a Symantec, a Borland, a Corel e outras, aderiram, a partir de ento, ao projecto JAVA. Em 1995, a Netscape lana a verso 2.0 do seu browser, j aceitando applets e scripts JAVA (usando a linguagem JavaScript). Em 1995, na Sun World Conference, a linguagem JAVA foi oficialmente anunciada. Alguns autores afirmam que, para alm das capacidades e potencialidades intrnsecas da linguagem, com vocao via bibliotecas adequadas para processamento usando tecnologia cliente-servidor e fcil acesso a comunicaes, JAVA ter tido a sorte, ou a viso comercial dos seus autores, de ter visto a sua JVM distribuda com os dois Web browsers de maior sucesso no mundo: Netscape e Explorer. A penetrao de JAVA no mercado foi, por esta razo, para alm dos mritos intrnsecos da linguagem, de um nvel esmagador. Os passos seguintes da curta histria de JAVA so: a criao, em 1996, da JavaSoft pela Sun, empresa destinada a desenvolver produtos JAVA para as mais diversas reas e que em 1998 apresenta j um catlogo de centenas de produtos; o lanamento do ambiente de desenvolvimento JDK1.0 em 1996; a primeira conferncia sobre produtos JAVA, a JavaOne Conference, em 1996; a adeso da Corel em 1996, que acaba por falhar; o lanamento do JDK1.1 em Fevereiro de 1997 j com JavaBeans e outras facilidades de desenvolvimento; o anncio da plataforma Java Card 2.0 em 1997; e o processo em tribunal da Sun contra a Microsoft, em Outubro de 1997, por esta empresa ter desenvolvido cdigo JAVA para o Explorer 4.0 que no passou nos testes de compatibilidade de JAVA da Sun, requisito acordado na licena de JAVA assinada pela MicroSoft. A Microsoft vingar-se-ia tecnologicamente em 1998, ao apresentar (cf. testes realizados por peritos da PC Magazine em Abril de 1998) a mais compatvel JVM para Windows, e o ento melhor ambiente de desenvolvimento, o Microsoft J++. Em Janeiro de 1998, a Sun conquista a TCI (TeleComunications Inc.), o maior fornecedor americano de infra-estruturas de TV Digital. Em 1999, a plataforma JAVA 2 e a verso beta de J2EE so lanadas. Em 2000, lanada a J2EE e o JDK1.2. Em 2003, 75% dos programadores profissionais americanos usam JAVA como a sua principal linguagem de programao. Em finais de 2004, a plataforma J2SE5 (Projecto Tiger) com o JDK5 lanada, tendo sido introduzidas as maiores alteraes na linguagem JAVA desde a sua criao. Em 2005, anunciada a plataforma JSE6 de nome Mustang.

2.3 O Que a tecnologia JAVA


A ideia forte associada linguagem JAVA escrever cdigo uma vez e execut-lo em qualquer parte. Para que tal seja possvel, o cdigo fonte das aplicaes escritas em JAVA tem que ser isolado pelo ambiente JAVA dos sistemas operativos das mquinas e dos dispositivos de hardware. Logo, tal cdigo no pode ser
2

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM

compilado directamente para cdigo nativo das mquinas, mas antes para uma representao especial, neutra, designada por byte-code. Em seguida, este cdigo intermdio ser interpretado sobre o ambiente particular de cada mquina, para tal sendo desenvolvido um interpretador particular do byte-code para cada plataforma onde se pretendam executar programas JAVA. Este runtime-engine, ou motor de execuo, designa-se por JAVA Virtual Machine (JVM) e deve ser instalado no computador cliente de cdigo JAVA (Figura 2.1).
Java byte-code (1010100010010001)

Biblioteca de Classes

Java Class Loader

S D K

JVM
Interpretador de Java Compilador Just-in-Time

Sistema de Runtime de Java

Sistema Operativo

Hardware

Figura 2.1 Ambiente de execuo de JAVA

A JVM recebe byte-code e transforma-o em instrues executveis na mquina particular onde o ambiente JAVA instalado. Assim, como fcil compreender, existem JVMs para diferentes browsers, sistemas operativos (ex.: Windows, Linux, Solaris, Mcintosh, etc.), dispositivos electrnicos (ex.: telemveis, PDA, consolas de jogos, satlites, etc.), enfim, qualquer dispositivo programvel. importante desde j perceber que o que torna JAVA uma linguagem muito atractiva para toda a indstria de computadores, no ser apenas uma nova linguagem de programao, ainda por cima por objectos e adicionalmente quase totalmente pura, mas sobretudo porque JAVA se posicionou como um atractivo e bem apetrechado ambiente de programao e desenvolvimento de aplicaes no contexto actual, para o que foram desenvolvidas plataformas especficas consoante o tipo de desenvolvimento de software a realizar. Assim, e de base, existem trs tipos de plataformas: as JSE (Java Standard Edition), as JEE (Java Platform Enterprise Edition) e as JME (Java Platform Micro Edition). As siglas destas plataformas e dos respectivos ambientes de desenvolvimento foram, com a sada da verso 1.5.0 da plataforma Java 2 Standard Edition (J2SE), normalizadas. De facto, quer para a linguagem JAVA quer para as plataformas, as designaes 1.0, 1.1 e 1.2 referem-se a verses de desenvolvimento, enquanto que 1, 2 ou 5 se referem a verses de produto. Por isso, e relativamente linguagem propriamente dita, h livros de JAVA, de JAVA2 e agora de JAVA5. A explicao portanto a mesma, ou seja, as verses 1.3 e 1.4 saram mas no foram quase notadas. Quando a Sun lanou a verso 1.2 das suas plataformas, passou a design-las por J2SE e J2EE, respectivamente, referindo-se-lhes como plataforma 2. Agora, os nomes e verses so J2SE 5.0, JDK 5.0 (para o sistema de desenvolvimento da J2SE), JRE 5.0, J2EE 5.0, J2EE 5 SDK e J2ME5.

Tecnologia Java5

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

As plataformas JSE so plataformas vocacionadas para o desenvolvimento de aplicaes em computadores pessoais ou workstations com arquitecturas mono ou multiprocessador e servidores. So constitudas ao mais baixo nvel pelo Java Runtime Environment (JRE) e por diversas camadas de utilitrios de desenvolvimento que constituem o respectivo Java Standard Development Kit (SDK ou JDK). As plataformas JSE so as mais comuns e mais usadas, no apenas pelas suas caractersticas, mas tambm porque a partir delas que so desenvolvidas as plataformas JEE. As plataformas JEE destinam-se ao desenvolvimento de aplicaes tipo cliente-servidor para redes, intranets e Internet, muito centradas em servios Web on-line, processamento de pginas HTML, transaces com bases de dados, transaces seguras, protocolos e mltiplas interfaces grficas com os utilizadores. As plataformas JEE baseiam-se na tecnologia JSP (Java Server Pages) e em servlets (programas no autnomos a executar no servidor) para a criao de pginas HTML como forma de apresentao de dados aos clientes de uma aplicao. A comunicao com bases de dados realizada atravs de um protocolo designado por Java Database Connectivity (JDBC) que em JAVA o equivalente ao protocolo standard ODBC (Open Data Base Connectivity). Componentes designados por Enterprise JavaBeans (EJB), associados a um servidor prprio deste tipo de servios, fornecem diversas funcionalidades importantes, tais como gesto de concorrncia, de segurana e de memria. As plataformas JME so ambientes de desenvolvimento para dispositivos mveis ou portteis, tais como telemveis, PDA, etc. Esta plataforma contm configuraes e bibliotecas prprias para que quem desenvolve possa ultrapassar dificuldades prprias das limitaes de processamento e memria destes dispositivos. Configuraes como as CLDC (Connected Limited Device Configuration) e MIDP (Mobile Information Device Profile) so duas das mais utilizadas. Dentro das plataformas para microambientes, JAVA disponibiliza tambm uma plataforma para programao de cartes magnticos inteligentes, designada por Java Card Platform (JCP). Na Figura 2.2 apresenta-se de forma pormenorizada a arquitectura em camadas da plataforma actual, a J2SE5 Tiger, distinguindo-se JDK, JRE e JVM.
Linguagem JAVA5
java Security javac Intel javadoc RMI apt IDL jar Deploy javap JPDA outros JVMTI

Monitor Trouble

Deployment AWT Acessibility Drag&Drop IDL Beans Network Lang&Util Prefs JDBC Intel Sup. Overr. Mech Collections

Java Web Start SWING Input Image I/O JNDI New I/O Security Concurr. JMX Serialize JAR Reg. Exp.

Java Plug-in Java 2D Print Serv. RMI JNI Extension Logging Version. Sound RMI-IIOP Math XML JAXP Mangemt Zip

J R E

J D K

Ref Objects Reflection

JVM

Java HotSpot Client Compiler

Java HotSpot Server Compiler

plataformas Solaris, Windows, Linux, Macintosh, ...


Figura 2.2 Arquitectura da plataforma J2SE5

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM

Assim, e como se pode verificar pela figura, o JDK uma extenso ao JRE. Quem apenas pretender executar aplicaes JAVA, apenas ter que instalar o JRE com a JVM certa para o seu sistema operativo. Quem pretender, como ns, desenvolver aplicaes JAVA, tem que instalar sobre o JRE o sistema de desenvolvimento JDK. O JDK5 fornece entre outros, os servios necessrios compilao do cdigo fonte (javac), execuo de programas (java), produo de documentao (javadoc), ao debugging (JPDA) e produo de arquivos (jar). A linguagem JAVA pode ser usada para desenvolver dois tipos de programas: aplicaes; applets e servlets. As aplicaes JAVA so programas que, aps serem compilados, apenas requerem uma JVM para serem interpretados e executados, podendo esta existir ao nvel do sistema operativo ou ligada prpria aplicao, pelo que tais programas executam por si prprios, ou seja, so o que, em geral, se designa por aplicaes stand alone. Applets so pores de cdigo JAVA no executveis por si prprias, dado que so dependentes da existncia de um browser que incorpore e execute a JVM (cf. Netscape ou Explorer) para que estas possam ser executadas. Como as applets so escritas muitas das vezes com o objectivo de poderem ser descarregadas atravs da rede, so em geral de dimenso muito mais pequena do que as aplicaes, consistindo, por exemplo, em pequenas forms para entrada de dados e outros componentes de interfaces com o utilizador. Servlets so pores de cdigo no executvel por si prprio, executado em contextos prprios pelos servidores (por exemplo, um servidor de http), de forma a responderem atravs de pginas HTML a certos pedidos dos clientes, realizados atravs de eventos e segundo protocolos bem estabelecidos. Ao contrrio das applets, que tm mais interface com o utilizador do que contedo, os servlets so praticamente apenas contedos que devem ser enviados dos servidores s aplicaes cliente. Exemplos concretos da aplicao de applets, servlets e de todas as tecnologias de bases de dados, networking, encriptao, gesto de verses, etc., que referimos antes, so os modernos websites comerciais baseados em transaces electrnicas. No entanto, as mesmas tecnologias so empregues, e ainda mais algumas, quando os clientes passam de PC para telemveis ou PDA, mantendo-se os servidores os mesmos. A Figura 2.3 mostra a evoluo das vrias plataformas e da linguagem JAVA desde a sua verso original JAVA1.0 (1995) at JAVA5 (2004).
JAVA1.0 8 package s 212 classe s JAVA1.1 23 packs 504 class JAVA1.2 59 packs 1520 class JAVA1.3 77 packs 1595 class JAVA1.4 103 packs 2175 class JAVA5 131 packages 2656 classe s

Ne w Ev ents Inne r Class Se rialization Jar File s International Re fle ction JDBC

JFC/SWING Drag&Drop Jav a2D CORBA Collections

JNDI NIO Jav a Sound Logging Timer Reg. Expr.

Gene rics

jav ax.activity, jav ax.manage mt jav a.nio, jav ax.net, javax.print, jav ax.security, jav ax.image io, org.w3c jav ax.naming, javax.sound, javax.transaction jav ax.accessibility, javax.swing, org.omg

java.math, java.rmi, java.se curity, java.sql, java.te xt, java.beans java.applet, java.awt, jav a.io, java.lang, jav a.ne t, jav a.util

Figura 2.3 Evoluo da linguagem JAVA

Tecnologia Java5

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

Como se pode verificar, os sucessivos desenvolvimentos, em geral bibliotecas de classes que montam um determinado servio a aplicaes, cobrem as mais diversas reas. Todo este manancial tecnolgico colocado ao dispor de quem desenvolve aplicaes, em especial aplicaes distribudas, transaccionais, on-line, que tm que ser seguras, com fcil extensibilidade dadas as mudanas permanentes, de fcil manuteno, etc., tornam a tecnologia JAVA, a linguagem JAVA, que o elemento aglutinador, e o paradigma da programao por objectos, elementos fundamentais na Informtica actual.

2.4 A linguagem JAVA: caractersticas


Esta seco 2.4 completamente dedicada apresentao do nvel mais bsico da linguagem, em termos de conceitos e de construes necessrios para se escreverem os primeiros programas em JAVA. No sero ainda programas de PPO, ou seja, usando classes e objectos, porque o nvel dos objectos criado a partir deste nvel mais bsico, onde no existem objectos mas apenas valores simples associados aos usuais tipos primitivos das linguagens de programao. Este o designado nvel primitivo (ou dos valores) mas no qual j poderemos programar como programaramos em Pascal ou em C.

2.4.1 Introduo
A linguagem JAVA uma linguagem de programao orientada aos objectos que, ao contrrio de Smalltalk, e tal como muitas das actuais linguagens de PPO, no uma linguagem por objectos cem por cento pura, dado que nem todos os seus componentes so objectos. Torna-se por isso importante desde j deixar claro que, na linguagem JAVA, existe um nvel em que, tal como em qualquer linguagem no OO, lidamos com entidades que designamos por constantes e variveis, que tm a si associados valores (dados). Estas entidades dos programas tm um identificador que nos permite design-las nas nossas instrues, e atravs desse identificador que temos acesso aos valores que elas representam e guardam. Estas constantes e variveis, atravs de declaraes convencionais, so associadas a tipos de dados, que servem para definir exactamente o conjunto de valores que tais variveis e constantes podem guardar e representar. JAVA possui pois um nvel, existente como nvel de suporte ao nvel fundamental que o nvel das construes OO, em que a programao se faz declarando variveis e constantes como sendo de um dado tipo, manipulando estes valores usando operadores predefinidos para tais tipos e, at, recorrendo a estruturas de controlo comuns nas linguagens de tipo imperativo, como sejam as estruturas de controlo condicionais e repetitivas, que tm at formas sintcticas muito semelhantes, ou at iguais, s existentes na linguagem C. Este o nvel em JAVA designado por nvel dos tipos primitivos (tais como inteiros, reais, carcter, boleano, etc.) e respectivos operadores, ou, se quisermos, o nvel dos no-objectos. Fundamentalmente, a este nvel trabalhamos directamente com valores. As variveis contm valores e sobre tais valores que realizamos operaes e programamos algum controlo de execuo. Como veremos mais adiante, este o nvel de suporte programao por objectos em JAVA. A Figura 2.4 procura caracterizar melhor esta relao entre o nvel dos tipos primitivos e o nvel dos objectos e da programao OO.
Nvel dos Tipos Referenciados Objectos e Arrays

Nvel dos Tipos Primitivos

Figura 2.4 Os nveis das entidades de JAVA

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM

Tal como as setas da figura induzem, existir em JAVA a possibilidade de, em certos casos, converter valores em objectos e certos objectos em valores, ou seja, em sntese, a camada dos tipos primitivos e respectivos valores completamente convertvel na camada de objectos. No entanto, o inverso no , naturalmente, sempre possvel, nem sequer aceitvel ou recomendvel, pois implicaria uma pura redundncia. O estudo da linguagem JAVA prosseguir assim sob duas perspectivas: em primeiro lugar, sero apresentadas as construes relacionadas com o nvel dos tipos primitivos, construes em tudo semelhantes s usadas em linguagens do tipo imperativo. Com as entidades deste nvel, j ser possvel codificar os primeiros programas em JAVA, mas no sero certamente programas com objectos; no entanto, as entidades deste nvel so toda a base da criao das entidades ao nvel dos objectos; em seguida, sero introduzidos, um a um, os pilares fundamentais do paradigma da PPO, e, para cada um destes, as correspondentes construes existentes em JAVA.

2.4.2 Nvel dos tipos primitivos


JAVA tem oito tipos primitivos que correspondem aos valores que podemos usar e transformar quando programamos ao nvel mais bsico da linguagem. So estes: int, short, long, double, float e byte (para representao de valores numricos inteiros ou reais), char (para valores que so caracteres) e boolean (para os dois valores lgicos). Os tipos primitivos de JAVA, a sua gama de valores, os respectivos valores por omisso e a sua dimenso em bits, so sintetizados na Tabela 2.1. Assim, quando uma varivel for declarada como sendo de um destes tipos, ser-lhe- de imediato atribudo o valor por omisso definido para esse tipo, poder apenas assumir valores dentro da gama de valores indicada e ocupar um nmero fixo de bits igualmente indicado.
Tipo Valores false, true caract. unicode inteiro c/ sinal inteiro c/ sinal inteiro c/ sinal inteiro c/ sinal IEEE 754 FP IEEE 754 FP Omisso false \u0000 0 0 0 0L 0.0F 0.0 Bits 1 16 8 16 32 64 32 64 Gama de valores false a true \u0000 a \uFFFF -128 a +127 -32768 a +32767 -2147483648 a 2147483647 -1E+20 a 1E+20 3.4E+38 a 1.4E-45 (7 d) 1.8E+308 a 5E-324 (15d)

boolean char byte short int long float double

Tabela 2.1 Tipos primitivos de Java

A primeira caracterstica importante destes tipos primitivos de JAVA o facto de as suas representaes em termos de dimenso (nmero de bits) no serem dependentes do compilador, sendo portanto fixas e iguais em qualquer ambiente de execuo. O tipo char comporta caracteres em cdigo Unicode (UCS Universal Character Set e UTF Unicode Transformation Format), que um standard de 16 bits que integra em si o cdigo ASCII usual. O prprio cdigo fonte todo transcrito para caracteres Unicode, pelo que caracteres tais como , , , , etc. so vlidos, e no apenas o conjunto usual de caracteres ASCII. Cada carcter tem um cdigo decimal (cdigo ASCII ou fora deste) cujo valor em hexadecimal o seu cdigo Unicode. Por exemplo, a letra A que tem por cdigo ASCII o valor 65, representa-se em Unicode por \u0041. O prefixo \u, quando usado na representao de caracteres, significa exactamente o cdigo Unicode de um determinado carcter. Os caracteres podem ser representados explicitamente usando o prefixo \ (escape characters), sendo os mais usados \t de tab e \n de nova linha. Os tipos numricos so os usuais inteiros e reais. Os nmeros reais so representados por float ou double, sendo o tipo float pouco utilizado devido sua relativa falta de preciso, pois apenas trabalha com sete dgitos decimais. As constantes reais so, por omisso, do tipo double (ex.: 321.423). Para que sejam float, devero ser terminadas com o sufixo F ou f (ex.: 56.2334F). As constantes de tipo long devem ser
Tecnologia Java5
7

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

terminadas pelo sufixo L ou l (ex.: 3400562L) e os valores do tipo byte podem ser escritos em hexadecimal se iniciados pelo prefixo 0x (ex.: 0xFAFE) e em octal se iniciados pelo prefixo 0 (ex.: 0777). Os tipos float e double permitem representar valores em vrgula fixa ou flutuante. Valores em vrgula flutuante so expressos sob a forma de um nmero seguido da letra E ou e (representativa da base 10) e do valor do expoente inteiro. So exemplos de valores famosos representados em vrgula flutuante: 9.109E-28, 2.9979E+10, 8.5e25 e 5.52e0. O tipo boolean tem apenas dois valores, true e false, sendo false < true.

2.4.3 Declaraes de variveis e inicializao


Variveis so identificadores de dados, sendo os seus nomes importantes na codificao e, como se sabe, devem ser nomes mnemnicos, ou seja, informativos dos dados que representam. Antes disso, porm, tm que ser sintacticamente vlidos. Em JAVA, um identificador de uma varivel no poder ser nenhuma das palavras reservadas da linguagem, devendo iniciar-se por uma letra, carcter $ ou _, seguida de uma sequncia de letras, dgitos ou caracteres $ ou _. O compilador distingue entre maisculas e minsculas. Por conveno lingustica, os identificadores de variveis de JAVA so sempre iniciados por letras minsculas. JAVA o que se designa por uma linguagem fortemente tipada, ou seja, o compilador faz uma verificao rigorosa dos tipos de dados utilizados nas expresses, tendo por base os tipos declarados para as variveis do programa, nos vrios contextos em que estas so declaradas e usadas. Assim, qualquer varivel, antes de poder ser utilizada, deve ser associada a um tipo de dados atravs de uma declarao, e inicializada com um valor atravs de uma atribuio (=). Uma varivel declarada e no inicializada tem, em geral, um valor que indefinido, gerando a sua utilizao um erro de compilao. Vejamos alguns exemplos de declaraes de variveis, algumas com inicializao:
int total; double media = 0.0; // declarao e atribuio de 0.0 boolean encontrado = false; char letra = 'z';

Associadas a um tipo de dados, poderemos ter uma sequncia de declaraes de variveis separadas por vrgulas, eventualmente com atribuies dos valores de expresses para a inicializao de algumas delas, cf. a forma geral e os exemplos seguintes: id_tipo id_varivel [ = valor] [, id_varivel [ = valor ] ] ;
int dim = 20, lado, delta = char um = '1'; char c = 'A'; char newline = '\n'; char letraA = '\u0041'; // char tab = '\u0009'; // byte b1 = 0x49; // long dimetro = 34999L; double raio = -1.7E+5; double j = .000000123; int altura = dim + delta; 30;

formato UNICODE cf. \u (decimal 65) formato UNICODE hexadecimal, cf. 0x como prefixo // parte inteira igual a 0 // inicializao por expresso

As variveis de tipos primitivos que forem declaradas no contexto da definio da estrutura interna de uma dada classe, variveis que mais tarde designaremos por variveis de instncia, caso no sejam explicitamente inicializadas atravs de cdigo do programa, s-lo-o pelo compilador, que lhes atribuir valores iniciais por omisso em funo do seu tipo (ver Tabela 2.1).

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM

Finalmente, no aconselhvel que na mesma linha de cdigo se faam mltiplas declaraes de variveis, pois tal torna o cdigo menos claro e impede que comentrios individuais de clarificao de cada uma delas sejam realizados.

2.4.4 Declaraes de constantes


Como veremos posteriormente, as declaraes de constantes so semelhantes s declaraes de variveis, mas requerem a incluso de um atributo particular que especifica que tais inicializaes so imutveis (usando o atributo final). As constantes JAVA so tambm, por razes de estilo e de legibilidade, identificadas usando apenas letras maisculas, em certos casos usando-se tambm o smbolo _. As seguintes declaraes:
final double PI = 3.14159273269; final double R_CLAP = 8.314E+7; final double GCGS = 6.670E-8;

definem, num dado contexto, constantes identificadas, cujos valores no podero ser alterados por nenhuma instruo.

2.4.5 Converso entre tipos: casting


Os tipos numricos so compatveis entre si dentro de algumas regras simples. Numa dada operao na qual entrem dois operandos de tipos numricos distintos, o operando com menor preciso convertido no tipo do operando de maior preciso, sendo este o tipo do resultado. A escala crescente de precises , como sabemos, a seguinte:
byte short int long float double

A um tipo numrico mais direita, logo de maior preciso, igualmente possvel atribuir um valor correspondente a um tipo mais esquerda (de menor preciso). So pois vlidas as seguintes expresses:
int dim = 100; float area = 100*100; double vol = area*100; double x = 3456F;

Por outro lado, por vezes, mesmo admitindo a perda de preciso, pretende-se realizar converses em sentido contrrio. Existe um operador que pode ser usado de forma unria para converter valores de dado tipo sua direita para valores de dado tipo indicado sua esquerda, designado por operador de casting, por exemplo (id_tipo) operando. Por exemplo, para todos aceitvel que um valor do tipo float possa ser convertido num int. Assim, usando o mecanismo de casting ou de converso de tipos e as declaraes apropriadas, escreveramos:
float lado = 123.45F; int li = (int) lado; // li = 123

tambm aceitvel que um inteiro (short ou int) possa ser associado ao tipo char e que a aritmtica de inteiros possa ser usada como forma de tratarmos os caracteres, usando os seus cdigos ASCII decimais. So, portanto, vlidas expresses como as que se apresentam a seguir, nas quais caracteres so convertidos em inteiros e vice-versa:
char c1, c2, c3 = '6', c4, c5, c6; int cx = 62, cy = 12; // c1 = (char) (cx + cy) ; c2 = (char) ((int) c3 + 43); c3 = (char) ((int) c2 + 21); c4 = c2;
Tecnologia Java5
9

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

c5 = (char) 53; c6 = (char) ((int) c5 - 20);

O tipo boolean no compatvel com qualquer um dos outros. A compatibilidade entre tipos numricos, em particular o casting, um assunto complexo a ser abordado com cuidado sempre que clculos matemticos de grande preciso sejam o objectivo principal dos programas desenvolvidos.

2.4.6 Comentrios em JAVA


Os comentrios so elementos muito importantes, quer como documentao interna quer, se possvel, na produo de documentao externa dos programas. Os comentrios so em geral usados na clarificao das variveis de um programa, das transformaes que cada funo realiza, seus parmetros de entrada e resultado, explicao de pores de cdigo, etc. Em JAVA, existe a possibilidade de utilizar trs tipos de comentrios: Comentrio monolinha: todo o texto colocado desde // at ao fim da linha; Comentrio multilinha: todo o texto entre /* e */; Comentrio de documentao: todo o texto entre /** e */. Os comentrios de documentao so textos de diversos tipos introduzidos pelo programador, que so posteriormente extrados por ferramentas apropriadas de JAVA (como javadoc), e com os quais produzida de forma automtica a maior parte da documentao fundamental dos projectos.

2.4.7 Conjunto de operadores


Na Tabela 2.2, apresentam-se todos os operadores disponveis em JAVA para os tipos primitivos e no s, indicando-se a sua precedncia, a sua sintaxe, o(s) tipo(s) do(s) respectivo(s) operando(s), o sentido da sua associatividade ( direita ou esquerda) e o seu significado.
Precedncia 15 Operador Tipos dos Operandos objecto, membro Associao E E E E D D D D D D E E E E E E E E E E E E E E Operao acesso a membro acesso a elemento invocao de mtodo ps increm/decrem. pr increm/decrem. sinal; unrio complemento de bits negao criao de objectos converso (casting) multipl, diviso quociente int, mdulo soma e subtraco concatenao deslocam. esq. de bits deslocam. dir. de bits deslocam. dir. com 0 comparao comparao teste de tipo igual valor valor diferente mesmo objecto objectos diferentes

. [] (args) ++, --

array, int
mtodo, lista args varivel varivel nmero inteiro boleano classe, lista args tipo, qualquer nmero, nmero inteiro, inteiro nmero, nmero string, qualquer inteiro, inteiro inteiro, inteiro inteiro, inteiro nmeros aritmticos referncia, tipo primitivos primitivos objectos objectos

14

++, -+, ~ !

13 12 11 10

new (tipo) *, / /,% +, + << >> >>>

<, <= >, >= instanceof

== != == !=

10

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM


7 6 5 4 3 2 1

& & ^ ^ | | && || ? : = *= += <<= >>>= ^= /= -= >>= &= |= %=

inteiros boleanos inteiros boleanos inteiros boleanos boleano boleano bol, qualq, qualq varivel, qualquer varivel, qualquer varivel, qualquer varivel, qualquer varivel, qualquer varivel, qualquer

E E E E E E E E D D D D D D D

E de bits E lgico OUEXC de bits OUEXC lgico OU de bits OU lgico E condicional OU condicional condicional ternrio atribuio atribuio aps oper. atribuio aps oper. atribuio aps oper. atribuio aps oper. atribuio aps oper.

Tabela 2.2 Operadores de JAVA

Os operadores aritmticos so os usuais operadores + - * / para soma, subtraco, multiplicao e diviso de nmeros, respectivamente. A diviso (/) de inteiros d como resultado um nmero inteiro. O operador % (mdulo) apenas se aplica a inteiros e d como resultado o resto da diviso inteira dos operandos (ex.: 15/6 = 2 e 15%6 = 3). O operador de atribuio =, na sua forma geral varivel = expresso, corresponde operao que calcula o valor da expresso do lado direito do sinal de igual e, caso esta termine com sucesso, atribui esse valor varivel do lado esquerdo, sendo perdido o valor anterior nesta contido antes de tal atribuio. Uma operao de atribuio apenas poder ser realizada se os tipos da varivel e do valor da expresso forem compatveis:
x = 2 * y + 10; z = 4.75 * (w + 5.35); a = a + 7; // valor de a incrementado de 7 unidades

As expresses de atribuio que tm a mesma varivel dos dois lados do sinal de =, porque uma dada operao foi realizada com o seu valor anterior ( direita) para calcular o novo valor da varivel ( esquerda), so muito comuns. Por exemplo, incrementar um contador, como em conta = conta + 1, multiplicar uma varivel por um valor dado, como em sal = sal * taxa, so usuais. Por tal motivo, operadores particulares existem visando simplificar tais expresses e/ou instrues. Surgem assim operadores que combinam o operador de atribuio com os operadores aritmticos (e outros), tais como += -= *= /= %=, bem como os operadores unrios de incremento e decremento do valor de uma varivel como varivel++ e varivel-- e ++varivel e --varivel, com os significados seguintes:
x += 12; x %= 5; x *= -7; x = x + 12; x = x % 5; x = x * -7;

Os incrementadores e decrementadores podem realizar o incremento ou o decremento antes ou aps a utilizao do valor da varivel, pelo que a sua verdadeira semntica depende da forma como forem utilizados. Num contexto simples e normal, x++ ser sempre equivalente a x = x + 1, tal como ++x (menos usado). Os operadores que relacionam quantidades (relacionais) so o operador de igualdade == (no confundir com o operador de atribuio =), desigualdade ou diferena !=, e os usuais > >= < <=. Quando duas quantidades so comparadas, o resultado dessa expresso ser sempre um valor boleano, ou seja, true ou false.
x * 3 >= y 5 nota > MAX_NOTA valor != 20 encontrado == true
Tecnologia Java5
11

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

Os operadores relacionais aparecem muitas vezes em expresses mais complexas ligados aos operadores lgicos que funcionam sobre dois operandos de tipo booleano. Em JAVA temos o operador de conjuno (Elgico) &&, o operador de disjuno (OU-lgico) || e o operador de negao !. Em conjunto com os relacionais, j nos permitem escrever testes mais complexos (mesmo que sem muito sentido), como:
(x + 2 > y - 5) && (y + 4) < (z 3) !existe && conta <= MAX_ELEM area > 2*PI*raio || permetro <= 345.7 (lado/2.76)

Os operadores >> e >>> e <<, bem como os operadores &, |, ^ e ~ designam-se por bitwise, pois trabalham com os tipos short e int a nvel dos respectivos bits. Os operadores >> e << realizam shifts de dado nmero de bits. Os outros correspondem s operaes de E, OU, XOR e NOT de binrios. Apenas um pequeno exemplo, j que ningum vai dividir, multiplicar ou fazer aritmtica desta forma:
int z = 100; int r = z<<1; int s = z>>2; // deslocar 1 bit para a esq. <=> z*2 // deslocar 2 bits para a dir. <=> z/4

Um operador muito simples, e que por vezes muito til, o operador ternrio condicional ? : que tem a forma geral exp1 ? exp2 : exp3. Esta expresso tem um valor final que ser sempre ou o valor de exp2 ou o valor de exp3, tal dependendo de exp1 ao ser avaliada ter o valor true ou false. So teis, por exemplo, em atribuies condicionais, nas quais o valor a atribuir depende do valor lgico da condio expressa:
raio = r <= 0 ? 1.0 : r; maior = (x > y) ? x : y; // parntesis ajudam na leitura

Para alm dos operadores aritmticos, JAVA oferece um grande conjunto de funes matemticas de elevada preciso que podem ser encontradas na biblioteca (classe) designada por java.lang.Math. A classe poder ser importada para um programa usando uma clusula de importao import java.lang.Math.*;, sendo ento possvel invocar as suas funes, que, em geral, trabalham com valores de tipo double. Vejamos alguns exemplos da sua utilizao em expresses matemticas:
double x = Math.sqrt(y); // raiz quadrada double z = Math.pow(x, 2.0); // potncia double a = Math.sin(alfa); // seno de alfa double num = Math.random(); // aleatrio entre 0.0 e 1.0 int aleat = 1 + (int) (Math.random() * 10); // [ 1.. 10] double at = Math.atan(x); // arco tangente x

2.4.8 Instrues, estruturas de controlo e directivas


O controlo mais bsico da execuo dos programas em JAVA, como no podia deixar de ser, expresso sob a forma de instrues e estruturas de controlo tradicionais. Em conjunto com algumas directivas especiais de criao de contexto, poderemos definir toda a estrutura de execuo dos programas. As principais estruturas de controlo e directivas so as seguintes: Condicionais: if/else, switch; Repetitivas: for, while, do/while, for(each) para arrays De sincronizao: synchronized; De tratamento de erros: try/catch/finally; Directivas de contexto: import, import static, package. Dada a utilizao massiva que mais adiante faremos de cada uma destas construes, deixaremos aqui registadas apenas, e de forma simples, a sintaxe e semntica bsica de cada uma custa de pequenos exemplos. Note-se que, dado no termos ainda definido rigorosamente o que so objectos, mas apenas os tipos primitivos, os exemplos de utilizao das estruturas de controlo de momento compreensveis, tero, por tal motivo, que ser apresentados tendo por base apenas a manipulao de valores associados a variveis de tipos primitivos. Porm, estas mesmas estruturas de controlo, tal como aqui apresentadas, sero
12

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM

posteriormente componentes fundamentais na definio do comportamento dos objectos que pretendermos definir, designadamente atravs do cdigo dos respectivos mtodos, que so as entidades internamente responsveis pelo adequado tratamento das mensagens recebidas.

if/else
A forma sintctica mais simples assume a seguinte forma:
if (condio) instruo; // se condio ento . . .

Se a condio (expresso boleana entre parntesis) for verdadeira a instruo ser executada, caso contrrio, no:
if (contador < MAX) valor = valor + delta; if (x + 5 >= j + h) h = x + 20;

Porm, quando a condio verdadeira, pretendemos muitas das vezes realizar mais do que apenas uma instruo. Em tais casos, ou seja, sempre que tivermos que realizar mais de uma instruo, devemos usar um bloco. Um bloco de instrues uma sequncia de instrues separadas por ; e delimitadas por chavetas { } onde se pode, inclusivamente, declarar variveis locais ao bloco. Temos ento a seguinte forma sintctica:
if (condio) { instruo1; ; instruon; }

e alguns exemplos desta forma, com indentaes diferentes para as chavetas:


if (!encontrado) { x = x + 10; encontrado = (x > 20000); } if (conta < 1000) { x ++; y++; z = x*2; w = y*2; }

Na sua forma mais geral, a estrutura condicional uma alternativa, ou seja, em funo do valor da condio, ser executada uma ou outra instruo, conforme a seguinte forma:
if (condio) instruo1; else instruo2;

Um exemplo desta ltima forma de expresso seria:


if (x >= 12) y = x * x; else y = x + 100;

ou de forma mais simples


if (x>= 12) y = x * x; else y = x + 100;

Se se tratar de uma alternativa entre blocos de instrues, a sua forma geral ser
if (condio) { bloco1 } else { bloco2 }

e so exemplos desta ltima forma, usando vrios estilos para indentao das chavetas:
if (tipo == X) { conta = conta + 1; x = x + 1; } else { naoLivro = naoLivro + 1; consulta = consulta + 1; }

Tecnologia Java5

13

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

if (conta < MAX) { valor = valor*150; multa = MAX/2; } else { valor = valor*500; multa = MAX/3; }

ou ainda, caso os blocos ocupem apenas uma linha,


if (tipo == L) { livros = livros + 1; req = req + 1; } else { naoLivro += 1; consulta += 1; }

Um caso particular de utilizao das estruturas condicionais if/else por vezes um pouco complexo, quando aparecem if/else dentro de outros if/else. Nestes casos, e qualquer que seja a indentao, a regra que um else se liga sempre ao if mais prximo.

switch
A instruo condicional switch a estrutura de controlo condicional que possibilita a execuo de uma dentre vrias pores alternativas de cdigo, em funo do valor tomado por uma particular expresso ou varivel. Trata-se, portanto, de uma estrutura case, tendo a seguinte forma sintctica genrica:
switch (expresso) { case valor_1 : instrues ; break; case valor_n : instrues ; break; default : instrues ; }

Assim, em funo do valor concreto da expresso indicada que dever ser de um tipo simples, char, int, short, long ou byte e ainda dependendo dos diferentes valores particulares que se pretende distinguir, so executadas as instrues associadas a cada um de tais valores. A instruo break utilizada para se garantir que a execuo do cdigo da instruo switch termina a. Caso no seja colocada a instruo break, aps a execuo do conjunto de instrues correspondentes a um valor particular, as instrues associadas ao valor seguinte sero executadas tambm, e assim sucessivamente, at ao aparecimento de um break. Caso o valor da expresso no seja igual a nenhuma das constantes associadas a cada caso, ser executado o conjunto de instrues associado palavra chave default, caso exista, ou nenhuma, no caso contrrio. Os exemplos seguintes procuram ilustrar a utilizao de casos por omisso e diferentes formas de especificar a execuo de sequncias de instrues:
switch (letra) { case 'a' : case 'A' : { i = case 'b' : case 'B' : x-- ; default: ct2++; }

(int) letra; ct1++ ; break; } // no executa nada break; // para todos os outros valores

// bloco

O switch seguinte serve para determinar o nmero de dias de um determinado ms, sendo o valor da varivel mes que determina a deciso:
switch (mes) { case 2: dias = 28; break; case 4: case 6: case 9: case 11 : dias = 30; break; default: dias = 31; }
14

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM

for
A estrutura repetitiva for assume uma forma sintctica que , de certo modo, complexa, dado o conjunto de expresses que envolve, e as variantes possveis para cada uma delas. A estrutura genrica assume a forma seguinte:
for (inicializao; condio_de_sada; iterao) instrues

O grupo designado inicializao contm em geral a declarao e inicializao da varivel que ir servir como varivel de controlo do ciclo. A expresso designada como condio_de_sada tem exactamente a misso de definir uma expresso boleana que ser avaliada em cada iterao, e que determinar o fim das iteraes logo que o seu valor seja false. Note-se que, caso esta expresso tenha o valor false logo no incio, ou seja, antes da primeira execuo, nada ser executado. O grupo designado por iterao contm as declaraes que indicam de que forma os valores de certas variveis evoluem de uma iterao para a outra, em particular da varivel de controlo do ciclo (uma ou mais). A varivel de controlo do ciclo pode ser declarada dentro da estrutura for e apenas existe dentro desta, no devendo ser modificada no bloco de instrues do ciclo. Vejamos alguns exemplos.
// soma e produto dos 100 primeiros inteiros int soma = 0; int produto = 1; for (int i = 1; i <= 100; i++) { soma = soma + i; produto = produto * i; } // soma dos primeiros mpares e dos primeiros pares at MAXI; // (admite-se que MAXI foi lido anteriormente) int somai = 0, somap = 0; for (i = 1; i <= MAXI ; i++) { if (i%2 == 0) somap = somap + i; else somai = somai + i; }

while
A estrutura repetitiva while tem a seguinte forma sintctica:
while (condio_de_iterao) { corpo ; }

sendo a sua semntica muito simples: enquanto a condio_de_iterao for verdadeira o corpo do ciclo executado. A condio_de_iterao pode ser ou no verdadeira no incio da iterao. Se for falsa, nada ser executado e o programa continuar na instruo seguinte. Se for verdadeira, a primeira iterao realizada, isto , todo o corpo definido executado, sendo em seguida de novo avaliada a condio_de_iterao. Naturalmente que se nenhuma das variveis usadas para exprimir esta condio for modificada ao ser executado o corpo do ciclo, ento teremos uma situao de ciclo infinito. Note-se que sendo a condio_de_iterao testada antes da primeira execuo do corpo, pode acontecer que, sendo a primeira imediatamente falsa, este no seja executado. Assim, a principal caracterstica determinante na utilizao de uma estrutura repetitiva do tipo while que a mesma conduz a 0 ou mais iteraes do corpo de instrues a iterar. O nmero de iteraes que sero efectivamente realizadas no pode nestes casos ser expresso apenas em funo dos sucessivos valores tomados por uma varivel de controlo. Quando o nmero de iteraes pode de facto ser expresso de tal forma, a estrutura aconselhada uma estrutura repetitiva do tipo for. , no entanto, curioso verificar que os programadores, por erro conceptual ou simples hbito que no se aconselha que seja reproduzido, implementam estruturas while atravs de
Tecnologia Java5
15

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

estruturas for, quer usando break, quer atravs de condies adicionais de sada na expresso de condio_de_sada do ciclo for. Aconselha-se vivamente que, sempre que pretendermos expressar uma iterao que pode ocorrer 0 ou mais vezes, se expresse tal facto usando uma estrutura while. Sempre que pretendermos expressar uma iterao que ocorre tantas vezes quantos os valores que uma dada varivel deve tomar para que, qualquer que seja o incremento, partindo de um dado valor atinja um outro, ento, tal deve ser codificado usando uma estrutura for. Apesar de tudo, e tendo em ateno a sua semntica, poder-se- dizer que as duas construes seguintes so equivalentes:
for (expresso1 ; expresso2 ; expresso3) instrues; // while equivalente ao for anterior expresso1; while (expresso2) { instrues; expresso3; }

Vejamos agora alguns exemplos de aplicao da estrutura repetitiva while:


// diviso por subtraces sucessivas double x = 2137.56 double y = 2.5645; int conta = 0; // while (x >= 0) { x -= s; conta++; } // Tentativas para acertar num nmero de 1 a 9 // Math biblioteca de Java e random() uma funo; boolean found = false; int x = 1; int chave = 1 + (int) (Math.random() *9); while (!found) { if ( x == chave ) found = true; else x++; }

do/while
A estrutura repetitiva do-while deve ser usada sempre que tivermos um bloco de instrues que vai ser executado uma ou mais vezes, ou seja, contrariamente ao que se passa com a estrutura repetitiva while, tal cdigo ser sempre executado pelo menos uma vez. No final desta primeira execuo, e de todas as outras, uma condio de continuao de iterao testada, e se o seu valor for false a iterao termina. A forma sintctica desta estrutura repetitiva :
do { corpo; } while(condio_de_iterao);

O cdigo seguinte exemplifica a sua utilizao:


// realiza o somatrio e o produtrio dos // nmeros inteiros desde 0 a MAX_VEZES int conta = 0; int soma = 0; int prod = 1; do { soma = soma + conta; prod = prod * conta; conta++; }
16

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM while(conta < MAX_VEZES);

// Resultados System.out.println("Somatrio = " + soma); System.out.println("Produtrio = " + prod);

2.4.9 Strings
As strings so sequncias de caracteres, representveis textualmente delimitadas por , como por exemplo, eu sou uma string!. No existe um tipo base string em JAVA, antes uma classe designada String, cujo nome funciona como tipo. Assim, variveis que vo conter sequncias de caracteres devem ser declaradas como sendo do tipo String, e at imediatamente inicializadas como quaisquer outras de tipos primitivos:
String titulo = ""; // string vazia ou nula String lp = "JAVA5";

Podemos realizar vrias operaes com as variveis de tipo String, sendo uma das mais comuns a operao oferecida pelo operador + que o operador de concatenao (juno) de strings:
String nome = "Ze"; String apelido = "Boavida"; String completo = nome + " " + apelido; // "Ze Boavida"

O operador de concatenao (+) um operador capaz de compatibilizar tipos primitivos com strings durante a concatenao, convertendo qualquer valor de tipo simples (mesmo os boleanos) para string e realizando a sua juno. So portanto vlidas as seguintes expresses:
int idade1 = 20; int idade2 = 22; String frase1 = "O Pedro tem " + idade1 + " anos"; String frase2 = "A Rita tem " + idade2 + " anos"; String decisao = idade2>idade1 ? "velha" : "nova"; String frase3 = "Rita mais " + decisao + " que Pedro.\n";

Muitas so as operaes que podem ser realizadas sobre strings. Porm, strings no so valores, so objectos, pelo que voltaremos a referir as strings depois de introduzirmos as noes relacionadas com os tipos referenciados aos quais as strings pertencem.

2.4.10 I/O simples


Precisamos agora de conhecer algumas instrues simples de escrita e leitura para podermos criar alguns pequenos programas que nos permitam experimentar este nvel de programao com tipos primitivos. As instrues bsicas de escrita (output) de JAVA so dirigidas ao dispositivo bsico de sada, o monitor, que a partir do programa visto como um ficheiro de caracteres do sistema designado por System.out. Assim, so mensagens bsicas todas as strings enviadas para tal ficheiro usando a instruo println(.), o que se escreve:
System.out.println("Bom dia e bom trabalho!\n\n\n"); System.out.println("Linguagem : " + lp); System.out.println(nome + ", eu queria " + apelido + "!"); System.out.println("Rita mais " + decisao + " que Pedro");

Se nos programas em que tivermos que realizar muitas operaes de sada escrevermos no seu incio a clusula de importao import static java.lang.System.out;, ento, em vez de se escrever System.out.println(.) bastar escrever-se out.println(.).

Sada formatada: printf()


Uma instruo printf(stringf, lista_valores) permitir a sada de uma lista de valores (sob a forma de variveis, constantes ou expresses), que sero formatados segundo as directivas dadas na string de formatao que o primeiro parmetro.
Tecnologia Java5
17

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

Esta string bastante complexa, pois em JAVA tem que especificar as converses, quer para tipos primitivos quer para objectos. A forma geral de formatao de valores de tipos primitivos a seguinte:
%[ndice_arg$] [flags] [dimenso][.decimais] converso

Comeando pelo fim, os caracteres de converso so os que indicam o tipo de valor resultado da converso do parmetro, sendo: c (carcter), b (boleano), o (octal), h (hexadecimal), d (inteiro), f (real, vrgula fixa), s (string), e (real, vrgula flutuante) e n (newline independente da plataforma). Por exemplo, usando apenas caracteres de converso, podemos automaticamente fazer a converso de um nmero inteiro na base 10 para a base 8 e para a base 16.
int x = 1261; out.printf("Inteiro %d = Octal %o = Hexa %h%n", x,x,x);

Note-se desde j a possibilidade de inserirmos caracteres na forma \n na string que define os formatos. Note-se tambm, atravs deste exemplo, o interesse de podermos, em dadas circunstncias, indicar qual o argumento a que nos estamos a referir na string de formatao (cf. [ndice_arg$]). No exemplo acima tivemos que repetir a varivel x trs vezes para preencher os trs conversores, mas basta dizer que cada um deles deve usar o primeiro e nico parmetro, como por exemplo:
out.printf("Inteiro %d = Octal %1$o = Hexa %1$h%n", x);

e, num caso mais geral, a ordem dos parmetros poder ser completamente reformulada na string de formatao, tal como no exemplo seguinte j com os elementos definidores das dimenses e de casas decimais.
float f1 = 123.45f; double d2 = 234.678; double d3 = 12.45E-10; out.printf("R1 %5.2f R2 %3$-17.16f Exp1 %2$8.4e%n",f1, d2, d3);

Finalmente, as flags podem permitir alinhar os resultados esquerda (-), obrigar a incluir sempre o sinal (+), colocar zeros no incio (0), colocar espaos no incio ( ) ou colocar parntesis (() se o nmero for negativo. Um outro mtodo, de nome format(stringf, lista_valores), pode ser usado da mesma forma que printf(). Uma classe especial de nome Formatter oferece inmeros mtodos auxiliares para formataes complexas.

2.4.11 Tipos Referenciados : objectos e arrays


Em JAVA, os tipos no-primitivos so associados a objectos e a arrays e designam-se por tipos referenciados, dado que os seus representados so tratados por referncia, ou seja, atravs de uma varivel que, contendo o seu endereo, permite o acesso ao seu valor efectivo. As variveis de tipos primitivos, como acabmos de ver, guardam valores e no endereos de valores. Assim, as variveis de tipos referenciados servem para conter os endereos dos objectos ou dos arrays de um dado tipo, definido numa declarao. Tal declarao indicar que tal varivel poder referenciar instncias de uma dada classe, ou que uma varivel referencia arrays com uma dada estrutura, dimenso e tipo de elementos. Falemos, para j, de instncias de classes. Por exemplo, a seguinte declarao:
Ponto ponto1;

indica que a varivel identificada por ponto1 do tipo Ponto, e que, portanto, poder referenciar instncias da classe Ponto. Classes so, portanto, tipos. Tal como para as variveis de tipo primitivo, o valor inicial da varivel ponto1, aps esta declarao, depende do contexto, dentro do programa JAVA, em que tal declarao foi realizada. No exemplo, e admitindo que se trata da declarao de uma varivel local, e no de uma varivel de instncia de uma dada
18

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM

classe, a varivel, aps a declarao, ter um valor indefinido, pelo que, caso haja a tentativa da sua utilizao sem que entretanto lhe tenha sido atribudo um valor, o compilador indicar um erro de compilao. Caso tal declarao tivesse sido produzida no mbito das definies das variveis de instncia de uma dada classe, tambm designadas por atributos ou campos, e aqui reside mais uma vez a excepo regra geral de no inicializao de JAVA, o seu valor inicial, dado ser esta uma varivel de um tipo referenciado, seria, por isso, automaticamente o valor null, valor de inicializao por omisso em JAVA para este tipo de variveis. Como associar agora varivel ponto1, do tipo referenciado Ponto, uma instncia de tal classe, ou seja, como inicializar de facto tal varivel? Ou ainda, como poderemos criar instncias da classe Ponto e referenci-las atravs de variveis declaradas como sendo referncias de instncias dessa classe? Como veremos posteriormente, quando definirmos uma dada classe de JAVA, poderemos definir um conjunto muito diversificado de mtodos que serviro para criar instncias dessa classe, e que, eventualmente, produzem inicializaes muito diferentes das variveis de instncia de tais objectos. Tais mtodos so, por tal motivo, designados em JAVA como construtores de instncias. Deixando a questo dos construtores para uma posterior maior elaborao, importante afirmar desde j que JAVA associa a cada classe criada de nome C um construtor por omisso de nome C( ). Quando usado numa dada declarao conjuntamente com a palavra reservada new, tal como devero ser usados todos os outros possveis construtores, este construtor particular (dado no ser explicitamente programado) cria um objecto dessa classe, atribuindo aos campos ou variveis de instncia desses objectos valores por omisso. Caso estes campos sejam de tipos simples, ser-lhes-o atribudos os valores por omisso que foram apresentados na tabela 2.1. Caso tais campos sejam de tipos referenciados, assumiro, por omisso, o valor genrico representado pela palavra reservada null, valor este no manipulvel dado indicar uma no referncia (ou seja, um apontador nulo). Assim, e segundo tais regras de JAVA, a declarao,
Ponto ponto1 = new Ponto();

admitindo, que as duas variveis de instncia que definem a estrutura de um ponto so do tipo simples int e se designam por x e y, produziria, neste caso, a seguinte associao entre referncia e objecto referenciado (Figura 2.5):
ponto1

x=0 y=0

Figura 2.5 Referncia e objecto

Note-se ainda que, sendo estes objectos referenciados atravs de variveis, haver que ter em ateno que atribuies entre estas variveis que referenciam objectos assumem uma semntica de apontadores, ou seja, o que atribudo ou manipulado so referncias (na terminologia de JAVA designam-se por handlers e no so directamente manipulveis). Assim, se escrevermos Ponto ponto2 = ponto1;, ponto2 passa a referenciar o mesmo objecto referenciado por ponto1, qualquer que este seja nesse momento (Figura 2.6). Esta partilha de objectos resultante de uma atribuio de referncias, uma operao que deve ser realizada com bastante cuidado, pois a partir do momento em que o objecto passa a estar referenciado pelas duas variveis, qualquer delas lhe tem acesso, e, atravs de qualquer uma delas, possvel modificar o objecto.

Tecnologia Java5

19

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

ponto1

x = -5 y=8

ponto2
Figura 2.6 Objecto partilhado por ponto1 e ponto2

Note-se ainda que o resultado do teste de igualdade ponto1 == ponto2 daria, neste caso, true, j que, no momento, ambas as variveis referenciam exactamente o mesmo objecto. Porm, se tivssemos a situao ilustrada na Figura 2.7:
ponto1 x = -5 y=8

ponto2

x = -5 y=8

Figura 2.7 Objectos diferentes mas de igual valor

o mesmo teste resultaria no valor false, j que os objectos referenciados, ainda que contendo os mesmos valores, so distintos em identidade.

Arrays
Os arrays so, em JAVA, entidades referenciadas mas no so objectos, dado que no so, ao invs de todos os objectos, criados a partir de uma classe. Porm, por serem manipulados por referncia, no so associados a tipos-valor, mas a tipos referenciados. Arrays so criados em JAVA dinamicamente, ou seja, em tempo de execuo, e o seu espao automaticamente reaproveitado quando deixam de estar referenciados. A criao dinmica de um array fazse usando igualmente new, indicando ainda o tipo dos seus componentes, e, opcionalmente, as suas diferentes dimenses so multidimensionais. Porm, os arrays so estticos, isto , so de dimenso fixa, no podendo aumentar de dimenso em tempo de execuo. A multidimensionalidade dos arrays implementada em JAVA como aninhamento, isto , arrays multidimensionais so, de facto, apenas arrays de arrays. Vejamos alguns exemplos de declaraes, com e sem inicializaes, chamando-se a aten-o para a forma de definio da capacidade do array: new tipoComp[dimenso].
int lista[]; // lista um array de inteiros; int[] lista; // declarao equivalente anterior int[] lista = {10, 12, 33, 23}; // declarao e inicializao int lista[] = new int[20]; // array de 20 inteiros byte[] pixels = new byte[600*800]; String[] texto = new String[200]; // array de 200 strings int[][] tabela = new int[30][20]; // 30 lin x 20 col inteiros int tabela[][] = new int[30][20];

A instruo new, para alm de criar o array com a dimenso indicada, inicializa todas as suas posies. Para os tipos primitivos inicializa-as com o seu valor por omisso, e para os tipos referenciados com o valor null. As duas ltimas declaraes definem o array tabela como sendo do tipo int[][]. Dinamicamente alocam um array de 30 elementos de linha, sendo cada um destes elementos do tipo int[20], ou seja, um array de

20

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM

20 inteiros. Alocam depois os 30 arrays de 20 inteiros, guardando a referncia para cada um destes no array de 30 posies. Este mecanismo de alocao permite que algumas das dimenses possam ser deixadas por especificar em tempo de declarao e compilao, desde que em sequncia. Por exemplo, poderamos escrever a seguinte declarao:
int[][] matriz = new int[30][];

Neste caso, seria alocado um array de 30 posies, tal como o anterior, mas com referncias de valor null, de momento, para cada um dos elementos a alocar nestas posies, sabendo-se, no entanto, que tais elementos devem ser do tipo int[], ou seja, cada elemento um array de inteiros de dimenso no especificada. Ao no obrigar especificao da segunda dimenso, JAVA flexibiliza e permite que os elementos do tipo int[] (array de inteiros) deste array possam ter dimenses distintas. Esta flexibilidade no implica para o programador qualquer tipo de perda de controlo, tal como ter que saber de facto qual a verdadeira dimenso de cada um dos arrays alocados, dado ser possvel em JAVA saber a dimenso efectiva de um array atravs da construo sintctica array.length, que d como resultado a sua capacidade (no o nmero de elementos). O ciclo foreach apresentado a seguir torna mesmo irrelevantes tais questes. Quanto s inicializaes, elas podem ser feitas na altura da declarao do array, usando a forma sintctica que se exemplifica a seguir:
int[] potencias2 = {2, 4, 8, 16, 32, 64, 128, 256, 512, 1024}; String[] moedas = { "Escudo", "Peseta", "Franco", "Coroa"}; // inicializador com aninhamento int[][] matriz = { {1,2}, {10, 20, 30}, {19, 2, 34, 21, 16} }; String[][] linhas = { {"O", "mi"}, {"e"}, {"o", "si", "#"};

Acesso aos elementos de um array


O acesso aos elementos de um array faz-se atravs de um ndice inteiro, que pode tomar valores desde 0 (a 1 posio do array) at length-1. A sintaxe para acesso a que existe praticamente em todas as linguagens de programao, ou seja, id[exp_indice]. Exemplos:
x = lista[2*3]; nome = nomes[i]; nota = notas[ano][discp]; nomes[i] = "Rui"; notas[2][12] = 19;

No caso dos arrays multidimensionais, o primeiro ndice corresponde linha, e o segundo corresponde coluna dentro da linha.

Ciclo for com arrays


A maior parte das operaes que temos que fazer com elementos de um array, sejam estes de tipos primitivos ou objectos, so operaes de duas classes: varrimentos e pesquisas. As operaes de pesquisa, porque possuem condies lgicas especiais para paragem, so realizadas usando while ou do-while. As de varrimento tm por objectivo percorrer todos os elementos do array e com cada um deles realizar certas operaes. Sendo os arrays indexados, os varrimentos fazem-se usando os ndices de 0 at length-1, valores contidos numa varivel de controlo que os vai tomando um a um, e que pode ser a varivel de controlo de um ciclo for, como em:

Tecnologia Java5

21

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

// contagem de pares e mpares num arrays de inteiros int par = 0, impar = 0; for(int i = 0; i < a.lenght; i++) if (a[i]%2 == 0) par++; else impar++;

Quando o array multidimensional, a estratgia fazer o aninhamento de vrios ciclos for, tantos quantas as dimenses a tratar. No exemplo, o ciclo mais exterior percorre as linhas e o interior as colunas. Para cada linha todas as suas colunas so acedidas.
// inteiros > MAX de um array de arrays de inteiros int maiores = 0; int MAX = -999999; for(int l = 0; l < nums.length; l++) { for(int c = 0; c < nums[l].length; c++) if (nums[l][c] > MAX) maiores++; }

for(each) com arrays


JAVA5 introduziu um ciclo for particular que funciona para coleces de objectos. Os arrays de JAVA permitem coleccionar quer valores quer objectos, pelo que tm este ciclo for disponvel. A forma geral muito simples:
for (IdTipo elem : IdArray) { instrues }

lendo-se, para cada elemento elem de tipo IdTipo obtido do array IdArray fazer .., sendo IdTipo o tipo dos elementos do array. Este tipo de ciclo , em algumas linguagens, designado por ciclo foreach, exactamente por iterar usando cada um dos elementos da coleco. Em muitos casos, esta nova forma de expressar a iterao sobre arrays poder tornar a escrita de cdigo mais simples e mais legvel. Vejamos dois exemplos:
int[] a = {1, 34, -2, 5, -12, 34, 7}; // clculo da soma 1 int soma = 0; for(int i = 0; i < a.length; i++) { soma += a[i]; } // clculo da soma 2 soma = 0; for(int x : a) { soma += x; }

Agora, a concatenao numa nica string de um array contendo arrays de strings:


String[][] nomes = { {"Rita", "Pedro"}, }; String sfinal = ""; // concatenao 1 for(int l = 0; l < nomes.length; l++) { for(int c = 0; c < nomes[l].length; c++) sfinal += nomes[l][c]; } sfinal = ""; // concatenao 2 for(String[] lnomes : nomes) { for(String nome : lnomes) sfinal += nome; }

Como podemos verificar, a soluo com o ciclo for(each) torna-se muito mais simples para este caso, porque um maior nmero de detalhes de controlo da iterao escondido. De salientar, alis, que o primeiro algoritmo a implementao da segunda forma. Para concluir esta breve apresentao sobre os arrays em JAVA, duas notas importantes. Existe uma classe java.util.Arrays que oferece vrias operaes sobre arrays que lhes sejam passados como parmetros, tais como ordenao, pesquisa binria, converso para lista, etc. Na classe System, uma operao arraycopy() permite copiar elementos de um array para outro de forma muito eficiente.
22

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM

Os arrays no so objectos, logo, no so importantes em PPO, at porque so estticos (no crescem) e h classes que so arrays dinmicos. Porm, com base nos arrays que esto construdas as classes de JAVA que implementam as vrias coleces de objectos (estruturas de dados e algoritmos), dada a sua eficincia (memria contgua).

2.4.12 Estrutura de um programa


Um programa fonte JAVA tem uma estrutura, partida, muito simples, porque em cada ficheiro de texto fonte JAVA apenas possvel definir uma classe, e o nome do ficheiro deve ser igual ao nome da classe, tendo como extenso java. Assim, o ficheiro contendo a definio de uma classe C dever-se- chamar C.java. A estrutura de um programa principal (programa executvel) de JAVA a apresentada na Figura 2.8:

import java...............; ........... public class ProgPrincipal { .............. public static void main(String[] args) { ------------------------------------------------------------------------------------------------------} }
Figura 2.8 Estrutura base de programa JAVA

Assim, o que noutras linguagens se designa por programa principal em JAVA uma classe declarada como public class seguida do nome, neste caso, ProgPrincipal, na qual definimos uma funo chamada main(), declarada como public static void e com um parmetro args que do tipo String[], ou seja, um array de strings. Ambas as declaraes so seguidas de blocos {. .} de que falaremos em seguida. O que acabmos de escrever absolutamente fixo e, sempre que tivermos que escrever um pequeno programa em JAVA, podemos copiar este formato padro. No entanto, esta uma classe especial pois no vai, nem foi definida para tal, criar instncias. Serve apenas para conter um mtodo main() no qual vamos escrever cdigo para ser executado. Tal como noutras linguagens, sempre que necessitarmos de usar bibliotecas da linguagem no nosso programa, antes de iniciarmos a declarao da classe, escrevemos as clusulas de importao de tais bibliotecas (vimos anteriormente algumas teis). A funo main() ser a primeira a ser invocada pelo interpretador de JAVA ao ser executado o programa. Caso esta funo no existisse, o programa no executaria. Assim, o cdigo que pretendemos executar neste nosso programa deve ser introduzido no bloco associado funo main(). Outras funes externas a esta funo poderiam ser codificadas no corpo principal da classe usando public
static, podendo a funo main() invoc-las de forma a estruturar o seu cdigo.

Apresentam-se em seguida quatro pequenos exemplos:

Tecnologia Java5

23

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

import static java.lang.System.out; public class Prog1 { // clculo de uma rea circular public static void main(String[] args) { double raio = 2.56; double pi = 3.14159; out.printf("Circulo de raio %5.2f%n", raio); out.printf("tem area igual a %10.4f%n", raio*pi); } }

Os resultados produzidos em ecr so:

Circulo de raio 2,56 tem area igual a 8,0425

No exemplo, declarmos na funo main() duas variveis do tipo double e, em seguida, foi feita a sada formatada dos textos com os valores do raio e do clculo da rea do crculo. Os resultados da execuo do programa so os apresentados. portanto no bloco de instrues de main() que declaramos todas as variveis com que vamos trabalhar no mbito da funo, e escrevemos as instrues para a realizao do problema a resolver. O programa seguinte declara um array de inteiros, atribui-lhe valores e determina qual o menor valor e a sua posio no array, escrevendo-os no ecr.
import static java.lang.System.out; public class TstArrays1 { // programa principal para testes com arrays public static void main(String[] args) { // declara e inicializa os elementos de um array int[] lista = {128, -2, 245, 616, 77, 213}; // determinao do menor elemento do array int min = lista[0]; // primeiro , para j, o menor int pos = 0; // est no ndice 0 for(int i = 1; i < lista.length; i++) if (lista[i] < min) { min = lista[i]; pos = i; } out.println("\nMenor = " + min); out.println("Indice = " + pos); } }

Os resultados produzidos em ecr so:

Menor = -2 Indice = 1

O programa seguinte interessante pelo facto de que, para alm de usar um algoritmo bem conhecido, o algoritmo de pesquisa binria num conjunto ordenado de inteiros, tem a vantagem de necessitar de estruturas no usadas nos exemplos anteriores.
import static java.lang.System.out; public class TstArrays2 { // ALGORITMO DE PESQUISA BINARIA // (arrays no vazios e por ordem crescente) public static void main(String[] args) { // declara e inicializa os elementos de um array // usando a construo de inicializao {} int[] a = {0, 4, 8, 9, 21, 34, 45, 57, 51, 61, 70, 90, 93}; int chave = 70; // valor usualmente lido ! int menor, meio, maior; boolean existe = false; menor = 0; maior = a.length - 1;

24

Tecnologia Java5

JAVA: TECNOLOGIA E INTRODUO LINGUAGEM

// procurar sempre o ndice mdio destes indices do { meio = (menor + maior)/2; if ( chave > a[meio] ) menor = meio + 1; else maior = meio - 1; } while( (a[meio] != chave) && (menor <= maior) ); // encontrado ou no ?? existe = (a[meio] == chave); if (!existe ) out.println("N. " + chave + " nao existe !"); else out.println("N. " + chave + " no ndice " + meio); } }

Os resultados produzidos em ecr so:

N. 70 no ndice 10

Repare-se, neste algoritmo, que a condio de sada do ciclo do-while assume j uma expresso boleana de conjuno (&&) com dois operandos resultantes de duas expresses de tipo relacional de alguma complexidade. Ser que os parntesis nas expresses de tipo relacional seriam mesmo necessrios? De facto no eram, porque o operador lgico tem menor precedncia do que os relacionais, mas tambm verdade que desta forma o cdigo se l com muito maior facilidade e a legibilidade sempre muito importante. Finalmente, repare-se no alinhamento das chavetas de incio e fim de bloco. Depois de definido um estilo, a coerncia na sua utilizao tambm factor a favor da legibilidade. Enquanto a sada de resultados tem em JAVA mltiplas solues, a entrada de dados, ou seja, as operaes de leitura so relativamente complexas caso no sejam escondidas (convenientemente abstradas) a quem as pretende usar. Por agora, deixamos apenas um pequeno exemplo da utilizao da classe Scanner, que l do teclado valores de tipos primitivos e strings:
import java.util.Scanner; public class Leitura1 { public static void main(String[] args) { // Scanner: classe para leitura Scanner input = new Scanner(System.in); // l via teclado System.out.print("Nome: "); String nome = input.next(); System.out.print("Idade: "); int idade = input.nextInt(); System.out.println(nome + " tem " + idade + " anos."); } }

Neste programa foi utilizada a clusula de importao que nos permite ter acesso classe Scanner da biblioteca java.util. Uma instncia da classe Scanner foi criada para trabalhar sobre o ficheiro predefinido System.in que est associado ao teclado. A varivel input refere o scanner com que vamos trabalhar a partir de agora, e do qual vamos ler o prximo token usando o mtodo next() (l uma sequncia de caracteres terminada por newline) e, em seguida, um valor inteiro com nextInt(). Estes mtodos esperam valores correctos, pelo que a leitura de um inteiro incorrecto gerar um erro de execuo e aterminao imediata do programa. Neste caso, deu mesmo muito jeito uma propriedade de JAVA que a possibilidade de declararmos as variveis onde quer que seja antes da sua utilizao, dado que assim no necessitmos de inicializar as variveis nome e idade pois elas recebem de imediato os valores lidos.
Tecnologia Java5
25

JAVA5 E PROGRAMAO POR OBJECTOS (F. MRIO MARTINS 2006)

Para completar estes exemplos que visam agrupar conjuntos de instrues apresentadas em separado, apresenta-se um excerto de cdigo que permite apresentar ao utilizador, de forma formatada, os vrios componentes da data actual do sistema:
Calendar hoje = Calendar.getInstance(); // dia + hora/min/seg/miliseg actual out.printf("%tT", hoje); // 07:53:02 out.printf("%1$tY-%1$tm-%1$td%n", hoje); // 2006-01-01 out.printf("%1$tH-%1$<tM-%1$<tS%n", hoje); // 07-53-02

As vrias formas %tY, %tm, %td, %tM, %tS, etc., correspondem aos formatos dos respectivos componentes do objecto calendrio (Calendar) que foi criado, cf. ano, ms, dia, hora, min, etc.

2.5 Criao do ambiente JAVA


O J2SE Development Kit 5.0 (JDK5.0) o ambiente de desenvolvimento de aplicaes JAVA mais recentemente disponibilizado pela Sun Microsystems, podendo ser obtido em ou http://java.sun.com/downloads/index.html ou http://java.sun.com/j2se/1.5.0/download.jsp http://java.sun.com/j2se/. Todo o ambiente de desenvolvimento, bem como toda a documentao fundamental para a instalao em cada tipo de sistema operativo, pode ser obtida a partir de um destes endereos. O ficheiro http://java.sun.com/j2se/1.5.0/docs/relnotes/version-5.0.html de leitura muito importante, pois documenta a estrutura de directrios aps a instalao, bem como os que so de incluso obrigatria nas variveis de ambiente. Destas variveis de ambiente, importante configurar a varivel PATH por forma a que passe a conter o caminho para o compilador e outros utilitrios de JAVA, por exemplo, o caminho C:\Programas\Java\jdk1.5.0_06\bin, e a varivel CLASSPATH, que d indicao dos locais onde o compilador pode encontar classes necessrias compilao, e o interpretador execuo. Por omisso usada a directoria actual de trabalho.

26

Tecnologia Java5

Vous aimerez peut-être aussi