Você está na página 1de 25

Universidade So Francisco

Prof. Peter Jandl Junior Ncleo de Educao a Distncia Universidade So Francisco 1999

Introduo ao Java

1 A Linguagem Java

1.1 O que o Java?


Java uma nova linguagem de programao, introduzida no mercado em 1995 pela Sun Microsystems, que provocou e ainda provoca excitao e entusiasmo em programadores, analistas e projetistas de software. Mas por que o Java produz esta reao? Simplesmente porque o resultado de um trabalho consistente de pesquisa e desenvolvimento de mais do que uma simples linguagem de programao, mas de todo um ambiente de desenvolvimento e execuo de programas que exibe as facilidades proporcionadas pela orientao objetos, pela extrema portabilidade do cdigo produzido, pelas caractersticas de segurana que esta plataforma oferece e finalmente pela facilidade de sua integrao ao outros ambientes, destacandose a Internet.

Figura 1 Java Logo

1.2 Pequeno Histrico


Tudo comeou em 1991, com um pequeno grupo de projeto da Sun Microsystems denominado Green que pretendia criar uma nova gerao de computadores portteis inteligentes, capazes de se comunicar de muitas formas, ampliando suas potencialidades de uso. Para tanto decidiu-se criar tambm uma nova plataforma para o desenvolvimento destes equipamentos de forma que seu software pudesse ser portado para os mais diferentes tipos de equipamentos. A primeira escolha de um linguagem de programao para tal desenvolvimento foi C++, aproveitando suas caractersticas e a experincia do integrantes do grupo no desenvolvimento de produtos. Mas mesmo o C++ no permitia realizar com facilidade tudo aquilo que o grupo visionava. James Gosling, coordenador do projeto, decidiu ento pela criao de uma nova linguagem de programao que pudesse conter tudo aquilo que era considerado importante e que ainda assim fosse simples, porttil e fcil de programar. Surgiu assim a linguagem interpretada Oak (carvalho em ingls) batizada assim dada a existncia de uma destas rvores em frente ao escritrio de Gosling. Para dar suporte a linguagem tambm surgiu o Green OS e uma interface grfica padronizada. Aps dois anos de trabalho o grupo finaliza o Star7 (ou *7), um avanado PDA (Personal Digital Assistant) e em 1993 surge a primeira grande oportunidade de aplicao desta soluo da Sun numa concorrncia pblica da Time-Warner para desenvolvimento de uma tecnologia para TV a cabo interativa, injustamente vencida pela SGI (Silicon Graphics Inc.). O Oak, ento rebatizado Java devido a problemas de copyright, continua sem uso definido at 1994, quando estimulados pelo grande crescimento da Internet, Jonathan Payne e Patrick Naughton desenvolveram o programa navegador WebRunner, capaz de
9

Prof. Peter Jandl Jr.

efetuar o download e a execuo de cdigo Java via Internet. Apresentado formalmente pela Sun como o navegador HotJava e a linguagem Java no SunWorld'95, o interesse pela soluo se mostrou explosivo. Poucos meses depois a Netscape Corp. lana uma nova verso de seu navegador Navigator tambm capaz de efetuar o download e a execuo de pequenas aplicaes Java ento chamadas applets. Assim se inicia a histria de sucesso do Java. Numa iniciativa tambm indita a Sun decide disponibilizar o Java gratuitamente para a comunidade de desenvolvimento de software, embora detenha todos os direitos relativos linguagem e as ferramentas de sua autoria. Surge assim o Java Developers Kit 1.0 (JDK 1.0). As plataformas inicialmente atendidas foram: Sun Solaris e Microsoft Windows 95/NT. Progressivamente foram disponibilizados kits para outras plataformas tais como IBM OS/2, Linux e Applet Macintosh. Em 1997, surge o JDK 1.1 que incorpora grandes melhorias para o desenvolvimento de aplicaes grficas e distribudas e no incio de 1999 lanado o JDK 1.2, contendo muitas outras melhorias, de forma que tambm seja conhecido como Java 2. Atualmente a Sun vem liberando novas verses ou correes a cada nove meses bem como novas API (Application Program Interface) para desenvolvimento de aplicaes especficas. A ltima verso disponvel o JDK 1.3.

1.3 Caractersticas Importantes


A linguagem Java exibe importantes caractersticas que, em conjunto, diferenciamna de outras linguagens de programao: Orientada Objetos Java uma linguagem puramente orientada objetos pois, com exceo de seus tipos primitivos de dados, tudo em Java so classes ou instncia de uma classe. Java atende todos os requisitos necessrios para uma linguagem ser considerada orientada objetos que resumidamente so oferecer mecanismos de abstrao, encapsulamento e hereditariedade. Independente de Plataforma Java uma linguagem independente de plataforma pois os programas Java so compilados para uma forma intermediria de cdigo denominada bytecodes que utiliza instrues e tipos primitivos de tamanho fixo, ordenao big-endian e um biblioteca de classes padronizada. Os bytecodes so como uma linguagem de mquina destinada a uma nica plataforma, a mquina virtual Java (JVM Java Virtual Machine), um interpretador de bytecodes. Pode-se implementar uma JVM para qualquer plataforma assim temos que um mesmo programa Java pode ser executado em qualquer arquitetura que disponha de uma JVM. Sem Ponteiros Java no possui ponteiros, isto , Java no permite a manipulao direta de endereos de memria nem exige que o objetos criados seja destrudos livrando os programadores de uma tarefa complexa. Alm disso a JVM possui um mecanismo automtico de gerenciamento de memria conhecido como garbage collector, que recupera a memria alocada para objetos no mais referenciados pelo programa. Performance Java foi projetada para ser compacta, independente de plataforma e para utilizao em rede o que levou a deciso de ser interpretada atravs dos esquema de bytecodes. Como uma linguagem interpretada a performance razovel, no podendo ser comparada a velocidade de execuo de cdigo nativo. Para superar esta limitao vrias JVM dispe de compiladores just in time (JIT) que compilam os bytecodes para cdigo nativo durante a execuo

10

Introduo ao Java

otimizando a execuo, que nestes casos melhora significativamente a performance de programas Java. Segurana Considerando a possibilidade de aplicaes obtidas atravs de uma rede, a linguagem Java possui mecanismos de segurana que podem, no caso de applets, evitar qualquer operao no sistema de arquivos da mquina-alvo, minimizando problemas de segurana. Tal mecanismo flexvel o suficiente para determinar se uma applet considerada segura especificando nesta situao diferentes nveis de acesso ao sistema-alvo. Permite Multithreading Java oferece recursos para o desenvolvimento de aplicaes capazes de executar mltiplas rotinas concorrentemente bem dispe de elementos para a sincronizao destas vrias rotinas. Cada um destes fluxos de execuo o que se denomina thread, um importante recurso de programao de aplicaes mais sofisticadas. Alm disso, o Java uma linguagem bastante robusta, oferece tipos inteiros e ponto flutuante compatveis com as especificaes IEEE, suporte para caracteres UNICODE, extensvel dinamicamente alm de ser naturalmente voltada para o desenvolvimento de aplicaes em rede ou aplicaes distribudas. Tudo isto torna o Java uma linguagem de programao nica.

1.4 Recursos Necessrios


Para trabalharmos com o ambiente Java recomendamos o uso do Java Developers Kit em verso superior JDK 1.1.7 e um navegador compatvel com o Java tais como o Netscape Communicator 4.5 ou o Microsoft Internet Explorer 4 ou verses superiores. O JDK, em diversas verses e plataformas oficialmente suportadas pela Sun, pode ser obtido gratuitamente no site: http://www.javasoft.com/products/jdk/ Verses de demonstrao dos navegadores da Microsoft, Netscape e Sun (HotJava) podem ser obtidas nos seguintes sites: http://www.microsoft.com/ http://www.netscape.com/ http://java.sun.com/products/hotjava/ Outras informaes sobre a plataforma Java, artigos, dicas e exemplos podem ser obtidas nos sites: Site oficial da Sun sobre o Java http://www.javasoft.com/ Tutoriais sobre o Java http://www.javasoft.com/tutorial/ Outros tutoriais sobre o Java http://java.sun.com/docs/books/tutorial/ Revista online http://www.javaworld.com/ Revista online http://www.javareport.com/ Applets, exemplos e outros recursos http://www.jars.com/ Diversos recursos e exemplos Java http://www.gamelan.com/ Diversos recursos e exemplos Java http://www.internet.com/ Revista online http://www.javalobby.org/ Revista online http://www.sys-con.com/java http://sunsite.unc.edu/javafaq/javafaq.html Respostas de dvidas comuns sobre Java Revista online da ACM http://www.acm.org/crossroads/ http://www.december.com/works/java.html Diversos recursos e exemplos Java

11

Prof. Peter Jandl Jr.

1.5 O Sun Java Developers Kit


O JDK composto basicamente por: Um compilador (javac) Uma mquina virtual Java (java) Um visualizador de applets (appletviewer) Bibliotecas de desenvolvimento (os packages java) Um programa para composio de documentao (javadoc) Um depurador bsico de programas (jdb) Verso run-time do ambiente de execuo (jre) Deve ser observado que o JDK no um ambiente visual de desenvolvimento, embora mesmo assim seja possvel o desenvolvimento de aplicaes grficas complexas apenas com o uso do JDK que , de fato, o padro em termos da tecnologia Java. Outros fabricantes de software tais como Microsoft, Borland, Symantec e IBM oferecem comercialmente ambientes visuais de desenvolvimento Java, respectivamente, Visual J++, JBuilder, VisualCafe e VisualAge for Java.

1.6 Um Primeiro Exemplo


Com o JDK adequadamente instalado num computador, apresentaremos um pequeno exemplo de aplicao para ilustrarmos a utilizao bsica das ferramentas do JDK. Observe o exemplo a seguir, sem necessidade de compreendermos em detalhe o que cada uma de suas partes representa:
//Eco.java import java.io.*; public class Eco { public static void main(String[] args) { for (int i=0; i < args.length; i++) System.out.print(args[i] + " "); System.out.println(); } }

Exemplo 1 Primeiro Exemplo de Aplicao Java Utilize um editor de textos qualquer para digitar o exemplo, garantindo que o arquivo ser salvo em formato de texto simples, sem qualquer formatao e que o nome do arquivo ser Eco.java (utilize letras maisculas e minsculas exatamente como indicado!). Para podermos executar a aplicao exemplificada devemos primeiramente compilar o programa. Para tanto devemos acionar o compilador Java, ou seja, o programa javac, como indicado abaixo:
javac nome_do_arquivo.java

O compilador Java exige que os arquivos de programa tenham a extenso .java e que o arquivo esteja presente no diretrio corrente, assim, numa linha de comando, dentro do diretrio onde foi salvo o arquivo Eco.java digite:
javac Eco.java

Isto aciona o compilador Java transformando o cdigo digitado no seu correspondente em bytecodes, produzindo um arquivo Eco.class. No existindo erros o javac no exibe qualquer mensagem, caso contrrio sero exibidas na tela uma mensagem para cada erro encontrado, indicando em que linha e que posio desta foi detectado o erro.

12

Introduo ao Java

Tendo compilado o programa, ou seja, dispondo-se de um arquivo .class podemos invocar uma mquina virtual Java (JVM), isto , o interpretador Java, da seguinte forma:
java nome_do_arquivo

Note que no necessrio especificarmos a extenso .class para acionarmos a JVM. Digitando-se o comando abaixo executamos o programa Eco:
java Eco

Aparentemente nada aconteceu, mas se a linha digitada fosse outra contendo argumentos diversos tal como:
java Eco Testando 1 2 3

Obteramos o seguinte resultado:


Testando 1 2 3

Na verdade o programa exemplo apresentado apenas imprime todos os argumentos fornecidos como um eco. Embora de utilidade duvidosa, esta aplicao nos mostra como proceder a compilao e execuo de programas escritos em Java utilizando o JDK.

1.7 O Ambiente Java


O exemplo dado na seo anterior, alm de ilustrar aspectos relacionados a programao de aplicaes Java, serve tambm para caracterizar uma parte do ambiente de desenvolvimento da linguagem Java: a criao de programas, sua compilao e execuo, como mostra a Figura 2.

Editor bytecodes

Verificador bytecodes

.java

Compilador Carregador Interpretador

.class
Figura 2 Ambiente de Desenvolvimento Java

Como visto, devemos utilizar um editor de textos ASCII simples para produzirmos o cdigo fonte de um programa que, obrigatoriamente deve ser alvo como arquivos de extenso .java. Utilizando o compilador javac o arquivo fonte transformado em bytecodes Java que podem ser executados em qualquer plataforma computacional que disponha de uma mquina virtual Java como ilustrado na Figura 3. Quando solicitamos a execuo do programa, tanto atravs do interpretador java como de sua verso run-time jre, o arquivo .class primeiramente carregado, verificado para garantir-se os requisitos de segurana do sistema e s ento propriamente
13

Prof. Peter Jandl Jr.

interpretado. No caso especfico das applets o navegador (browser) efetua o download de um arquivo .class interpretando-o ou acionando algum interpretador associado (plug-in). Em ambientes onde existam compiladores JIT (just in time) os bytecodes j verificados so convertidos em instrues nativas do ambiente durante a execuo, aumentando a performance das aplicaes ou applets Java.

ByteCodes J V M J C J V M J C J V M J C J V M J C

Win95/98 Win32

WinNT

Linux Unix

Solaris

Figura 3 Ambiente Java e os Bytecodes O resultado deste ambiente que o Java, embora interpretado inicialmente, tornase independente de plataforma, simplificando o projeto de aplicaes de rede ou distribudas que tenham que operar em ambientes heterogneos, alm de permitir a incorporao de vrios mecanismos de segurana.

14

Introduo ao Java

2 Java: Variveis, Controle

Operadores

Estruturas

de

Apresentaremos agora uma pequena discusso sobre a sintaxe da linguagem Java, abordando os tipos de dados existentes, as regras para declarao de variveis, as recomendaes gerais para nomenclatura, os operadores, sua precedncia e as estruturas de controle disponveis. Como ser notado, a sintaxe da linguagem Java muito semelhante quela usada pela linguagem C/C++.

2.1 Tipos de Dados Primitivos


A linguagem Java possui oito tipos bsicos de dados, denominados tipos primitivos, que podem agrupados em quatro categorias: Tipos Inteiros Tipos Ponto Flutuante Tipo Caractere Byte Ponto Flutuante Simples Caractere Inteiro Curto Ponto Flutuante Duplo Inteiro Tipo Lgico Inteiro Longo Boleano Tabela 1 Tipos de Dados Primitivos Como pode ser facilmente observado, os tipos primitivos do Java so os mesmos encontrados na maioria das linguagens de programao e permitem a representao adequada de valores numricos. A representao de outros tipos de dados utiliza objetos especficos assim como existem classes denominadas wrappers que encapsulam os tipos primitivos como objetos da linguagem. 2.1.1 Tipos de Dados Inteiros Existem quatro diferentes tipos de dados inteiros byte (8 bits), short (inteiro curto 16 bits), int (inteiro 32 bits) e long (inteiro longo 64 bits) cuja representao interna feita atravs de complemento de 2 e que podem armazenar valores dentro dos seguintes intervalos numricos: Tipo Valor Mnimo Valor Mximo byte -128 +127 short -32.768 +32.767 int -2.147.483.648 +2.147.483.647 long -9.223.372.036.854.775.808 +9.223.372.036.854.775.807 Tabela 2 Tipos de Dados Inteiros Por default os valores literais so tratados como inteiros simples (int) ou seja valores de 32 bits. No existe em Java o modificador unsigned disponvel em outras linguagens assim os tipos inteiros so sempre capazes de representar tanto valores positivos como negativos.

15

Prof. Peter Jandl Jr.

2.1.2 Tipo de Dados em Ponto Flutuante No Java existem duas representaes para nmeros em ponto flutuante que se diferenciam pela preciso oferecida: o tipo float permite representar valores reais com preciso simples (representao interna de 32 bits) enquanto o tipo double oferece dupla preciso (representao interna de 64 bits). Os valores m ponto flutuante do Java esto em conformidade com o padro IEEE 754: Tipo Valor Mnimo Valor Mximo float double Tabela 3 Tipos de Dados em Ponto Flutuante Deve ser utilizado o ponto como separador de casas decimais. Quando necessrio, expoentes podem ser escritos usando o caractere e ou E, como nos seguintes valores: 1.44E6 (= 1.44 x 106 = 1,440,000) ou 3.4254e-2 (= 3.4254 x 10-2 = 0.034254). 2.1.3 Tipo de Dados Caractere O tipo char permite a representao de caracteres individuais. Como o Java utiliza uma representao interna no padro UNICODE, cada caractere ocupa 16 bits (2 bytes) sem sinal, o que permite representar at 32.768 caracteres diferentes, teoricamente facilitando o trabalho de internacionalizao de aplicaes Java. Na prtica o suporte oferecido ao UNICODE ainda bastante limitado embora permita a internacionalizao do cdigo Java. Alguns caracteres so considerados especiais pois no possuem uma representao visual, sendo a maioria caracteres de controle e outros caracteres cujo uso reservado pela linguagem. Tais caracteres podem ser especificados dentro dos programas como indicado na tabela abaixo, ou seja, precedidos por uma barra invertida (\): Representao Significado \n Pula linha (newline ou linefeed) \r Retorno de carro (carriage return) \b Retrocesso (backspace) \t Tabulao (horizontal tabulation) \f Nova pgina (formfeed) \ Apstrofe \ Aspas \\ Barra invertida \u223d Caractere UNICODE 233d \g37 Octal \fca Hexadecimal Tabela 4 Representao de Caracteres Especiais O valor literal de caracteres deve estar delimitado por aspas simples ( ). 2.1.4 Tipo de Dados Lgico Em Java dispe-se do tipo lgico boolean capaz de assumir os valores false (falso) ou true (verdadeiro) que equivalem aos estados off (desligado) e on (ligado) ou no (no) e yes (sim). Deve ser destacado que no existem equivalncia entre os valores do tipo lgico e valores inteiros tal como usualmente definido na linguagem C/C++.

16

Introduo ao Java

2.2 Declarao de Variveis


Uma varivel um nome definido pelo programador ao qual pode ser associado um valor pertencente a um certo tipo de dados. Em outras palavras, uma varivel como uma memria, capaz de armazenar um valor de um certo tipo, para a qual se d um nome que usualmente descreve seu significado ou propsito. Desta forma toda varivel possui um nome, um tipo e um contedo. O nome de uma varivel em Java pode ser uma sequncia de um ou mais caracteres alfabticos e numricos, iniciados por uma letra ou ainda pelos caracteres _ (underscore) ou $ (cifro). Os nomes no podem conter outros smbolos grficos, operadores ou espaos em branco, podendo ser arbitrariamente longos embora apenas os primeiros 32 caracteres sero utilizados para distinguir nomes de diferentes variveis. importante ressaltar que as letras minsculas so consideradas diferentes das letras maisculas, ou seja, a linguagem Java sensvel ao caixa empregado, assim temos como exemplos vlidos: a total x2 $mine _especial TOT Maximo ExpData Segundo as mesmas regras temos abaixo exemplos invlidos de nomes de variveis: 1x Total geral numero-minimo void A razo destes nomes serem invlidos simples: o primeiro comea com um algarismo numrico, o segundo possui um espao em branco, o terceiro contm o operador menos mas por que o quarto nome invlido? Porque alm das regras de formao do nome em si, uma varivel no pode utilizar como nome uma palavra reservada da linguagem. As palavras reservadas so os comandos, nomes dos tipos primitivos, especificadores e modificadores pertencentes a sintaxe de uma linguagem. As palavras reservadas da linguagem Java, que portanto no podem ser utilizadas como nome de variveis ou outros elementos, so: abstract continue finally interface public throw boolean default float long return throws break do for native short transient byte double if new static true case else implements null super try catch extends import package switch void char false instanceof private synchronized while class final int protected this Alm destas existem outras que embora reservadas no so utilizadas pela linguagem: const future generic goto inner operator outer rest var volatile Algumas destas, tal como o goto, faziam parte da especificao preliminar do Oak, antes de sua formalizao como Java. Recomenda-se no utiliz-las qualquer que seja o propsito. Desta forma para declararmos uma varivel devemos seguir a seguinte sintaxe:
Tipo nome1 [, nome2 [, nome3 [..., nomeN]]];

Ou seja, primeiro indicamos um tipo, depois declaramos uma lista contendo um ou mais nomes de variveis desejadas deste tipo, onde nesta lista os nomes so separados por vrgulas e a declarao terminada por ; (ponto e vrgula). Exemplos:
int i; float total, preco; byte mascara; double valorMedio;

As variveis podem ser declaradas individualmente ou em conjunto:


char opcao1, opcao2;

17

Prof. Peter Jandl Jr.

A declarao anterior equivale as duas declaraes abaixo:


char opcao1; char opcao2;

Tambm possvel definirmos uma valor inicial para uma varivel diretamente em sua declarao como indicado a seguir:
int quantidade = 0; float angulo = 1.57; boolean ok = false; char letra = c;

Variveis podem ser declaradas em qualquer ponto de um programa Java, sendo vlidas em todos no escopo onde foram declaradas e nos escopos internos estes. Por escopo entende-se o bloco (conjunto de comandos da linguagem) onde ocorreu a declarao da varivel. 2.2.1 Regras para Denominao de Variveis Em Java recomenda-se que a declarao de variveis utilize nomes iniciados com letras minsculas. Caso o nome seja composto de mais de uma palavras, as demais deveriam ser iniciadas com letras maisculas tal como nos exemplos: contador total sinal posicaoAbsoluta valorMinimoDesejado mediaGrupoTarefa2 A utilizao de caracteres numricos no nome livre enquanto o uso do trao de sublinhar (underscore _) no recomendado.

2.3 Comentrios
Comentrios so trechos de texto, usualmente explicativos, inseridos dentro do programa de forma que no sejam considerados como parte do cdigo, ou seja, so informaes deixadas juntamente com o cdigo para informao de quem programa. O Java aceita trs tipos de comentrios: de uma linha, de mltiplas linhas e de documentao. O primeiro de uma linha utiliza duas barras (//) para marcar seu incio:
// comentrio de uma linha // tudo aps as duas barras considerado comentrio

O segundo usa a combinao /* e */ para delimitar uma ou mais linhas de comentrios:


/* comentrio de mltiplas linhas */

O ltimo tipo semelhante ao comentrio de mltiplas linhas mas tem o propsito de documentar o programa:
/** comentrio de documentao que tambm * podem ter mltiplas linhas */

Geralmente o comentrio de documentao posicionado imediatamente antes do elemento a ser documentado e tem seu contedo extrado automaticamente pelo utilitrio javadoc fornecido juntamente com o JDK. Esta ferramenta gera pginas em formato html contendo os comentrio organizados da mesma forma que a documentao fornecida juntamente com o JDK. Aproveitando tal caracterstica do javadoc, usualmente se adicionam tags html aos comentrios de documentao para melhorar a forma final da documentao produzida com a incluso de imagens, tabelas, textos explicativos, links e outros recursos. Alm das tags html vrios tipos de informao administradas pelo javadoc podem ser adicionadas a estes comentrios especiais atravs de marcadores pr-definidos iniciados com @ que permitem a criao automtica de ligaes hipertexto entre a documentao e a formatao padronizada de outros elementos, tais como nome do autor, parmetros, tipo de retorno, etc. como abaixo:

18

Introduo ao Java

/** Classe destinada ao armazenamento de dados relacionados a * arquivos ou diretrios. * <p> Pode ser usada para armazenar rvores de diretrios. * @author Peter Jandl Jr * @see java.io.File */ public class FileData extends File { /** Construtor * @param filename nome do arquivo */ public FileData(String filename) { } }

2.4 Operadores
A linguagem Java oferece um conjunto bastante amplo de operadores destinados a realizao de operaes aritmticas, lgicas, relacionais e de atribuio. 2.4.1 Operadores Aritmticos Como na maioria das linguagens de programao, o Java possui vrios operadores aritmticos: Operador Significado Exemplo + Adio a+b Subtrao ab * Multiplicao a*b / Diviso a/b % Resto da diviso inteira a%b Sinal negativo (- unrio) -a + Sinal positivo (+ unrio) +a ++ Incremento unitrio ++a ou a++ -Decremento unitrio --a ou a-Tabela 5 Operadores Aritmticos Estes operadores aritmticos podem ser combinados para formar expresses onde deve ser observada a precedncia (ordem convencional) de avaliao dos operadores. Parntesis podem ser utilizados para determinar uma forma especfica de avaliao de uma expresso. A seguir um exemplo de aplicao que declara algumas variveis, atribui valores iniciais e efetua algumas operaes imprimindo os resultados obtidos.
// Aritmetica.java public class Aritmetica { static public void main (String args[]) { // Declaracao e inicializacao de duas variaveis int a = 5; int b = 2; // Varios exemplos de operacoes sobre variaveis System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("-b = " + (-b)); System.out.println("a + b = " + (a + b)); System.out.println("a - b = " + (a - b)); System.out.println("a * b = " + (a * b)); System.out.println("a / b = " + (a / b)); System.out.println("(float) a / b = " + ((float)a / b));

19

Prof. Peter Jandl Jr.

System.out.println("a % System.out.println("a++ System.out.println("--b System.out.println("a = System.out.println("b = } }

b = = " "

= " " + +

" + (a % b)); + (a++)); + (--b)); a); b);

Exemplo 2 Aplicao Aritmetica (operadores aritmticos) Compilando e executando o cdigo fornecido teramos o resultado ilustrado a seguir:

Figura 4 Resultado da Aplicao Aritmetica Embora o exemplo s tenha utilizado variveis e valores inteiros, o mesmo pode ser realizado com variveis do tipo ponto flutuante (float ou double) 2.4.2 Operadores Relacionais Alm dos operadores aritmticos o Java possui operadores relacionais, isto , operadores que permitem comparar valores literais, variveis ou o resultado de expresses retornando um resultado do tipo lgico, isto , um resultado falso ou verdadeiro. Os operadores relacionais disponveis so: Operador Significado Exemplo == Igual a == b != Diferente a != b > Maior que a>b >= Maior ou igual a a >= b < Menor que a<b <= Menor ou igual a a >= b Tabela 6 Operadores Relacionais Note que o operador igualdade definido como sendo um duplo sinal de igual (==) que no deve ser confundido com o operador de atribuio, um sinal simples de igual (=). Como possvel realizar-se uma atribuio como parte de uma expresso condicional, o compilador no faz nenhuma meno sobre seu uso, permitindo que uma atribuio seja
20

Introduo ao Java

escrita no lugar de uma comparao por igualdade, constituindo um erro comum mesmo para programadores mais experientes. O operador de desigualdade semelhante ao existente na linguagem C, ou seja, representado por !=. Os demais so idnticos a grande maioria das linguagens de programao em uso. importante ressaltar tambm que os operadores relacionais duplos, isto , aqueles definidos atravs de dois caracteres, no podem conter espaos em branco. A seguir um outro exemplo simples de aplicao envolvendo os operadores relacionais. Como para os exemplos anteriores, sugere-se que esta aplicao seja testada como forma de se observar seu comportamento e os resultados obtidos.
// Relacional.java import java.io.*; public class Relacional { static public void main (String args[]) { int a = 15; int b = 12; System.out.println("a System.out.println("b System.out.println("a System.out.println("a System.out.println("a System.out.println("a System.out.println("a System.out.println("a } } = " + a); = " + b); == b -> " != b -> " < b -> " > b -> " <= b -> " >= b -> "

+ + + + + +

(a (a (a (a (a (a

== b)); != b)); < b)); > b)); <= b)); >= b));

Exemplo 3 Aplicao Relacional (operadores relacionais) 2.4.3 Operadores Lgicos Como seria esperado o Java tambm possui operadores lgicos, isto , operadores que permitem conectar logicamente o resultado de diferentes expresses aritmticas ou relacionais construindo assim uma expresso resultante composta de vrias partes e portanto mais complexa. Operador Significado Exemplo && E lgico (and) a && b || Ou Lgico (or) a || b ! Negao (not) !a Tabela 7 Operadores Lgicos Os operadores lgicos duplos, isto , definidos por dois caracteres, tambm no podem conter espaos em branco. 2.4.4 Operador de Atribuio Atribuio a operao que permite definir o valor de uma varivel atravs de uma constante ou atravs do resultado de uma expresso envolvendo operaes diversas.
boolean result = false; i = 0; y = a*x + b;

Em Java vlido o encadeamento de atribuies, tal como abaixo, onde todas as variveis so inicializadas com o mesmo valor:

21

Prof. Peter Jandl Jr.

byte m, n, p, q; M m = n = p = q = 0;

// equivale a m = (n = (p = (q = 0)));

2.4.5 Precedncia de Avaliao de Operadores Numa expresso onde existam diversos operadores necessrio um critrio para determinar-se qual destes operadores ser primeiramente processado, tal como ocorre em expresses matemticas comuns. A precedncia este critrio que especifica a ordem de avaliao dos operadores de um expresso qualquer. Na Tabela 8 temos relacionados os nveis de precedncia organizados do maior (Nvel 1) para o menor (Nvel 15). Alguns dos operadores colocados na tabela no esto descritos neste texto. Nvel Operadores 1 . (seletor) [ ] ( ) 2 ++ -- ~ instanceof new clone - (unrio) 3 * / % 4 + 5 << >> >>> 6 < > <= >= 7 == != 8 & 9 ^ 10 | 11 && 12 || 13 ?: 14 = op= 15 , Tabela 8 Precedncia dos Operadores em Java Note que algumas palavras reservadas (instanceof, new e clone) se comportam como operadores. Operadores de um mesmo nvel de precedncia so avaliados conforme a ordem em que so encontrados, usualmente da esquerda para direita. Para modificarmos a ordem natural de avaliao dos operadores necessrio utilizarmos os parntesis, cujo nvel de avaliao o mais alto, para especificar-se a ordem de avaliao desejada.

2.5 Estruturas de Controle


Um programa de computador uma sequncia de instrues organizadas de forma tal a produzir a soluo de um determinado problema. Naturalmente tais instrues so executadas em sequncia, o que se denomina fluxo sequencial de execuo. Em inmeras circunstncias necessrio executar as instrues de um programa em uma ordem diferente da estritamente sequencial. Tais situaes so caracterizadas pela necessidade da repetio de instrues individuais ou de grupos de instrues e tambm pelo desvio do fluxo de execuo. As linguagens de programao tipicamente possuem diversas estruturas de programao destinadas ao controle do fluxo de execuo, isto , estruturas que permitem a repetio e o desvio do fluxo de execuo. Geralmente as estruturas de controle de execuo so divididas em: Estruturas de repetio simples Destinadas a repetio de um ou mais comandos, criando o que se denomina laos. Geralmente o nmero de repeties pr-definido ou pode ser

22

Introduo ao Java

determinado pelo programa durante a execuo. No Java dispe-se da diretiva for. Estruturas de desvio de fluxo Destinadas a desviar a execuo do programa para uma outra parte, quebrando o fluxo sequencial de execuo. O desvio do fluxo pode ocorrer condicionalmente, quando associado a avaliao de uma expresso, ou incondicionalmente. No Java dispe-se das diretivas if e switch. Estruturas de repetio condicionais Semelhantes as estruturas de repetio simples mas cuja repetio est associada a avaliao de uma condio sendo geralmente utilizadas quando no se conhece de antemo o nmero necessrio de repeties. No Java dispe-se das diretivas while e do while. Alm destas estruturas existem ainda: Mecanismos de modularizao Estruturas de controle de erros

Fluxo Sequncial de Execuo

Fluxo Repetitivo de Execuo

Desvio do Fluxo de Execuo

Figura 5 Variaes do Fluxo de Execuo de um Programa Os mecanismos de modularizao so aqueles que nos permitem a construo de funes e procedimentos (dentro do paradigma procedural) ou mtodos (dentro da paradigma da orientao objetos) e sero discutidos na prxima seo. J as estruturas de controle de erros constituem uma importante contribuio a programao pois simplifica bastante a a incluso e construo de rotinas de tratamento de erros dentro do cdigo. Antes de tratarmos especificamente das estruturas de controle da linguagem necessrio colocarmos algumas definies. Formalmente as instrues de um programa so chamadas diretivas (statements). Tradicionalmente as diretivas so escritas uma aps o outra num programa e so separadas de alguma forma, por exemplo com uma quebra de linha ou um caractere de pontuao. Em Java, tal como na linguagem C/C++, as diretivas so separadas uma das outras atravs do smbolo de pontuao ; (ponto e vrgula), sendo possvel existir vrias diretivas numa mesma linha desde que separadas por um ponto e vrgula. Abaixo temos um exemplo hipottico de vrias diretivas colocadas sequenciamente:
23

Prof. Peter Jandl Jr.

diretiva1; diretiva2; diretiva3; M diretivaN;

Como nas outras linguagens de programao, as estruturas de controle podem operar sobre diretivas isoladas (individuais) ou sobre vrias diretivas tratadas como um conjunto que denominado bloco. Um bloco em Java um grupo de diretivas delimitadas por chaves ({K}). Por sua vez um bloco de diretivas recebe um tratamento equivalente ao de uma nica diretiva individual.
{ diretiva1; diretiva2; diretiva3; M diretivaN; }

diretivaUnica;

2.5.1 Estruturas de repetio simples Como repetio simples consideramos um trecho de cdigo, isto , um conjunto de diretivas que deve ser repetido um nmero conhecido e fixo de vezes. A repetio uma das tarefas mais comuns da programao utilizada para efetuarmos contagens, para obteno de dados, para impresso etc. Em Java dispomos da diretiva for cuja sintaxe dada a seguir:
for (inicializao; condio de execuo; incremento/decremento) diretiva;

O for possui trs campos ou sees, todas opcionais, delimitados por um par de parntesis que efetuam o controle de repetio de uma diretiva individual ou de um bloco de diretivas. Cada campo separado do outro por um ponto e vrgula. O primeiro campo usado para dar valor inicial a uma varivel de controle (um contador). O segundo campo uma expresso lgica que determina a execuo da diretiva associada ao for, geralmente utilizando a varivel de controle e outros valores.

inicializao

verdadeiro Expresso Lgica falso

Diretiva

Incremento/ decremento Figura 6 Comportamento da Diretiva for

24

Introduo ao Java

Aps a execuo da seo de inicializao ocorre a avaliao da expresso lgica. Se a expresso avaliada como verdadeira, a diretiva associada executada, caso contrrio o comando for encerrado e a execuo do programa prossegue com o prximo comando aps o for. O terceiro campo determina como a varivel de controle ser modificada a cada iterao do for. Considera-se como iterao a execuo completa da diretiva associada, fazendo que ocorra o incremento ou decremento da varivel de controle. A seguir um exemplo de utilizao da diretiva for:
import java.io.*; public class exemploFor { public static void main (String args[]) { int j; for (j=0; j<10; j++) { System.out.println(+j); } } }

Exemplo 4 Utilizao da Diretiva for Se executado, o exemplo acima dever exibir uma contagem de 0 at 9 onde cada valor exibido numa linha do console. 2.5.2 Estruturas de desvio de fluxo Existem vrias estruturas de desvio de fluxo que podem provocar a modificao da maneira com que as diretivas de um programa so executadas conforme a avaliao de uma condio. O Java dispe de duas destas estruturas: if e switch. O if uma estrutura simples de desvio de fluxo de execuo, isto , uma diretiva que permite a seleo entre dois caminhos distintos para execuo dependendo do resultado falso ou verdadeiro resultante de uma expresso lgica.
if (expresso_lgica) diretiva1; else diretiva2;

A diretiva if permite duas construes possveis: a primeira, utilizando a parte obrigatria, condiciona a execuo da diretiva1 a um resultado verdadeiro oriundo da avaliao da expresso lgica associada; a segunda, usando opcionalmente o else, permite que seja executada a diretiva1 caso o resultado da expresso seja verdadeiro ou que seja executada a diretiva2 caso tal resultado seja falso. Isto caracteriza o comportamento ilustrado pela Figura 7. A seguir um exemplo de uso da diretiva if.
import java.io.*; public class exemploIf { public static void main (String args[]) { if (args.length > 0) { for (int j=0; j<Integer.parseInt(args[0]); j++) { System.out.print("" + j + " "); } System.out.println("\nFim da Contagem"); } System.out.println("Fim do Programa"); } }

Exemplo 5 Utilizao da Diretiva if

25

Prof. Peter Jandl Jr.

Ao executar-se ente programa podem ocorrer duas situaes distintas como resultado: se foi fornecido algum argumento na linha de comando (args.length > 0), o programa o converte para um nmero inteiro (Integer.parseInt(args[0])) e exibe uma contagem de 0 at o nmero fornecido e depois exibida uma mensagem final, seno apenas a mensagem final exibida. Caso se fornea um argumento que no seja um valor inteiro vlido ocorre um erro que sinalizado como uma exceo java.lang.NumberFormatException que interrompe a execuo do programa. J o switch uma diretiva de desvio mltiplo de fluxo, isto , baseado na avaliao de uma expresso ordinal escolhido um caminho de execuo dentre vrios possveis. Um resultado ordinal aquele pertencente a um conjunto onde se conhecem precisamente o elemento anterior e o posterior, por exemplo o conjunto dos nmeros inteiros ou dos caracteres, ou seja, um valor dentro de um conjunto cujos valores podem ser claramente ordenados (0, 1, 2 .... no caso dos inteiros e A, B, C... no caso dos caracteres).

Expresso Lgica verdadeiro Diretiva 1

falso

verdadeiro Expresso Lgica

falso

Diretiva 1

Diretiva 2

Figura 7 Comportamento da Diretiva if O switch equivale logicamente a um conjunto de diretivas if encadeadas, embora seja usualmente mais eficiente durante a execuo. Na Figura 8 temos ilustrado o comportamento da diretiva switch. A sintaxe desta diretiva a seguinte:
switch (expresso_ordinal) { case ordinal1: diretiva3; break; case ordinal2: diretiva2; break; default: diretiva_default; }

A expresso utilizada pelo switch deve necessariamente retornar um resultado ordinal. Conforme o resultado selecionado um dos casos indicados pela construo case ordinal. As diretivas encontradas a partir do caso escolhido so executadas at o final da diretiva switch ou at uma diretiva break que encerra o switch. Se o valor resultante no possuir um caso especfico so executadas as diretivas default colocadas, opcionalmente, ao final da diretiva switch.

26

Introduo ao Java

Expresso Ordinal caso1 Diretiva 1 caso2 Diretiva 2 default Diretiva n

Figura 8 Comportamento da Diretiva switch Note que o ponto de incio de execuo um caso (case) cujo valor ordinal aquele resultante da expresso avaliada. Aps iniciada a execuo do conjunto de diretivas identificadas por um certo caso, tais aes s so interrompidas com a execuo de uma diretiva break ou com o final da diretiva switch. A seguir temos uma aplicao simples que exemplifica a utilizao das diretivas switch e break.
// exemploSwitch.java import java.io.*; public class exemploSwitch { public static void main (String args[]) { if (args.length > 0) { switch(args[0].charAt(0)) { case 'a': case 'A': System.out.println("Vogal break; case 'e': case 'E': System.out.println("Vogal break; case 'i': case 'I': System.out.println("Vogal break; case 'o': case 'O': System.out.println("Vogal break; case 'u': case 'U': System.out.println("Vogal break; default: System.out.println("No } } else { System.out.println("No foi fornecido } } }

A"); E"); I"); O"); U"); uma vogal"); argumento");

Exemplo 6 Utilizao da Diretiva Switch

27

Prof. Peter Jandl Jr.

No exemplo, quando fornecido algum argumento, a aplicao identifica se o primeiro caractere deste uma vogal. Se o argumento no for iniciado por vogal ocorre a execuo da seo default da diretiva switch. Caso no existam argumentos fornecidos o programa imprime uma mensagem correspondente. 2.5.3 Estruturas de repetio condicionais As estruturas de repetio condicionais so estruturas de repetio cujo controle de execuo feito pela avaliao de expresses condicionais. Estas estruturas so adequadas para permitir a execuo repetida de um conjunto de diretivas por um nmero indeterminado de vezes, isto , um nmero que no conhecido durante a fase de programao mas que pode ser determinado durante a execuo do programa tal como um valor a ser fornecido pelo usurio, obtido de um arquivo ou ainda de clculos realizados com dados alimentados pelo usurio ou lido de arquivos. Existem duas estruturas de repetio condicionais: while e do while. O while o que chamamos de lao condicional, isto , um conjunto de instrues que repetido enquanto o resultado de uma expresso lgica (uma condio) avaliado como verdadeiro. Abaixo segue a sintaxe desta diretiva enquanto seu o comportamento ilustrado a seguir.
while (expresso_lgica) diretiva;

Note que a diretiva while avalia o resultado da expresso antes de executar a diretiva associada, assim possvel que diretiva nunca seja executada caso a condio seja inicialmente falsa. Um problema tpico relacionado a avaliao da condio da diretiva while o seguinte: se a condio nunca se tornar falsa o lao ser repetido indefinidamente.

Expresso Lgica verdadeiro Diretiva

falso

Figura 9 Comportamento da Diretiva while O do while tambm um lao condicional, isto , tal como o while um conjunto de instrues repetido enquanto o resultado da condio avaliada como verdadeira mas, diferentemente do while, a diretiva associada executada antes da avaliao da expresso lgica e assim temos que esta diretiva executada pelo menos uma vez. Seguem a sintaxe da diretiva do while e uma ilustrao do seu comportamento.
do diretiva while (expresso_lgica);

28

Introduo ao Java

Diretiva

verdadeiro Expresso Lgica falso Figura 10 Comportamento da Diretiva do while A seguir temos exemplos da aplicao destas duas diretivas de repetio.
// exemploWhile.java import java.io.*; public class exemploWhile { public static void main (String args[]) { int j = 10; while (j > Integer.parseInt(args[0])) { System.out.println(""+j); j--; } } }

Exemplo 7 Utilizao da Diretiva while O exemplo acima ilustra o uso da diretiva while tal como um lao de repetio simples equivalente a uma diretiva for como abaixo:
for (int j=0; j>Integer.parseInt(args[0]); j--) { System.out.println(""+j); }

A seguir um exemplo da diretiva do while.


// exemploDoWhile.java import java.io.*; public class exemploDoWhile { public static void main (String args[]) { int min = Integer.parseInt(args[0]); int max = Integer.parseInt(args[1]); do { System.out.println("" + min + " < " + max); min++; max--; } while (min < max); System.out.println("" + min + " < " + max + " Condicao invalida."); } }

Exemplo 8 Utilizao da Diretiva do while

29

Prof. Peter Jandl Jr.

2.5.4 Estruturas de controle de erros O Java oferece duas importantes estruturas para o controle de erros muito semelhantes as estruturas existentes na linguagem C++: try catch e try finally. Ambas tem o propsito de evitar que o programador tenha que realizar testes de verificao e avaliao antes da realizao de certas operaes, desviando automaticamente o fluxo de execuo para rotinas de tratamento de erro. Atravs destas diretivas, delimita-se um trecho de cdigo que ser monitorado automaticamente pelo sistema. A ocorrncia de erros no Java sinalizada atravs de excees, isto , objetos especiais que carregam informao sobre o tipo de erro detectado. Existem vrias classes de exceo adequadas para o tratamento do problemas mais comuns em Java, usualmente inclusas nos respectivos pacotes. Excees especiais podem ser criadas em adio s existentes ampliando as possibilidades de tratamento de erro. Com o try catch a ocorrncia de erros de um ou mais tipos dentro do trecho de cdigo delimitado desvia a execuo automaticamente para uma rotina designada para o tratamento especfico deste erro. A sintaxe do try catch a seguinte:
try { diretiva_normal; } catch (exception1) { diretiva_de_tratamento_de erro1; } catch (exception2) { diretiva_de_tratamento_de erro2; }

No Exemplo 7, a aplicao exibe uma contagem regressiva baseada num valor inteiro fornecido pelo primeiro argumento (args[0]). Se tal argumento no fornecido, ocorre uma exceo da classe java.lang.ArrayIndexOutOfBoundsException pois o cdigo tenta inadvertidamente usar um argumento que no existe (a mensagem exibida segue abaixo).
java.lang.ArrayIndexOutOfBoundsException at exemploWhile.main(Compiled Code)

Para evitar esse erro o programador poderia testar de forma convencional se foram fornecidos argumentos aplicao, como no Exemplo 6 (args.length > 0). A seguir temos uma nova verso do Exemplo 7 que contm uma estrutura convencional de teste do nmero de argumentos fornecido.
// exemploTeste.java import java.io.*; public class exemploTeste { public static void main (String args[]) { int j = 10; if (args.length > 0) { while (j > Integer.parseInt(args[0])) { System.out.println(""+j); j--; } } else { System.out.println("No foi fornecido um argumento inteiro"); } } }

Exemplo 9 Aplicao com Teste Convencional

30

Introduo ao Java

Caso no se forneam argumentos no ocorrer erro mas se o primeiro argumento fornecido no for numrico acontecer a sinalizao de uma exceo devido a tentativa converso efetuada para determinao do limite da contagem a se exibida. Outra alternativa a utilizao de uma diretiva try catch como abaixo:
// exemploTryCatch1.java import java.io.*; public class exemploTryCatch1 { public static void main (String args[]) { int j = 10; try { while (j > Integer.parseInt(args[0])) { System.out.println(""+j); j--; } } catch (ArrayIndexOutOfBoundsException e) { System.out.println("No foi fornecido um argumento."); } } }

Exemplo 10 Aplicao da Diretiva try catch Desta forma o cdigo e a rotina de tratamento de erros ficam mais claramente isolados, aumentando a legibilidade e facilidade de modificao do programa. Considerando que o argumento fornecido pelo usurio pode no ser um inteiro vlido ocorre uma outra exceo: java.lang.NumberFormatException pois a converso se torna impossvel. Contornar esse erro testando a validade do argumento requereria uma rotina extra no modo convencional. Com o uso da diretiva try catch teramos:
// exemploTryCatch2.java import java.io.*; public class exemploTryCatch2 { public static void main (String args[]) { int j = 10; try { while (j > Integer.parseInt(args[0])) { System.out.println(""+j); j--; } } catch (ArrayIndexOutOfBoundsException e) { System.out.println("No foi fornecido um argumento."); } catch (java.lang.NumberFormatException e) { System.out.println("No foi fornecido um inteiro vlido."); } } }

Exemplo 11 Utilizao da Diretiva try catch com 2 Excees Com o try finally temos um comportamento bastante diferente: uma rotina de finalizao garantidamente executada, isto , o trecho particular de cdigo contido na clusula finally sempre executado ocorrendo ou no erros dentro do trecho delimitado pela clusula try. A sintaxe do try finally colocada a seguir:

31

Prof. Peter Jandl Jr.

try { diretiva_normal; } finally { diretiva_de_tratamento_de erro; }

Isto particularmente interessante quando certos recursos do sistema ou estruturas de dados devem ser liberadas, independentemente de sua utilizao.

32