You are on page 1of 43

Apostila Java

2 Apostila Java 1. Introduo ao Java 3 1.1 A histria do Java (definio, tecnologias, comparaes). 1.2 API Java (evite reinventar a roda...). 1.3 Ambiente Java (O que eu preciso para programar em Java?, Por que Java lento?, Java Multiplataforma?, Instalao, Configurao). 2. Reviso P.O.O. (Terminologia Orientada a Objetos). 2.1 O que uma classe? O que um objeto? 2.2 Herana e Polimorfismo (reutilizao de cdigo). 2.3 Padres de P.O.O. 8

3. Programando em Java (Standalone x Applet) 11 3.1 Tipos de dados (primitivos ou referncias) 3.2 Operadores 3.3 Estruturas de controle. 3.4 Criando classes em Java (atributos, mtodos, construtores, garbage collection). 4. Modificadores de acesso (public, private, protected) 4.1 Nveis de Acesso 4.2 Outros modificadores (static, final, abstract). 5. Componentes (Swing x AWT) 5.1 Usando componentes swing. 5.2 Usando Layouts. 5.3 Listeners para os componentes. (interfaces, inner-classes) 6. Excees 6.1 Por que o tratamento de excees? 6.2 Como tratar execees ( uso do try, catch, finally ) 7. Manipulando Arquivos e Streams 7.1 Escrevendo e resgatando informaes de arquivos em Java. 7.2 Objetos em arquivos. 8. Applets 8.1 Como criar uma applet 8.2 Mtodos da classe JApplet (init, start, stop). 9. Threads 9.1 Multithreading (Como criar mltiplas threads). 9.2 Sincronizao de Threads. *** Ao final de cada tpico teremos os exemplos prticos e exerccios.*** 10. Bibliografia Java Legal! 43 2 29

31

34

37

39

41

3 1. Introduo ao Java. 1.1 Histria do Java Em 1991 a Sun MicroSystems acreditava que os dispositivos inteligentes (Palms, celulares, TVs e etc.) seria a prxima rea de grande destaque para a computao mundial, com isso a Sun financiou uma pesquisa denominada Green, esta pesquisa resultou no desenvolvimento de uma linguagem baseada em C e C++ que o seu criador James Gosling, chamou de Oak (carvalho) em homenagem uma arvore que dava para janela de seu escritrio. Mais tarde descobriu-se que j existia uma linguagem chamada Oak. Quando a equipe da Sun visitou uma cafeteria local, o nome Java (cidade de origem de um tipo de caf importado) foi sugerido e pegou. Mas o projeto Green estava em dificuldades, o mercado para os dispositivos inteligentes destinados ao consumidor final no tinha se desenvolvido rapidamente como a Sun imaginou, e ainda por cima perderam um contrato importante que estavam disputando com uma outra empresa. O projeto estava quase sendo cancelado quando surgiu a World Wide Web, o pessoal da Sun viu o potencial de utilizar Java para criar pginas da Web com contedo dinmico. Isso deu nova vida ao projeto. Em 1995 a Sun anunciou Java formalmente em uma conferncia, e imediatamente gerou interesse na comunidade internacional, pois permitia criar aplicativos Web, desenvolver aplicativos comerciais de grande porte e aplicativos para os dispositivos destinados ao consumidor final. 1.2 Java Hoje A tecnologia Java esta dividida em trs plataformas: >>J2EE Java 2 Enterprise Edition (JavaBeans, aplicativos comerciais e desenvolvimento de componentes, Servlets, JSP,...). >>J2SE Java 2 Standard Edition (Base da linguagem, desenvolvimento de aplicativos, applets...). >>J2ME Java 2 Micro Edition (dispositivos com pouca capacidade de memria, Midlets). 1.3 API Java Nossos programas em Java consistem de partes chamadas classes, que por sua vem contm partes chamadas mtodos que realizam tarefas e retornam informaes ao completarem suas tarefas. Voc pode programar cada pedao de seus programas em Java, mas a maioria dos programadores tira proveito das extensas bibliotecas de classes Java existente. Estas bibliotecas so tambm conhecidas como Java APIs (Aplication Programming Interfaces Interfaces de Programas Aplicativos). Portanto existem duas partes que devemos aprender no mundo Java. A primeira aprender a linguagem Java e a segunda tirar proveito das APIs existentes. 1.4 O que o Java tem de bom? E de ruim? Existe uma srie de fatores que fazem do Java um dos melhores ambientes de desenvolvimento existentes, um exemplo a Segurana. A poltica de segurana da linguagem impede os programadores de escrever cdigo malicioso. Tambm temos a facilidade do gerenciamento automtico de memria (Garbage Collection - Coletor de Lixo), tambm podemos especificar que tarefas podem ocorrer paralelamente usando as Java Legal! 3

4 tcnicas de Multithreading, o tratamento de erros (Exceptions) fica muito mais simples (e confivel), com Java fica muito mais fcil escrever aplicativos baseados em rede (o programador no precisa se preocupar com o baixo nvel). Esta foi a parte boa... vocs j devem ter ouvido coisas do tipo Java uma carroa ou Java multiplataforma. Estas afirmaes no so totalmente verdadeiras. Java lento porque uma linguagem interpretada (ao contrario de C e Pascal por exemplo que so compiladas), mas as novas maquinas virtuais esto diminuindo este problema e existem compiladores just-in-time (JIT Transforma o bytecode em cdigo de maquina em tempo de execuo). A Sun sempre afirma Write once, run anywhere, mas para quem j teve a experincia de programar em Java para Macintosh sabe que esta frase ficaria melhor assim: Write twice, run anywhere pois um programa escrito em Java que roda em Windows e Linux tem que ser ALTERADO para rodar em verses anteriores ao OS X do Macintosh (Possivelmente isto tenha mudado no OS X pois este sistema baseado em Linux). CARACTERSTICAS DA LINGUAGEM: Parecida com C, C++: Java tem a aparncia de C ou de C++, embora a filosofia da linguagem seja diferente. Por este motivo estaremos frequentemente fazendo comparaes alguma destas linguagens. O leitor que programa em qualquer uma delas, ou em uma linguagem orientada a objetos, se sentir mais a vontade e se tornar um bom programador Java em menos tempo. Java tambm possui caractersticas herdadas de muitas outras linguagens de programao: Objective-C, Smalltalk, Eiffel, Modula-3, etc. Muitas das caractersticas desta linguagem no so totalmente novas. Java uma feliz unio de tecnologias testadas por vrios centros de pesquisa e desenvolvimento de software. Compilada: Um programa em Java compilado para o chamado byte-code, que prximo as instrues de mquina, mas no de uma mquina real. O byte-code um cdigo de uma mquina virtual idealizada pelos criadores da linguagem. Por isso Java pode ser mais rpida do que se fosse simplesmente interpretada. Portvel: Java foi criada para ser portvel. O byte-code gerado pelo compilador para a sua aplicao especfica pode ser transportado entre plataformas distintas que suportam Java (Solaris 2.3, Windows-NT, Windows-95, Mac/Os etc) . No necessrio recompilar um programa para que ele rode numa mquina e sistema diferente, ao contrrio do que acontece por exemplo com programas escritos em C e outras linguagens. Esta portabilidade importante para a criao de aplicaes para a heterognea internet. Muitos d os programas exemplo deste tutorial foram escritos e compilados numa plataforma Windows-95 e rodaram perfeitamente quando simplesmente copiados para uma plataforma Solaris 2.3. Em Java um inteiro, por exemplo, tem sempre 32 bits, independentemente da arquitetura. O prprio compilador Java escrito em Java, de

Java Legal!

5 modo que ele portvel para qualquer sistema que possua o interpretador de bytecodes. Um exemplo de programa escrito em Java o browser hotjava. Orientada a Objetos: A portabilidade uma das caractersticas que se inclui nos objetivos almejados por uma linguagem orientada a objetos. Em Java ela foi obtida de maneira inovadora com relao ao grupo atual de linguagens orientadas a objetos. Java suporta herana, mas no herana mltipla. A ausncia de herana mltipla pode ser compensada pelo uso de herana e interfaces, onde uma classe herda o comportamento de sua superclasse alm de oferecer uma implementao para uma ou mais interfaces. Java permite a criao de classes abstratas. Outra caracterstica importante em linguagens orientadas a objetos a segurana. Dada a sua importncia o tpico foi escrito a parte. Segura: A presena de coleta automtica de lixo, evita erros comuns que os programadores cometem quando so obrigados a gerenciar diretamente a memria (C , C++, Pascal ). A eliminao do uso de ponteiros, em favor do uso de vetores, objetos e outras estruturas substitutivas traz benefcios em termos de segurana. O programador proibido de obter acesso a memria que no pertence ao seu programa. Estas medidas so particularmente teis quando pensarmos em aplicaes comerciais desenvolvidas para a internet. A presena de mecanismos de tratamento de excees torna as aplicaes mais robustas, no permitindo que elas abortem, mesmo quando rodando sob condies anormais. Suporta concorrncia: A linguagem permite a criao de maneira fcil, de vrios threads de execuo. Isto que dizer que voc pode dizer ao seu programa Java que varias tarefas vo ocorrer paralelamente. Existem algumas bibliotecas que implementam o funcionamento de threads em outras linguagens como C por exemplo, mas estas bibliotecas so dependentes de plataforma . Eficiente: Como Java foi criada para ser usada em computadores pequenos, ela exige pouco espao, pouca memria. Java muito mais eficiente que grande parte das linguagens de scripting existentes, embora seja cerca de 20 vezes mais lenta que C, o que no um marco definitivo. Com a evoluo da linguagem, sero criados geradores de byte-codes cada vez mais otimizados que traro as marcas de performance da linguagem mais prximas das de C++ e C. Alm disso, um dia Java permitir a possibilidade de gerar cdigo executvel de uma particular arquitetura on the fly, tudo a partir do byte-code.

Java Legal!

6 1.5 Ambiente Java Os programas Java passam por 5 fases antes de serem executados:

1.6 Ferramentas Abaixo segue a lista das ferramentas que iremos precisar para editar, compilar e executar nossos programas: J2SDK ( Java 2 Software Development Kit Verso 1.4.0 ou superior). Editor ( EditPlus ou Crimson ). Configurando o CLASSPATH Quando executamos um programa Java o SO precisa saber o local (PATH) da classe que estamos querendo executar, no Windows esta informao esta na varivel de ambiente CLASSPATH (normalmente definida no autoexec.bat). A questo do CLASSPATH gera muita confuso para quem est comeando a programar em Java, pois ns conseguimos compilar nossos programas, mas na hora da execuo ocorre a seguinte mensagem de erro: (OBS: supondo que estamos tentando executar Programa) Exception in thread "main" java.lang.NoClassDefFoundError: Programa Isso porque o programa java pergunta ao SO qual o caminho das classes (CLASSPATH), para eliminar este erro devemos acrescentar um ponto (.) ao nosso CLASSPATH. Este

Java Legal!

7 ponto informa ao SO que existem classes no diretrio atual (diretrio dos nossos arquivos .class). Configurando o EditPlus Selecione no menu Tools a opo Configure User Tools. >Para o compilador (javac.exe): Selecione Add Tool e em seguida Program. Na opo Command coloque o caminho do javac.exe (dentro da pasta do J2SDK). Em Argument escolha File Name. >Para o interpretador (java.exe): Siga o mesmo procedimento acima, mas colocando em Command o caminho do java.exe e em Argument escolhendo a opo File Name Without Extension.

Java Legal!

8 2. Reviso P.O.O. 2.1 O que uma classe? O que um objeto? A grosso modo uma classe uma frma a partir da qual podemos criar objetos, ou seja, um objeto no pode ser criado se no houver uma definio de classe existente. As classes incorporam todos os recursos de um conjunto de objetos em particular. Quando voc escreve um programa em uma linguagem orientada a objetos, no define objetos individuais. Em vez disso, voc define classes de objetos. Por exemplo, poderamos ter uma classe Tree descrevesse as caractersticas de todas as rvores: Possui folhas e razes. Cresce. Gera clorofila. A classe Tree serve como um modelo abstrato para o conceito de rvore, para ter um objeto que possa ser realmente ser tratado em um programa, voc deve ter uma instncia (objetos = instncias) concreta da classe Tree. A partir da classe Tree podemos criar vrios objetos Tree diferentes e cada um poderia ter caractersticas diferentes (ver figura):

As classes que escrevemos em Java possuem dois tipos de componentes: mtodos (comportamentos) e atributos. Os atributos so os elementos que nos permitem diferenciar classes de objetos e determinam forma, estado e qualidades desta classe, por exemplo a classe ProfessorDeComputao poderia incluir os seguintes atributos: Idade (qualquer valor entre 100 e 200). Especialidade (ADA, SO, BD, Nada...) Salrio Os atributos tambm podem indicar o estado de um objeto como, por exemplo, o estado de sade (vivo ou morto) e tendncias polticas (Malufista, Independente, caf-com-leite).

Java Legal!

9 Os mtodos (mais ou menos procedures e functions do Pascal) so grupos de instrues que realizam tarefas especficas. Os objetos se comunicam atravs de si usando mtodos. Uma classe ou um objeto pode chamar mtodos em uma outra classe ou objeto por muitas razes, como por exemplo: Para relatar uma alterao para outro objeto. Para pedir que outro objeto faa algo. 2.2 Herana e Polimorfismo. A herana representa um dos conceitos mais importantes na programao orientada a objetos e tem efeito direto sobre como voc projeta e escreve suas prprias classes Java. Herana um mecanismo que permite a uma classe herdar todo o comportamento e os atributos de outra classe.

(figura herana pg 51 java21). Uma subclasse a criao de uma nova classe que herda de outra j existente. A nica tarefa na subclasse indicar as diferenas no comportamento e nos atributos, entre ela e a superclasse. A funcionalidade comum a vrias classes pode ser colocada em superclasses, o que permite que ela seja usada repetidamente em todas as classes que estejam abaixo na hierarquia. As alteraes em uma superclasse so refletidas automaticamente em todas as suas subclasses, e nas subclasses destas etc. No h necessidade de mudar ou recompilar nenhuma das classes inferiores; elas recebem as novas informaes por herana. A forma da herana em Java e chamada herana simples, pois cada classe Java pode ter apenas uma superclasse (embora cada superclasse possa ter vrias subclasses). Em outras linguagens de programao orientada a objetos como C++, as classes possuem mais de uma superclasse, e elas herdam variveis e mtodos combinados de todas estas superclasses. Isso se chama herana mltipla e proporciona meios para se criar classes que abrangem praticamente todo comportamento que se possa imaginar. Entretanto, isso complica significativamente as definies da classes e o cdigo necessrio para produzi-las. A linguagem Java torna a herana mais fcil permitindo apenas herana simples. Java Legal! 9

10 O polimorfismo ( muitas formas ) a capacidade de objetos semelhantes terem comportamentos parecidos (???). Mas isto no parecido com Herana?? De fato muitos autores apresentam o Polimorfismo como sendo um tipo de Herana, mas em Java o Polimorfismo se manifesta nas chamadas de mtodos. Calma, no precisa ficar angustiado por no ter entendido, este um conceito que ser fixado quando j tivermos comeado a escrever nossas classes em Java. Por enquanto guarde que no Polimorfismo as classes tm comportamentos parecidos. Interfaces A herana simples torna os programas mais fceis de entender e projetar, entretanto isto pode ser restritivo. A linguagem Java contorna o problema do comportamento compartilhado por meio de interfaces. Uma interface um conjunto de mtodos que indica que uma classe possui um comportamento alm daquele herdado de suas superclasses. Uma Interface difere de uma classe pelo simples fato de que na classe ns temos as implementaes dos mtodos e na interface ns temos apenas as assinaturas destes mtodos (ou seja, seus cabealhos). Para no esquecer o que uma interface tente lembrar das units que voc escreve em Pascal, nelas existe uma rea chamada interface na qual voc coloca todos os cabealhos (assinaturas) de procedimentos e funes (Por isso as classes que implementam interfaces devem definir estes mtodos, ou seja, pensando em Pascal a parte implementation das units ficam nas classes). 2.3 Padres da Programao Orientada a Objetos. Antes de comearmos a escrever nossos programas em Java devemos conhecer o estilo da programao orientada a objetos isso torna nossos programas mais legveis e fceis de entender. Por definio todo identificador (nome) de classe em Java comea com letra maiscula e se caso precise de mais de um nome para identificar sua classe cada um destes nomes deve tambm comear com letra maiscula. Exemplo de uma definio de classe: class JogadorDeFutebol { ... } O padro para nomeao de mtodos e atributos (variveis) semelhante, apenas diferenciando o primeiro nome que deve sempre iniciar com uma letra minscula. Exemplos: int totalDeFuncionarios; public void atualizaSaldo( ... ) { ... } A medida que formos aprendendo novos conceitos da linguagem Java veremos mais padres de desenvolvimento. Ateno: Java case sensitive, ou seja, diferencia maisculas de minsculas. Portanto uma varivel casa deferente de CASA.

Java Legal!

10

11 3. Programando em Java. Existem duas categorias de programas Java os aplicativos (standalone) e os applets. A diferena que os applets so programas Java que executam em um browser. Vamos aprender a construir aplicativos standalone para depois construirmos nossos applets. Agora vamos iniciar nossa programao com um exemplo simples de um aplicativo que imprime uma linha de texto no vdeo. (exemplo HelloJava.java) Explicao passo a passo do programa exemplo: //Comentrio de uma linha Comentrios em Java seguem a mesma sintaxe de C++, // inicia uma linha de comentrio, todo o restante da linha ignorado. Existe tambm um outro tipo de comentrio formado por /* Insira aqui o texto a ser ignorado */ , este tipo de comentrio pode ser intercalado em uma linha de cdigo. Comentrios so tratados como espaos em branco. public class HelloJava { class a palavra reservada que marca o inicio da declarao de uma classe. public um especificador, por enquanto guarde public class como o incio da declarao de uma classe. Todas as classes sero declaradas assim at o tpico modificadores de acesso. HelloJava o nome dado a esta classe. O abre chaves marca o incio das declaraes da classe que so os atributos e mtodos. Esta classe s possui uma declarao, a do mtodo main, note que um mtodo, ao contrrio de C++, s pode ser declarado {internamente} a classe a qual pertence, evitando as confuses sobre escopo. Desta forma, todo pedao de cdigo em Java deve pertencer ao abre chaves, fecha chaves da definio de uma classe. public static void main (String args[]) { System.out.println("Java Legal!"); } public um qualificador do mtodo que indica que este acessvel externamente a esta classe (para outras classes que eventualmente seriam criadas), no se preocupe com ele agora, apenas declare todos os mtodos como public. Voltaremos a este assunto quando estivermos falando em modificadores de acesso. static um outro qualificador ou specifier, que indica que o mtodo deve ser compartilhado por todos os objetos que so criados a partir desta classe. Os mtodos static podem ser invocados, mesmo quando no foi criado nenhum objeto para a classe, para tal deve-se seguir a sintaxe: <NomeClasse>.<NomeMetodoStatic>(argumentos);. Retornaremos a esta explicao mais tarde, por hora voc precisa saber que

Java Legal!

11

12 particularmente o mtodo main precisa ter essa qualificao porque ele chamado sem que se crie nenhum objeto de sua classe (a classe HelloJava). void Semelhante ao void C++ ou C, o valor de retorno da funo, quando a funo no retorna nenhum valor ela retorna void, uma espcie de valor vazio que tem que ser especificado. main Este um nome particular de mtodo que indica para o compilador o incio do programa, dentro deste mtodo e atravs das iteraes entre os atributos, variveis e argumentos visveis nele que o programa se desenvolve. (String args[]) o argumento de main e por conseqncia do programa todo, ele um vetor de Strings que formado quando so passados ou no argumentos atravs da invocao do nome do programa na linha de comando do sistema operacional, exemplo: java HelloJava argumentotexto1 argumentotexto2 No nosso caso, ignoramos a possvel passagem de argumentos via linha de comando, retornaremos a este assunto mais tarde. { ... } Abre chaves e fecha chaves. Para quem no conhece C ou C++, eles podem ser entendidos como algo semelhante ao BEGIN END de Pascal ou Modula-3, ou seja: delimitam um bloco de cdigo. Os programadores Pascal notaro que variveis locais dos mtodos podem ser declaradas em qualquer local entre as chaves. Mas por motivos de clareza do cdigo declararemos todas no incio do abre chaves. System.out.println("Java Legal!"); Chamada do mtodo println para o atributo out da classe ou objeto System, o argumento uma constante do tipo String. println assim como writeln de Pascal, imprime a String e posiciona o cursor na linha abaixo , analogamente print no avana linha. Por hora voc pode guardar esta linha de cdigo como o comando para imprimir mensagens na tela, onde o argumento que vem entre aspas a String a ser impressa. O ; ponto e vrgula separa operaes. } Finalmente o fecha chaves termina com a declarao da classe HelloJava. No exemplo HelloJava no criamos nenhum objeto, o que no muito til de se fazer em uma classe principal, agora vamos realmente comear a entender porque devemos criar objetos que sejam teis para nosso programas. Vamos dar uma olhada no programa Circulo.

Java Legal!

12

13 3.1 Tipos de Dados. Todas as variveis em Java precisam ter um tipo de dado. Podem existir duas categorias 1. Primitivas. 2. Referncias. Uma varivel de tipo primitivo pode assumir um valor nico de acordo com o tamanho apropriado e formato para este tipo primitivo. Tipos primitivos de dados. Keyword Description (integers) byte short int long Byte-length integer Short integer Integer Long integer (real numbers) float double Single-precision floating point 32-bit IEEE 754 8-bit two's complement 16-bit two's complement 32-bit two's complement 64-bit two's complement Size/Format

Double-precision floating point 64-bit IEEE 754 (other types)

char boolean

A single character A boolean value (true or false)

16-bit Unicode character true or false

Arrays, classes e interfaces so tipos de referncias (ou seja, um apontador, ou um endereo ). Exemplo:

Importante: Ao contrario de outras linguagens Java no permite a especificao de passagem de variveis por referncia ou valor. Por definio todas as variveis de tipos primitivos so passadas por valor e somente os objetos ( arrays so considerados objetos em Java ) so passados por referncia.

Java Legal!

13

14 Nomes de Variveis: Precisam ser identificadores legais comeados por uma letra, sublinhado ( _ ) ou $. No podem ser palavras reservadas da linguagem Java. Lista de Palavras reservadas. abstract boolean break byte case catch char class const * double else extends final finally float for goto * if int interface long native new package private strictfp ** super switch synchronized this throw throws

protected transient public try void volatile while

continue implements return default do import instanceof short static

* indica uma palavra reservada que no atualmente usada. ** palavra que foi adicionada pelo Java 2 Tipos de dados Referncias. Tipos de dados no primitivos em Java so sempre manipulados por sua referncia, ou seja, o endereo do objeto ou array armazenado em uma varivel, por comparao, tipos primitivos de dados armazenam no um endereo, mas um valor de seu tipo primitivo de dado. Devido ao fato de dos objetos serem manipulados atravs de suas referncias, podemos ter duas variveis referenciando o mesmo objeto (ou endereo). Exemplo: Button p, q; p = new Button(); q = p; p.setLabel("Ok"); p... Java Legal! // p referencia um objeto Button. // q referencia o mesmo Button. // Uma mudana no Objeto atravs de

14

15 String s = q.getLabel(); // ... visvel atravs de q. // s agora contm "Ok. Mas isto no verdade para tipos primitivos: int i = 3; int j = i; i = 2; // // // // i contem o valor 3. j contem uma copia do valor em i. Mudana em i no altera j. Agora, i == 2 e j == 3.

Apesar de Java manipular objetos por referncia, isto no totalmente verdade, para mtodos as referncias so passadas por valor. (Ateno isto muito importante). Estamos acostumados a dizer que uma referencia para uma varivel passada para um mtodo, o que no verdade, Java no trabalha desta maneira. Por exemplo o cdigo abaixo no tem o efeito de swap desejado: public void swap(Object a, Object b) { Object temp = a; a = b; b = temp; } Com o cdigo acima somente dentro do mtodo swap teramos o efeito de troca desejado, isto porque os parmetros do mtodo contm apenas as referncias para os objetos, ou seja, uma cpia destes valores. Ento a terminologia correta para o uso de passagem por referncia em Java seria: Java manipula objetos por referncia, mas passa a referncia destes objetos por valor para os mtodos (O problema acima resolvido utilizando o mtodo clone() da classe Object). Copiando Objetos Pela razo dos tipos referncias no serem passados por valor, atribuir um objeto a outro em Java no faz a copia deste objeto, Java apenas atribui a referncia a este objeto. Considere o trecho de cdigo: Button a = new Button("Okay"); Button b = new Button("Cancel"); a = b; Aps a execuo destas linhas, a varivel a contem a referncia para o objeto que b tambm referencia. O objeto que a referenciava foi perdido. A cpia dos dados de um objeto para outro objeto pode ser feita usando-se o mtodo clone( ): Vector b = new Vector; c = b.clone(); Com isso, a varivel c faz referencia a um objeto que cpia de um outro objeto referenciado por b. Java Legal! 15

16 importante notar que nem todos os tipos suportam o mtodo clone( ). Apenas as classes que implementam a interface Cloneable podem ser clonadas. (Ver java.lang.Cloneable e java.lang.Object.clone( ) ); Arrays tambm so tipos de referncia (objetos), e atribuindo um array para outro apenas copia sua referencia. Para copiar os valores armazenados em um array, deve-se atribuir cada elemento do array individualmente ou usando o mtodo System.arraycopy( ). Checando igualdade dos objetos. Uma outra implicao da passagem por referencia, que o teste com o operador = = s retorna true quando duas variveis fazem referencia ao mesmo objeto, e no quando possuem o mesmo valor. Para testar se dois objetos so iguais deve-se usar mtodos especiais. Como por exemplo, strcmp( ) para duas strings. Em Java vrias classes implementam o mtodo equals( ) que tambm pode ser usado para comparao. Escopo de variveis: O escopo da varivel a regio do programa onde esta varivel pode ser referenciada. Exemplo: puclic class Escopo { int variavel; //varivel de instncia ou de classe public void metodo1() { int variavel; //varivel local ou de bloco. ... } ... } Variveis de instncia podem ser referenciadas em qualquer parte do programa, ao passo que variveis locais s podem ser referenciadas no bloco onde foram declaradas. Java permite criar variveis dentro de blocos de comando como if, else, do/while, e etc. Usando a classe Escopo como exemplo se quisermos utilizar a varivel de classe dentro do mtodo metodo1 devemos utilizar a palavra chave this (s utilizar this para identificadores com mesmo nome). Exemplo: public void metodo1() { int variavel; //varivel local ou de bloco. //varivel da classe recebendo valor da varivel local. this.varivel = variavel } this:

Java Legal!

16

17 this uma palavra chave usada num mtodo como referncia para o objeto corrente, ela tem o significado de: o objeto para o qual este trecho de cdigo est sendo executado. Suponha uma classe que possui a seguinte declarao de atributo: int qualquer; Se quisermos em um mtodo desta classe alterar o atributo qualquer para o valor 3, basta escrever qualquer=3; , mas este cdigo escrito dentro de um mtodo da classe que declara qualquer, totalmente equivalente a this.qualquer=3; , sendo o ltimo uma opo mais clara e capaz de eliminar ambigidades entre os nomes dos atributos de uma classe e os nomes dos argumentos de um dos mtodos desta (quando estes nomes forem iguais). O uso de this tambm vlido fazer para chamadas de mtodos para o objeto corrente.

Java Legal!

17

18 3.2 Operadores Os operadores Java so idnticos aos operadores de C e C++ abaixo segue a tabela de operadores. Os operadores so mostrados na ordem decrescente de precedncia, de cima para baixo. Operadores () [] . ++ -++ -+ ! ~ ( tipo ) * / % + << >> >>> < <= > >= instanceof == != & ^ | && || ?: Associatividade Da esquerda para direita Tipo Parnteses Subscrito de array Seleo de membro Da direita para esquerda Ps-incremento unrio Ps-decremento unrio Da direita para esquerda Pr-incremento unrio Pr-decremento unrio Mais unrio Menos unrio Negao lgica unria Complemento unrio sobre bits Coero (type casting) Da esquerda para direita Multiplicao Diviso Mdulo Da esquerda para direita Adio Subtrao Da esquerda para direita Deslocamento de bit para esquerda Deslocamento de bit para direita com extenso de sinal Deslocamento de bit para direita com extenso de zeros Relacional menor que Relacional maior ou igual a Relacional maior que Relacional maior ou igual a Comparao de tipo Da esquerda para direita Relacional igual a Relacional no igual a Da esquerda para direita E sobre bits Da esquerda para direita OU exclusivo sobre bits OU exclusivo lgico booleano Da esquerda para direita OU inclusivo sobre bits OU inclusivo lgico booleano Da esquerda para direita E lgico Da esquerda para direita OU lgico Da direita para esquerda Ternrio condicional Tabela de Operadores Java.

Java Legal!

18

19 = += -= *= /= %= &= ^= |= <<= >>= >>>= Atribuio Atribuio e adio Atribuio e subtrao Atribuio e multiplicao Atribuio e diviso Da direita para esquerda Atribuio e mdulo Atribuio E sobre bits Atribuio OU exclusiva sobre bits Atribuio OU inclusiva sobre bits Atribuio de deslocamento para esquerda Atribuio de deslocamento para direita com extenso de sinal Atribuio de deslocamento para direita com extenso de zeros. Tabela de Operadores Java (continuao).

Exemplos do Uso de Operadores.

Java Legal!

19

20 3.3 Estruturas de Controle Aqui vamos tratar os blocos de construo que so essenciais para a construo de programas estruturados. As estruturas de controle nos ajudam a definir o quais instrues devem ser executadas levando em considerao uma determinada condio, basicamente estas estruturas transferem o fluxo de execuo. Durante a dcada de 1960, tornou-se clara que a utilizao indiscriminada da estruturas de controle eram a fonte de muitos grupos de desenvolvimento de software. E toda a culpa foi para o goto (o mesmo do Pascal, C, Basic,...) que permite desviar o controle para uma ampla variedade de destinos possveis em um programa. A noo da programao estruturada tornou-se Eliminem o goto. Java no tem instruo goto, mas esta uma palavra reservada e no pode ser usada em programas Java. Java fornece trs tipos de estruturas de seleo; A estrutura de seleo if executa (seleciona) uma ao se uma condio for verdadeira e pula a ao se for falsa. A estrutura de seleo if / else executa uma ao de uma condio for verdadeira e executa uma ao diferente se a condio for falsa. A estrutura de seleo switch executa apenas uma de muitas aes diferentes, dependendo do valor de uma expresso. if : Sintaxe:
if ( condio ) commando; ( condio ) { comando1; comando2;

Ou:
if

Importante: Os parnteses em torno da condio so obrigatrios para todas as estruturas de controle. if / else: Sintaxe:
if ( condio ) comando1; //; obrigatrio else comando2;

Ou:
if ( condio ) { comando1; comando2; ... } else { comando3; ... }

Java Legal!

20

21

Ou: if ( condio ) comando1; else if ( condio ) comando2; else ( condio ) comando3; Importante: O comando else sempre se refere ao ltimo if do mesmo escopo. switch: Sintaxe:
switch ( varivel ) { case VALOR1: comando1; comando3; case VALOR2: comando2; case VALORN: comandoN default : comandoX; }

Importante: O switch pula os cases at encontrar a condio varivel = VALORN. Quando o switch encontra o valor ele continua a executar todos os outros cases abaixo, para evitar que o switch continue a executar comandos devemos quebrar a execuo usando break. Obs: A clausula default opcional, se nenhum case for encontrado ento os comandos aps default so executados, default tambm pode ser executado se o case anterior no tiver um break. break (dentro do switch): Sintaxe:
switch ( varivel ) { case VALOR1: comando1; break; //cai for a do switch case VALOR2: comando2; break; default: comandoN; }

Vimos as estruturas de seleo, agora vamos aprender as estruturas de repetio em Java. Java tambm oferece trs estruturas de repeties: O lao while verifica se uma condio for verdadeira, se sim ento ele executa os comandos dentro do seu escopo, caso contrrio o loop terminado. O lao do / while executa os comandos de seu escopo enquanto uma condio for verdadeira, se falsa cai fora do loop. A diferena bsica entre um lao while e um lao do / while que no do / while os comandos vo ser executados pelo menos uma vez, ao passo que no lao while dependendo da condio inicial os comandosd no chegaro a ser executados. Aps os exemplos das estruturas veremos que os dois laos citados anteriormente necessitam de uma sentinela ou contador para que a condio de parada seja satisfeita, e indo mais alm temos que criar estas variveis antes 21

Java Legal!

22 dos laos. A estrutura for cuida de todos estes detalhes pois fornece espao para que o programador possa criar variveis (que s vo ser validas dentro do escopo do for), definir a condio de parada e estipular qual ser o critrio de incremento. while: Sintaxe:
while ( condio ) comando;

Ou:
while ( condio ) { comando1; comando2; }

do / while: Sintaxe:
do comando; while ( condiao );

Ou:
do { comando1; comando2; } while ( condio );

for: Sintaxe: for ( expresso1; expresso2; expresso3 ) comando; Ou:

for ( expresso1; expresso2; expresso3 ) { comando1; comando2; ... } Onde: expresso1 onde iniciamos variveis de controle do lao for. Exemplo: int ndice = 0. expresso2 a condio de parada do lao. Exemplo: ndice < SIZE. expresso3 o incremento do lao. Exemplo: ndice += 2; Importante: Todas os parmetros (expresses 1, 2 e 3) da estrutura for podem ser omitidos. Caso a expresso de condio de parada seja omitida devemos parar o lao for usando break. Um break em uma lao faz com que a prxima instruo aps (fora do lao) o lao seja executada e qualquer cdigo que estiver dentro do lao e depois do break ser ignorado. Assim como o break altera o fluxo de controle de um programa a instruo continue tambm faz o mesmo mas de um modo diferente. Ambas instrues s podem ser usadas dentro de estruturas de repetio, com exceo do break que como j vimos pode aparecer dentro de um switch.

Java Legal!

22

23 Como j foi dito uma instruo break quando executada dentro de um estrutura while, do / while, for ou switch, causa a sada imediata dessa estrutura. A execuo continua com a primeira instruo depois da estrutura. Utilizaes comuns da instruo break so escapar no comeo de um lao ou pular o restante de uma estrutura switch. A instruo continue, quando executada dentro de uma estrutura while, do / while ou for, pula as instrues restantes do corpo do lao e prossegue com a prxima iterao do lao. Nas estruturas while e do / while, o programa avalia o teste de continuao do lao imediatamente depois da instruo continue ser executada. Em estruturas for, a expresso de incremento realizada e depois o programa testa a condio de continuidade do lao. Instrues break e continue rotuladas. A instruo break pode apenas interromper a estrutura que a envolve imediatamente. Para interromper um conjunto de aninhado de estruturas, podemos utilizar a instruo rotulada break. Essa instruo quando executada em uma das estruturas de repetio ou switch, ocasiona a sada imediata dessa estruturas e de um numero qualquer de estruturas de repetio que a envolvem, a execuo do programa prossegue com a primeira instruo aps o bloco rotulado. A instruo continue rotulada, quando executada em uma das estruturas de repetio pula as instrues restantes do corpo do dessa estrutura e de qualquer numero de estruturas de repetio que a envolvem e prossegue com a prxima iterao da estrutura de repetio rotulada que a envolve. 3.4 Criando Classes em Java Agora vamos realmente de fato comear com a programao orientada a objetos. A unidade central da programao orientada a objetos a classe (Java no tem nada parecido com o record do Pascal ou struct do C. Na verdade as nossas classes que representam estas estruturas). Todos os programadores de linguagens orientadas a objetos se concentram em escrever classes que forneam atributos e comportamentos bem definidos e se possvel escrever esta classe para que outros programadores possam tirar proveito. O ponto central da programao orientada a objetos a reutilizao de cdigo, Java possui uma extensa API, a qual tiramos proveito ao escrever nossos aplicativos Java. Em Java ns nunca comeamos a escrever nossas classes do zero. Todos as classes em Java herdam da classes Object (pacote java.lang ) a no ser que especificado de outra maneira. Como j vimos no comeo deste capitulo um classe em Java definida com a palavra reservada class (Nota: Comeamos com public, porque ainda no vimos os modificadores de acesso) seguida do nome da nossa classe. Definio genrica de uma classe:
[modificador de acesso] class NomeDaClasse { ... }

As chaves indicam onde comea e onde termina nossa classe e so obrigatrias. Note que esta classe genrica uma subclasse de Object isso significa que nossa classe vai herdar mtodos e atributos da classe Object. Mas caso queiramos que a nossa classe seja descendente de alguma outra classe que no seja Objetc, o que devemos fazer?

Java Legal!

23

24 Para especificar que nossa classe deve herdar de outra, devemos logo aps o nome da classe informar de qual classe vamos herdar, fazemos isso atravs da palavra reservada extends. Exemplo de herana:
[modificador de ... ... } acesso] class NomeDaClasse extends ClassePai{

Quando fazemos isso estamos dizendo que a classe NomeDaClasse uma subclasse de ClassePai ou que NomeDaClasse herda de ClassePai. Isso significa que NomeDaClasse vai herdar todos os atributos e mtodos de ClassePai. Mas por que utilizamos herana? Utilizamos herana para tornar a ClassePai mais especifica ou para adicionar novos comportamentos. Mas apenas utilizar a palavra reservada extends no garante que iremos conseguir compilar nossas classes. A API Java est toda dividida em pacotes (packages), quando utilizamos objetos em nossos programas Java devemos informar qual pacote est a classe que define tal objeto. Por default o pacote java.lang importado implicitamente em todos os nossos programas Java, isso faz sentido, uma vez que todas as classes Java herdam de Object por default e a classe Object faz parte do pacote java.lang. Para importar nossas classes usamos a palavra reservada import seguida do nome pacote que queremos importar. Todas as instrues import devem vir antes da definio da classe. Exemplo, importando a classe JButton do pacote javax.swing: import javax.swing.JButton; class TesteImporta { JButton b = new JButton( Um Boto ); } Se quisermos importar vrias classes de um mesmo pacote ao invs de escrever varias instrues import podemos usar o * aps o nome do pacote. Nota: usar * aps o nome do pacote em uma instruo import no significa que todas as classes sero importadas, somente aquelas classes que so mencionadas no nosso programa Java sero importadas. Como j sabemos como declarar nossas classes agora vamos a parte mais interessante que o que aparece dentro de uma classe. Agora vamos aprender a definir atributos e comportamentos para nossas classes. Entenda atributos como variveis em POO as variveis globais so chamadas de variveis de classe ou de instncia. Os comportamentos so denominados mtodos. Normalmente as classes oferecem mtodos que operam em cima dos atributos. No prximo capitulo veremos porque crucial que apenas os mtodos fornecidos pelo programador possam acessar os atributos. Atributos de uma classe Os atributos (variveis) de uma classe podem ser de um dos tipos primitivos, pode ser uma referncia para um objeto ou pode ser um array. Deixamos para falar sobre arrays aqui pois um tipo de dado especial. Para declarar uma varivel dentro da nossa classe devemos fazer: [modificador de acesso] TIPO nomeDaVariavel; Java permite que as variveis tenham um valor atribudo logo em sua declarao como mostra o exemplo abaixo: Java Legal! 24

25 [modificador de acesso] TIPO nomeDaVariavel = VALOR;

Arrays Os arrays em Java funcionam parecidos com os arrays em C e C++, na verdade apenas o modo de declarar e acessar os arrays que so parecidos. Como j foi citado anteriormente os arrays so considerados objetos em Java, e todo o array em Java conhece seu prprio tamanho (atravs da varivel de instncia e palavra reservada length), portanto merecem uma ateno especial. Um array um grupo de posies contguas na memria que possuem o mesmo nome e o mesmo tipo. Para referir-se a uma localizao ou elemento particular no array, especificamos o nome do array e o nmero da posio (ou ndice) do elemento particular do array. Os arrays como em qualquer outra linguagem precisam ter um tipo de dado associado. Modos de se declarar um array:
TIPO nomeDoArray[ ]; TIPO[ ] array1, array2, ..., arrayN;

No se pode informar o tamanho do array na sua declarao, um erro de sintaxe. Isto feito na instanciao (alocao de espao) do array. Basicamente existem trs forma de se instanciar um array:
TIPO nomeDoArray[ ] = new TIPO[ tamanhoDoArray ]; TIPO nomeDoArray[ ] = new TIPO[ ] { valor1, valor2, ...,valorN }; TIPO nomeDoArray[ ] = { valor1, valor2, ...,valorN };

Importante: Diferente do Pascal, Java no permite que o programador especifique qual vai ser a faixa dos ndices do vetor. Por definio todo ndice de array comea no ZERO. No primeiro exemplo acima temos um array de tamanhoDoArray posies, mas os elemento so acessados na faixa de 0 a tamanhoDoArray-1. Tentar acessar um elemento fora desta faixa causa um erro de execuo. Na primeira forma de alocao apenas estamos dizendo ao compilador para alocar o espao para o nosso array, nas duas ultimas formas no precisamos informar qual o tamanho do nosso array, ele ser definido pela lista de valores que esto entre chaves e separados por virgulas. Cada posio do nosso array j contem um valor. Para sabermos qual o tamanho do nosso array s acessar a varivel inteira length da seguinte maneira:
nomeDoArray.length

(Exemplos) Arrays multidimensionais Os arrays citados at agora tinham apenas uma dimenso, ou seja, eram vetores. Para declarar que um array deve ter mais de uma dimenso apenas acrescentamos outro(s) par(es) de colchetes nas declaraes do array. Exemplos: TIPO nomeDoArray[ ][ ]; TIPO nomeDoArray[ ][ ] = new TIPO[ nroDeLinhas ][ nroDeColunas ];

Java Legal!

25

26 Uma das caractersticas importantes de arrays multidimensionais que os subarrays podem ter dimenses diferentes. Isso torna a alocao mais eficiente pois permite ao programador instanciar exatamente a quantidade de elementos que precisa. Exemplo:
int array[ ][ ] = { {1, 2, 3, 4, 5}, {1, 2, 3}, {1,2} };

O trecho de cdigo acima nos da um array bidimensional (uma matriz) com trs linhas (lembre-se que nesse tipo de inicializao voc no precisa indicar qual a dimenso do array, o compilador faz isso para voc contando os elementos na lista). Note que cada linha tem comprimentos diferentes. Mas como saber qual o comprimento de cada linha? Atravs do j conhecido length. Para o exemplo anterior teramos: array[ 0 ].length = = 5. array[ 1 ].length = = 3. array[ 2 ].length = = 2. Inicializao automtica de Variveis. Em Java as variveis de classe e objetos tem sua inicializao automtica isto significa que logo quando so declaradas estas variveis j tem valores atribudos automaticamente por default estes valores esto representados na tabela abaixo: byte 0 short 0 int 0 long 0L float 0F double 0D Boolean false Char \u0000 Objetos null Dentro de mtodos e outros blocos sempre se deve iniciar uma varivel ou o compilador ir apresentar uma mensagem de erro. Exemplo: Erro gerado ao compilar o Arquivo TesteVar.java
TesteVar.java:7: variable variavel might initialized System.out.println("Valor " + variavel); ^ 1 error. not have been

Inicializao automtica de arrays. Quando alocamos memria para arrays (ou seja, instanciamos este array) todos os campos deste array vo ser iniciados automaticamente de acordo com o tipo especificado, independente do array ser varivel de classe ou local. Ou seja, quando fazemos: int vetor[ ] = new int[ 10 ];

Java Legal!

26

27 Estamos instanciando um array de inteiros com dez posies, e todas as posies deste array j esto preenchidos com o valor 0 (zero) por default, Analogamente se fizermos: Button vetorDeBotoes[ ] = new Button[ 5 ]; Vamos estar alocando para o vetorDeBotoes o espao para 5 objetos do tipo Button, note que os elementos do array ( vetorDeBotoes[ i ], i=1,2,3,4,5 ) no foram instanciados mas tm por default o valor null. Importante: Antes de usarmos o operador new para instanciar os arrays (as referncias) esto com o valor null. Se tentarmos exibir um elemento de um array que ainda no foi instanciado teremos uma NullPointerException. Mtodos de um classe Os mtodos determinam o comportamento dos objetos de um classe. Quando um mtodo invocado, se diz que o objeto est recebendo uma mensagem (para executar uma ao). Programas complexos formam conjuntos de objetos que trocam mensagens entre si gerenciando inclusive os recursos do sistema. A seguir temos a maneira de declarao de mtodos em Java: [modificador de acesso] [tipo de retorno] nomeDoMtodo( lista de parmetros ) { ... ... } O programa a seguir exemplifica chamadas de mtodos, para tal define um objeto que serve como contador, a implementao representa a contagem no atributo num que um nmero inteiro. Os mtodos so simples: incrementa adiciona um ao contador em qualquer estado e comea inicializa a contagem em zero. Decrementa faz o oposto de incrementa. (Exemplo Contador.java e TesteContador.java) Nos exemplos acima nossos mtodos no retornavam nenhum valor, ou seja, tinham tipo de retorno void. Os mtodos podem ter qualquer tipo de retorno inclusive objetos. Diferente de Pascal, Java permite que o programador escreva mtodos com nomes iguais desde que as listas de parmetros destes mtodos sejam diferentes. Isto se chama sobrecarga de mtodos (ou Overloading). Java diferencia os mtodos atravs de seus nomes e listas de parmetros. Quando definimos que nosso mtodo tem um tipo de retorno diferente de void ele obrigatoriamente deve devolver um valor atravs da palavra chave return VALOR. Omitir o tipo de valor retorno em uma definio de mtodo um erro de sintaxe. Retornar um valor de um mtodo cujo tipo foi definido como void um erro de sintaxe. Declarar parmetros de mtodos do mesmo tipo como float x, y em vez de float x, float y um erro de sintaxe porque so exigidos tipos diferentes de para cada parmetro da lista de parmetros. Redefinir um parmetro de um mtodo dentro do corpo do mtodo um erro de sintaxe. Passar para um mtodo um argumento que no compatvel com o tipo do parmetro da lista de parmetros um erro de sintaxe. Definir um mtodo dentro de outro mtodo um erro de sintaxe. 27

Java Legal!

28

Construtores de classes Construtores so mtodos especiais chamados pelo sistema no momento da criao de um objeto. Eles no possuem valor de retorno, porque voc no pode chamar um construtor para um objeto, voc s usa o construtor no momento da inicializao do objeto. Construtores representam uma oportunidade de inicializar seus dados de forma organizada, imagine se voc esquece de inicializar corretamente ou o faz duas vezes, etc. Um construtor tem sempre o mesmo nome da classe a qual pertence. Para a classe String, pr-definida na linguagem o construtor tem a forma String( Constante do tipo String ); com o argumento entre aspas que especificado pelo programador. Ele seria chamado automaticamente no momento da criao, declarao de uma String, sem necessidade de uso do nome do construtor como mtodo, apenas dos argumentos: String a; a = new String( Texto ); //alocacao e inicializacao atraves do construtor a.mostra(); //mostra so pode ser chamada depois do construtor Nos exemplos anteriores tambm usvamos construtores no momento de inicializar nossos objetos, s que eles no possuam argumentos. Para no esquecer: A grosso modo o construtor um mtodo que somente chamado na alocao de um objeto (quando usamos new). Garbage Collection Em Java no problema do programador se preocupar com a memria que foi alocada pelos seu objetos. Java implementa o coletor de lixo automtico que verifica se existe alguma referencia para um objeto na memria, caso no exista este objeto marcado para a coleta de lixo. Existe um mtodo na classe System (System.gc( )) que faz uma chamada explicita ao coletor de lixo, mas no garantido que o coletor de lixo vai ser executado exatamente aps a chamada deste mtodo, isto porque o coletor uma thread de background, ou seja s executa quando a CPU esta ociosa. Ou seja, o coletor de lixo Java no pode ser forado. Falaremos mais do coletor de lixo quando estivermos no capitulo 9. 3.5 Exemplos

Java Legal!

28

29 4. Modificadores de acesso Neste capitulo vamos compreender a importncia dos modificadores de acesso (public, protected e private). Primeiramente estes modificadores so cruciais para uma boa engenharia de software pois torna acessvel apenas parte do cdigo das nossas classes. (Obs: Os modificadores so palavras reservadas) public: Este modificador indica que o membro acessvel para todas as classes de qualquer pacote. (Acessvel para o mundo). Este modificador e mais comumente usado para mtodos e classes. Uma classe public indica que ela pode ser instanciada por qualquer objeto (dentro de qualquer outra classe). Os mtodos e atributos declarados como public podem ser acessados por qualquer objeto dessa classe. private: Este modificador implica no nvel mais alto de restrio de acesso pois os membros private s podem ser acessados dentro da prpria classe. Usamos private para atributos, mtodos e inner-classes (capitulo 5). Usar private na definio da classe principal um erro de sintaxe. lgico que quando definimos algum membro como private dentro de uma classe, devemos tambm fornecer membros public para o acesso a estes membros, caso contrario os membros private ficam inacessveis!! protected: O modificador protected define um nvel de acesso intermedirio a public e private. Membros declarados como protected s podem ser acessados dentro da classe, por subclasses e classes do mesmo pacote. O modificador protected s pode ser usado em mtodos e atributos. Voc com certeza deve estar se perguntando agora: Se eu s posso utilizar o modificador public nas classes por que sempre tenho que usa-lo? Todas as minhas classes no sero public por default? A resposta simples: public no default do Java, quando no definimos nenhum modificador de acesso, o acesso feito por pacote. Ento existe mais um modificador de acesso? Sim. Qual ? No tem nome. Isso mesmo, o modificador que na verdade no um modificador tem acesso por pacote. Evite ao mximo no especificar modificadores de acesso em seus programas, isto pode evitar vrios bugs. 4.1 Nveis de acesso Podemos dizer que o Java suporta quatro nveis de acesso: Especificador private protected public package classe X X X X subclasse X X package X X X mundo X

4.2 Outros modificadores (final, static e abstract) Existem outros modificadores mas no so chamados de modificadores de acesso, mas nem por isso deixam de ser menos importantes. Neste bloco iremos saber como declarar constantes em Java, como proibir que nossas classes sejam herdadas por outra. Vamos ver tambm como criar classes abstratas e porque criar tais classes. E vamos aprender como funcionam os membros estticos.

Java Legal!

29

30 final: A palavra reservada final ante de classes especifica que a classe em questo no pode ser mais herdada. Basicamente fazemos isso quando a classe declarada como final j o mais especfico possvel que no faz sentido entend-la. Apenas uma pequena parte das classes da API Java so do tipo final. Quando queremos declarar constantes em Java utilizamos final antes de atributos. As constantes no so iniciadas automaticamente como as outras variveis em Java, as constantes devem ser inicializadas no momento de sua criao ou devem ser inicalizadas dentro de cada construtor da classe onde so declaradas. Somente classes e atributos podem ser declarados como final. abstract: O modificador abstract indica que uma classe deve ser abstrata ou seja, esta classe vai definir mtodos, ou melhor, vai definir os cabealhos dos mtodos. Todos os mtodos que no so implementados devem ser declarados abstract e como conseqncia uma classe que possui mtodos abstract deve ser declarada abstract tambm. O propsito de criar classes abstract que definimos que uma classe que herda de outra classe abstract deve implementar todos os mtodos declarados abstract na sua superclasse caso contrrio deve ser declarada abstract tambm, declarar classes abstract garante que pelo menos uma subclasse deve implementar os mtodos abstract isso permite definir comportamentos para subclasses. Importante: classes abstratas no podem ser instanciadas!!! Somente classes e mtodos podem ser declarados abstratos. static: O modificador static indica que todos os objetos instanciados tem apenas uma cpia deste atributo, ou seja todos os objetos apontam para o mesmo membro static. Os membros static esto disponveis antes mesmo de qualquer objeto ser instanciado. Para acessar os membros static temos duas opes uma atravs do nome da classe seguido pelo nome do membro static, a outra atravs de qualquer referncia para um objeto da classe que contm membros static seguido pelo nome do membro static. Apenas atributos e mtodos podem ser declarados static.

Importante: Sempre que possvel defina os atributos de sua classe como private e fornea mtodos public get e set para acess-los, isso torna nossas classes menos sujeitas a erros e usurios mal intencionados. Eficincia: Algum pode argumentar que programas que usam muitas chamadas de mtodos podem se tornar pouco eficientes e que poderia ser melhor obter acesso direto aos dados de um tipo definido pelo usurio ao invs de passar por todo o trabalho de cpia de argumentos, insero de funo na pilha, etc. Em verdade no se perde muito em eficincia, por que tal metodologia de programao nos leva a organizar o cdigo de maneira mais compacta. E alm disso muitas vezes no se deseja permitir sempre o acesso direto aos dados de um tipo definido pelo usurio por razes de segurana. 4.3 Exemplos

Java Legal!

30

31 5. Componentes (Swing x AWT) Neste capitulo vamos aprender como criar aplicativos que utilizam as classes dos pacotes que contm componentes de GUI (Graphics User Interface Interface Grfica com o Usurio). Somente iremos utilizar componentes Swing em nossos aplicativos por diversas razes. A principal que os componentes Swing so escritos totalmente em Java ao passo que componentes AWT tinham parte do cdigo dependente de mquina isso fazia com que os aplicativos Java que usavam componentes GUI AWT tivessem aparncias diferentes em diferentes sistemas operacionais. Os componentes Swing esto disponveis desde a verso 1.2 da linguagem Java e se tornaram os componentes GUI padro da linguagem. 5.1 Usando Componentes Swing Neste capitulo no vamos ficar filosofando a respeito dos componentes at porque no existe muita teoria sobre eles. O que devemos saber onde esto os componentes GUI na API Java. Os componentes AWT (que ns no vamos usar) esto no pacote java.awt e os componentes Swing esto no pacote javax.swing. 5.2 Usando Layouts Agora vamos aprender como posicionar nossos componentes em nossos aplicativos para obter melhores visualizaes. No iremos ver todos os tipos de layouts apenas os mais usados, todos os layouts esto no pacote java.awt. Layouts a serem abordados: FlowLayout BorderLayout GridLayout 5.3 Listeners para os componentes (interfaces, inner-classes) Bom at agora j sabemos como montar nossas GUI mas queremos agora que nossos aplicativos respondam a eventos e faam alguma coisa realmente til. Os ouvidores de evento (melhor cham-los de Listeners) so interfaces (lembre-se de que as interfaces em Java no possuem nenhuma implementao de cdigo, contm apenas as assinaturas dos mtodos) que chamam um determinado mtodo de acordo com um evento associado a algum objeto. Por exemplo, poderamos querer tratar o clique do mouse dentro de um JFrame, ou se um usurio estivesse digitando um texto em um JTextField e se por acaso ele digitasse um caractere invalido, nosso programa poderia emitir um som que o deixasse surdo. Os listeners que iremos utilizar se encontram no pacote java.awt.event. As interfaces existem para definir um comportamento, mas como utilizar interfaces em nossos programas? Existem duas formas: podemos dizer que nossa classe implementa esta interface, quando dizemos que nossa classe implementa uma cetra interface X, nossa classe deve implementar (definir) todos os mtodos desta interface, mesmo que nossas classe no precise de todos os mtodos somos obrigados escrev-los. Para que nossa classe possa implementar uma interface usamos a palavra reservada implements seguido do nome da Interface. Nota: implements deve vir depois da instruo extends (se esta existir). Bom bem no comeo desta apostila voc deve ter lido ou algum deve ter contado para voc que Java no permite mltipla herana e para contornar esse problema, podemos dizer que nossas classes implementam vrias interfaces, para declarar isto em nossos

Java Legal!

31

32 programas devemos apenas separar por vrgula os nomes das interfaces na declarao de nossas classes. Exemplo: public class MyClass extends JFrame implements ActionListener { } Estamos dizendo que nossas classe herda de JFrame e implementa a interface ActionListener. Exemplo: public class MyClass implements ActionListener, MouseListener { } Estamos dizendo que MyClass implementa as interfaces ActionListener e MouseListener. Inner-classes J sabemos que no podemos declarar mtodos dentro de mtodos em Java, mas no fique revoltado pois, podemos criar as classes internas (chamem de inner-class) que so classes dentro de classes. Muitos programadores no gostam de inner-class, pois dizem que elas violam o conceito de POO, pois inner-classes podem ter acesso aos membros private da classe em que foram declaradas. Exemplo: public class MainClass { private class InnerClass { ... ... } } No exemplo acima criamos uma inner-class, mas espere, o que aquele private est fazendo ali?? Calma no precisa bater em seu irmo menor por isto. Inner-classes podem ser private, pois so consideradas como um membro da classe que sua proprietria, definimos uma inner-class como private para que ningum fora da nossa classe possa instanciar um objeto InnerClass pois este objeto tem acesso aos nossos membros private. Podemos tambm ter static inner-classes, mas elas no fazem sentido algum uma vez que ela vai existir sem que nenhum objeto seja instanciado e s vai poder acessar membros static da classe proprietria. Importante: Uma inner-class s pode ser instanciada atravs de um objeto de sua classe proprietria. Uma classe pode ter vrias inner-classes. Bom, mas por que estamos falando de inner-classes? Porque existe uma outra maneira de adicionar listeners aos nossos componentes, atravs de inner classes annimas. Por exemplo se quisermos que nosso boto b imprima uma linha de texto no vdeo a cada clique devemos fazer:

Java Legal!

32

33
b.addActionListener ( new ActionListener( ) { public void actionPerformed( ActionEvent e ) { System.out.println( Clique ); } } ); //Ficou bonito no?

5.4 Exemplos

Java Legal!

33

34 6. Tratamento de Excees Uma exceo uma indicao de que ocorreu um problema durante a execuo do programa. Os recursos que vamos ver permitem escrever programas mais claros, mais robustos e mais tolerantes a falhas. Tambm analisamos quando o tratamento de excees deve ser utilizado. 6.1 Por que o tratamento de excees? O tratamento de excees fornecido para permitir aos programas capturar e tratar erros em vez de deix-los ocorrer e arcar com as conseqncias. Veremos que as excees so objetos de classes derivadas da superclasse Exception. Mostraremos como lidar com excees no capturadas. Analisaremos como excees inesperadas so tratadas por Java. O tratamento de excees pode ser visto como outro meio de retornar o controle de um mtodo ou sair de um bloco de cdigo. Normalmente, quando ocorre uma exceo, ela tratada por um chamador do mtodo que gera a exceo, por um chamador desse chamador, ou to longe para trs na pilha de chamadas quanto seja necessrio para encontrar um tratador para essa execuo. Com outras linguagens de programao que no suportam o tratamento de excees, os programadores freqentemente demoram para escrever o cdigo de processamento de erro, e, as vezes, simplesmente o esquecem de fazer. Isso resulta em produtos menos robustos, e, portanto, inferiores. Java fora o programador a lidar com o tratamento de excees desde o comeo de um projeto. Ainda assim, o programador precisa de um esforo considervel para incorporar uma estratgia de tratamento de excees aos projetos de software. 6.2 Como tratar excees (uso do try, catch e finally). O programador inclui em um bloco try o cdigo que pode gerar uma exceo e qualquer cdigo que no pode ser executado se uma exceo ocorrer. O bloco try imediatamente seguido por zero ou mais bloco catch. Cada bloco catch especifica o tipo de exceo que ele pode capturar e contm um tratador exceo. Depois do ultimo bloco catch, um bloco finally opcional fornece o cdigo que sempre executado, independentemente de ocorrer ou no uma exceo. Como veremos, o bloco finally um lugar ideal para cdigo que libera recursos. O bloco try deve ser seguido por um bloco catch ou por um bloco finally. Quando um mtodo dispara um exceo, o controle de programa sai do bloco try e continua a execuo no primeiro bloco catch. O programa pesquisa nos blocos catch em ordem, procurando um tratador apropriado (em breve discutiremos o que torna um tratador apropriado). Se o tipo de exceo disparada corresponder ao tipo de parmetro em um dos blocos catch, o cdigo daquele bloco catch executado. Se um bloco try termina com sucesso, sem disparar nenhuma exceo, o programa pula os tratadores de exceo para aquele bloco e retorna a execuo depois do ltimo bloco catch. Se um bloco finally aparece depois do ltimo bloco catch, ele executado independentemente de ter ocorrido uma exceo. Em uma definio de mtodo, uma clausula throws especifica as excees que o mtodo dispara. Esta clausula aparece depois da lista de parmetros e antes do corpo do mtodo. A clausula contm uma lista separada por virgulas das excees que o mtodo poder potencialmente disparar se ocorrer um problema enquanto o mtodo esta sendo executado. Tais excees podem ser disparadas por instrues no corpo do mtodo ou elas Java Legal! 34

35 podem ser disparadas por mtodos chamados no corpo. O ponto no qual o disparo ocorre chamado ponto de disparo. Quando ocorre uma exceo, o bloco em que a exceo ocorreu termina (expira) o programa no pode retornar diretamente ao ponto de disparo. Na ocorrncia de uma exceo, possvel passar informaes para o tratador de excees a partir da vizinhana em que ocorreu a exceo. Essas informaes so do tipo de objeto de exceo disparado ou informaes colhidas da vizinhana em que a exceo ocorreu e colocadas no objeto disparado. Blocos Try Uma exceo que ocorre em um bloco try normalmente capturada por um tratador de excees especificado por um bloco catch imediatamente aps aquele bloco try como em: try { codigo que pode gerar uma exceo. } catch ( TipoDeExceo referenciaParaExceo ) { instrues para processar uma exceo. } um erro de sintaxe separar com outro cdigo os tratadores catch que correspondem a um bloco try particular.

Disparando uma exceo A instruo throw executada para indicar que uma exceo ocorreu (isto , um mtodo no pode ser completado com sucesso). Esse processo se chama disparar uma exceo. A instruo throw especifica um objeto a ser disparado. O operando de um throw pode ser qualquer classe derivada da classe Throwable (pacote java.lang). As duas subclasses imediatas da classe Throwable so exception e Error. Erros so problemas de sistema particularmente srios que geralmente no devem ser capturados. Exceptions so causadas por problemas que devem ser capturados e processados durante a execuo do programa para torn-lo mais robusto. Se o operando throw um objeto da classe Exception, ele chamado de objeto de exceo. um erro de sintaxe capturar o mesmo tipo em dois catch diferentes associados com um bloco try em particular. Colocar catch (Exception exception) antes de outros blocos catch que capturam tipos especficos de excees impede que esses blocos sejam executados; O tratador de excees que captura o tipo Exception deve ser colocado por ultimo na lista dos tratadores de excees que segue um bloco try, ou ocorre um erro de sintaxe. Causar um erro de sintaxe se um catch que captura um objeto de superclasse for colocado antes de um catch para tipos de subclasses daquela classe.

Clausula throws A clausula throws lista as excees que podem ser disparadas por um mtodo, como em:

Java Legal!

35

36 int nomeDeMetodo ( lista de parmetros ) throws TipoDeExceo1, TipoDeExceo2, TipoDeExceo3,... { //corpo do mtodo } Os tipos de excees que so disparadas por um mtodo so especificados na definio do mtodo como uma lista separada por virgulas em uma clausula throws. Um mtodo pode disparar objetos das classes indicadas ou pode disparar objetos de suas subclasses. Algumas excees podem ocorrer em qualquer ponto durante a execuo do programa. Muitas dessas excees podem ser evitadas por codificao adequada. Trata de excees durante a execuo e elas derivam da classe RuntimeException. Por exemplo, se o programam tentar acessar um subscrito de array fora do intervalo, ocorre uma exceo do tipo ArrayIndexOutOfBoundsException (derivada de RuntimeException). O programa evidentemente pode evitar esse problema; Portanto uma exceo durante a execuo. Bloco finally Os programas que obtm certos tipos de recursos devem devolver explicitamente esses recursos para o sistema para evitar a perda de recursos. Em linguagens de programao como C e C++, o tipo mais comum de perda de recurso e a perda de memria. Java realiza coleta automtica de lixo de memria no mais necessria para os programas, evitando assim, a maioria das perdas de memria. Mas outros tipos de perdas de recursos podem ocorrer em Java. O bloco finally opcional. Se estiver presente, ele colocado depois do ultimo bloco catch de um bloco try, como segue: try { instrues; instrues de aquisio de recursos; } catch ( TipoDeExceo exceo1 ) { instrues de tratamento de exceo; } catch ( OutroTipoDeExceo exceo2 ) { instrues de tratamento de exceo; } finally { instrues; instrues de liberao de recurso; } Java garante que o bloco finally (se houver um) ser executado independentemente de qualquer exceo ser ou no disparada no bloco try. Corresponde ou quaisquer de seus blocos catch correspondentes. Java tambm garante que o bloco finally (se houver um) ser executado se um bloco try for encerrado com instruo return, break ou continue. 6.3 Exemplos

Java Legal!

36

37 7. Manipulando Arquivos e Streams Um programa Java abre um arquivo atravs da criao de objetos e a associao de um fluxo de bytes a este objeto. Java tambm pode associar fluxos de bytes associados com dispositivos. Na verdade, Java cria trs objetos de fluxo que so associados com dispositivos quando a execuo de um programa Java iniciada: System.in, System.out e System.err. Os fluxos associados com esses objetos fornecem canais de comunicao entre um programa e um dispositivo particular. Por exemplo, o objeto System.in (objeto de fluxo de entrada padro) normalmente permite que um programa insira dados pelo teclado, o objeto System.out (objeto de fluxo de sada padro) normalmente permite aos programa gerar como sada dados na tela e o objeto System.err (objeto de fluxo de erro padro) permite a um programa gerar como sada mensagens de erro na tela. Cada um desses fluxo pode ser direcionado. Para System.in isso permite ao programa ler bytes de fonte diferente. Para System.err isso permite enviar a sada para um destino diferente, como um arquivo em disco. A classe System fornece mtodos setIn, setOut e setErr para redirecionar os fluxos padres. Os programas Java fazem o processamento de arquivos usando classes do pacote java.io. Esse pacote inclui definies para as classes de fluxo como FileInputStream (para entrada baseada em bytes de um arquivo), FileOutputStream (para sada baseada em bytes para um arquivo), FileReader (para entrada baseada em caracteres de um arquivo) e FileWriter (para saida baseada em caracteres para um arquivo). Os arquivos so abertos criando-se objetos dessas classes de fluxo, que herdam das classes InputStream, OutputStream, Reader e Writer, respectivamente. Portanto, os mtodos dessas classes de fluxo tambm podem ser aplicados a fluxos de arquivo. Para realizar a entrada e sada de tipos de dados, os objetos das classes ObjectInputStream, DataInputStream, ObjectOutputStream e DataOutputStream sero utilizados junto com a classe de fluxo de arquivos baseadas em bytes, FileInputStream e FileOutputStream. 7.1 Escrevendo e resgatando informaes de arquivos em Java Aqui vamos aprender como abrir um arquivo e salvar nosso objetos dentro deste arquivo. Para escrever nosso objetos em arquivo vamos utilizar objetos da classe ObjectOutputStream, e para resgatar estes objetos iremos utilizar objetos da classe ObjectInputStream. O acesso aos arquivos com estes fluxos seqencial o que indica que devemos resgatar os objetos do arquivo na ordem em que foram escritos. Estas classes fornecem mtodos para escrever e resgatar qualquer tipo de objeto, desde que estes objetos implementem a interface Serializable, esta interface no contm mtodos apenas serve como uma identificao para objetos. Para criar arquivos de acesso aleatrio vamos utilizar objetos da classe RandomAccessFile, esta classe tm todos os recursos das classes DataInputStream e DataOutputStream discutidos anteriormente. Quando o programa associa um objeto da classe RandomAccesFile com um arquivo, o programa l ou escreve os dados a partir da posio do arquivos especificada pelo ponteiro de posies no arquivo e todos os dados so lidos ou gravados como tipos primitivos de dados. Os programas de processamento de arquivo de acesso aleatrio raramente gravam um nico campo em um arquivo. Normalmente, eles gravam um objeto por vez, como mostramos nos seguintes exemplos.

Java Legal!

37

38 7.2 A classe File Nesta seo vamos discutir a classe File, que particularmente til para recuperar do disco as informaes sobre um arquivo ou diretrio. Na verdade, os objetos da classe File no abrem um arquivo nem fornecem nenhuma capacidade de processamento de arquivo. Uma aplicao da utilizao de um objeto File verificar se existe um arquivo antes de tentar abrir o arquivo. Nos exemplos anteriores vimos que abrir um arquivo com um objeto do tipo FileOutputStream descarta o contedo do arquivo sem aviso prvio. Se o programa determina que o arquivo j existe, o programa pode avisar o usurio que os dados do arquivo original esto prestes a serem perdidos. Dica: Ao construir strings que representam informaes sobre caminho, utilize File.separatorChar para obter o caractere separador prprio da maquina local, em vez de usar explicitamente / ou \. 7.3 Exemplos

Java Legal!

38

39 8. Applets Como j foi citado uma applet um aplicativo Java associado com uma pagina html que executado por um browser. Quando um browser carrega uma pagina da web que contm uma applet, esta applet baixada para o navegador e comea a ser executado. Fundamentalmente as applets no tem muitos segredos pois elas incorporam cdigo Java j visto nesta apostila. As nicas diferenas so os mtodos que utilizamos em nossas applets (init, start, stop, paint e destroy). 8.1 Como criar uma Applet Para criar uma applet devemos dizer que nossas classe herda de JApplet, todos os applets devem ser subclasses de JApplet. A classe JApplet faz parte do pacote javax.swing. Aps criarmos nossa applet e compila-la devemos criar uma pagina html que ir apresentar nossa applet. Basicamente a pagina em html deve ser como segue abaixo: <html> <applet code = NomeDaApplet.class width = VALOR height = VALOR> </applet> <html> Aps a criao do arquivo html nossa applet est pronta para ser executada, basta abrirmos nossa pagina em um browser ou executar o appletviewer presente no JSDK. 8.2 Mtodos da classe JApplet Na classe JApplet esto definidos 5 mtodos chave que so chamados automaticamente durante a execuo de um applet. So eles: init, start, stop, paint e destroy. Esses mtodos so definidos na API para no fazer nada, a menos que voc fornea uma definio para eles na definio de classe do seu applet. Se voc deseja utilizar estes mtodos em uma applet que voc est escrevendo, deve definir o cabealho do mtodo como mostrado abaixo, caso contrrio o mtodo no ser chamado automaticamente durante a execuo da applet. public void init( ): Este mtodo chamado uma vez pelo appletviewer ou pelo navegador quando uma applet carregado para execuo. Ele executa a inicializao de uma applet. Aes tpicas a realizar aqui so a inicializao de variveis de instancia e dos componentes GUI da applet e o carregamento de sons para reproduzir ou imagens a exibir, ou criao de threads. public void start( ): Esse mtodo chamado depois que o mtodo init completa sua execuo e a cada vez que o usurio retorna para a pagina em que a applet reside. Esse mtodo executa quaisquer tarefas que devam ser completadas quando a applet carregado pela primeira vez no navegador, e isso deve ocorrer cada vez que a pagina html em que o applet reside revisitada. Aes tpicas realizadas aqui incluem iniciar uma animao e outro threads. public void paint( Graphics g ): Este mtodo chamado depois que o mtodo init completou sua execuo e o mtodo start comeou a ser executado, para desenhar a applet. Tambm chamado automaticamente cada vez que a applet precisa ser repintada. Por exemplo, se o usurio cobre

Java Legal!

39

40 a applet com outra janela e ento descobre a applet, o mtodo paint chamado. Aes tpicas realizadas aqui envolvem desenhar com o objeto Graphics que passado automaticamente para o mtodo paint para voc. public void stop( ): Este mtodo chamado quando a applet deve parar de executar normalmente quando o usurio do navegador deixa a pagina html em que a applet reside. Esse mtodo executa quaisquer tarefas que so exigidas para suspender a execuo da applet. Aes tpicas realizadas aqui so parar a execuo de animaes e threads. public void destroy( ): Esse mtodo chamado quando a applet est sendo removido da memria normalmente quando o usurio do navegador sai da sesso de navegao. Este mtodo executa quaisquer tarefas que so exigidas para destruir recursos alocados para a applet.

8.3 Exemplos

Java Legal!

40

41 9. Threads A simultaneidade importante em nossas vidas, ironicamente, apesar disso, muitas linguagens de programao no permitem que os programadores especifiquem que tarefas devam ser executadas simultaneamente. Em vez disso, as linguagens fornecem apenas um pequeno conjunto de estruturas de controle que permite aos programadores realizar uma operao por vez e depois passar para a prxima ao depois que a anterior terminada. O tipo de simultaneidade (entenda com processamento paralelo) s alcanado com primitivas de sistemas operacionais disponveis somente para programadores de sistemas altamente experientes. Java nica, entre linguagens de programao de uso geral e popular, no sentido de que torna as primitivas de simultaneidade disponveis para o programador de aplicativos. O programador especifica que os aplicativos contm threads (fluxos ou linhas de execuo), cada thread executa uma parte do programa em paralelo que tambm podem ter outras threads. Esse recurso chamado de multithreading ou multiescalonamento, oferece ao programador Java recursos poderosos, no disponveis em C e C++, as linguagens em que Java baseada. C e C++ so chamadas de linguagens de uma nica thread (Obs: em muitas plataformas, os programas C e C++ podem executar multithreading usando bibliotecas de cdigo especficas para o sistema). Java inclui as primitivas de multithreading na prpria linguagem o que evita as chamadas s rotinas do sistema operacional (as classes para manipulao de threads esto dentro do pacote java.lang, Thread, ThreadGroup, ThreadLocal e ThreadDeath). 9.1 Multithreading A classe Thread: uma viso geral dos mtodos. Agora teremos uma viso geral dos vrios mtodos relacionados com thread na Java API. Utilizamos muitos desses mtodos em exemplos de cdigo ativo ao longo deste capitulo. Se quiser obter detalhes mais especficos sobre cada mtodo, especialmente as excees disparadas por cada mtodo, consulte a API. A classe Thread (pacote java.lang) tem vrios construtores. O Construtor:
public Thread( String threadName )

Constri um objeto Thread cujo nome threadName.


public Thread( )

Constri uma Thread cujo nome Thread- concatenado com um nmero, como Thread-1, Thread-2 e assim por diante. O cdigo que faz o trabalho de verdade de uma thread colocado dentro do mtodo run (este o mtodo mais importante de uma thread, pois nele que especificamos quais atividades devem ocorrer em paralelo). O mtodo run pode ser sobrescrito (Overriding) em uma subclasse de Thread ou implementado em um objeto Runnable. Runnable uma interface Java importante que iremos abordar depois. O programa dispara a execuo de uma thread chamando o mtodo start da thread, que por sua vez chama o mtodo run. Depois de start disparar a thread, start retorna ao seu chamador imediatamente, este chamador ento executado simultaneamente com a thread que foi disparada. A chamada start resulta numa exceo se a thread j tiver sido disparada. Java Legal! 41

42 9.2 Sincronizao de Threads Java utiliza monitores para fazer sincronizao. Todo objeto com mtodos synchronized tem um monitor. O monitor permite que uma thread de cada vez execute um mtodo synchronized sobre o objeto. Isso se faz bloqueando o objeto quando o programa invoca um mtodo synchronized tambm conhecido como obteno de bloqueio. Se houver vrios mtodos synchronized, somente um pode estar atuando sobre um objeto de cada vez, todas as outras threads que tentam invocar mtodos synchronized devem esperar. Quando um mtodo synchronized termina de ser executado, o bloqueio sobre o objeto liberado e o monitor permite que a thread pronta com prioridade mais alta tente invocar um mtodo synchronized para prosseguir (Obs: Java tambm possui blocos de cdigo synchronized). A thread que sendo executada em um mtod synchronized pode deteminar que ela no pode mais prosseguir, de modo que a thread chama wait voluntariamente. Isso tira a thread da disputa pelo processador e da disputa pelo objeto monitor, A thread agora est no estado de espera. Quando uma thread que est executando um mtodo synchronized termina ou satisfaz a condio pela qual outra thread pode estar esperando, a thread pode nitificar (notify) um thread em espera para ela se tornar novamente pronta. Neste ponto, a thread original pode tentar readquirir o bloqueio sobre o objeto monitor e ser executada. O notify atua como sinal para a thread em espera de que a condio pela qual a thread em espera estava esperando agora est satisfeita, de modo que a thread em espera pode entrar novamente no monitor. Se uma thread chama notifyAll, ento todas as threads que esto esperando o objeto tornam-se elegveis para entrar novamente no monitor (isto , todas so colocaas em um estado pronta). Lembre-se que somente uma dessas threads pode obter o bloqueio sobre o objeto de cada vez outras threads que tentam adquirir o mesmo bloqueio sero bloqueadas pelo sistema operacional at que o bloqueio se torne disponvel novamente. Os mtodos wait, notify, notifyAll so herdados da classe Object por todas as classes, ento, qualquer objeto pode ter um monitor. A interface Runnable At agora usamos a classe Thread para escrever nosso aplicativos. Entretanto, se queremos suporte multithreading em uma classe que j derivada (herda) de uma classe diferente de Thread, devemos implementar a interface Runnable nessa classe, porque Java no permite herana mltipla. A prpria classe Thread implementa a interace Runnable (pacote java.leng). Implementar a interface Runnable um uma classe permite que um programa manipule objetos daquela classe como objetos Runnable. Assim como ocorre com a derivao da classe Thread, o cdigo que controla a thread colocado no metodo run. 9.3 Exemplos

Java Legal!

42

43 10. Bibliografia

DEITEL, H. M. e P. J. Java como programar. 3. Edio. Porto Alegre: Bookman 2001. DEITEL, H. M. e P. J. Java como programar. 4. Edio. Porto Alegre: Bookman 2003. CESTA, A. A. Tutorial: A linguagem de programao Java Unicamp 1996. LEMAY, L. e CADENHEAD, R. Aprenda em 21 dias Java 2. Rio de Janeiro: Campus 1999. Grupo de Usurios Java www.guj.com.br Java Ranch www.javaranch.com Sun Microsystems www.javasoft.com Portal Java www.portaljava.com.br

Java Legal!

43

You might also like