apostila java

43
Apostila Java

Upload: caiocout

Post on 03-Jan-2016

13 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Apostila Java

Apostila Java

Page 2: Apostila Java

2

Apostila Java

1. Introdução ao Java 31.1 A história do Java (definição, tecnologias, comparações).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?, Instalação, Configuração).

2. Revisão P.O.O. (Terminologia Orientada a Objetos). 82.1 O que é uma classe? O que é um objeto?2.2 Herança e Polimorfismo (reutilização de código).2.3 Padrões de P.O.O.

3. Programando em Java (Standalone x Applet) 113.1 Tipos de dados (primitivos ou referências)3.2 Operadores3.3 Estruturas de controle.3.4 Criando classes em Java (atributos, métodos, construtores, garbage collection).

4. Modificadores de acesso (public, private, protected) 294.1 Níveis de Acesso4.2 Outros modificadores (static, final, abstract).

5. Componentes (Swing x AWT) 315.1 Usando componentes swing.5.2 Usando Layouts.5.3 Listeners para os componentes. (interfaces, inner-classes)

6. Exceções 346.1 Por que o tratamento de exceções?6.2 Como tratar execeções ( uso do try, catch, finally )

7. Manipulando Arquivos e Streams 377.1 Escrevendo e resgatando informações de arquivos em Java.7.2 Objetos em arquivos.

8. Applets 398.1 Como criar uma applet8.2 Métodos da classe JApplet (init, start, stop).

9. Threads 419.1 Multithreading (Como criar múltiplas threads).9.2 Sincronização de Threads.

*** Ao final de cada tópico teremos os exemplos práticos e exercícios.***

10. Bibliografia 43

Java é Legal! 2

Page 3: Apostila Java

3

1. Introdução ao Java.

1.1 História do JavaEm 1991 a Sun MicroSystems acreditava que os dispositivos inteligentes (Palm´s,

celulares, TV´s e etc.) seria a próxima área de grande destaque para a computação mundial,com isso a Sun financiou uma pesquisa denominada Green, esta pesquisa resultou nodesenvolvimento 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 seuescritório. Mais tarde descobriu-se que já existia uma linguagem chamada Oak. Quando aequipe da Sun visitou uma cafeteria local, o nome Java (cidade de origem de um tipo decafé importado) foi sugerido e pegou. Mas o projeto Green estava em dificuldades, omercado para os dispositivos inteligentes destinados ao consumidor final não tinha sedesenvolvido rapidamente como a Sun imaginou, e ainda por cima perderam um contratoimportante que estavam disputando com uma outra empresa. O projeto estava quase sendocancelado quando surgiu a World Wide Web, o pessoal da Sun viu o potencial de utilizarJava para criar páginas da Web com conteúdo dinâmico. Isso deu nova vida ao projeto. Em1995 a Sun anunciou Java formalmente em uma conferência, e imediatamente gerouinteresse na comunidade internacional, pois permitia criar aplicativos Web, desenvolveraplicativos comerciais de grande porte e aplicativos para os dispositivos destinados aoconsumidor final.

1.2 Java HojeA tecnologia Java esta dividida em três 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 memória,

Midlets).

1.3 API JavaNossos programas em Java consistem de partes chamadas classes, que por sua vem

contêm partes chamadas métodos que realizam tarefas e retornam informações aocompletarem suas tarefas. Você pode programar cada pedaço de seus programas em Java,mas a maioria dos programadores tira proveito das extensas bibliotecas de classes Javaexistente. Estas bibliotecas são também conhecidas como Java APIs (AplicationProgramming Interfaces – Interfaces de Programas Aplicativos). Portanto existem duaspartes que devemos aprender no “mundo” Java. A primeira é aprender a linguagem Java e asegunda é tirar proveito das APIs existentes.

1.4 O que o Java tem de bom? E de ruim? Existe uma série de fatores que fazem do Java um dos melhores ambientes de

desenvolvimento existentes, um exemplo é a Segurança. A política de segurança dalinguagem impede os programadores de escrever código malicioso. Também temos afacilidade do gerenciamento “automático” de memória (Garbage Collection - Coletor deLixo), também podemos especificar que tarefas podem ocorrer paralelamente usando as

Java é Legal! 3

Page 4: Apostila Java

4

técnicas de Multithreading, o tratamento de erros (Exceptions) fica muito mais simples (econfiável), com Java fica muito mais fácil escrever aplicativos baseados em rede (oprogramador não precisa se preocupar com o baixo nível).

Esta foi a parte boa... vocês já devem ter ouvido coisas do tipo “Java é uma carroça” ou“Java é multiplataforma”. Estas afirmações não são totalmente verdadeiras. Java é lentoporque é uma linguagem interpretada (ao contrario de C e Pascal por exemplo que sãocompiladas), mas as novas maquinas virtuais estão diminuindo este problema e existemcompiladores just-in-time (JIT – Transforma o bytecode em código de maquina em tempode execução).

A Sun sempre afirma “Write once, run anywhere”, mas para quem já teve a experiênciade programar em Java para Macintosh sabe que esta frase ficaria melhor assim: “Writetwice, run anywhere” pois um programa escrito em Java que roda em Windows e Linuxtem que ser ALTERADO para rodar em versões anteriores ao OS X do Macintosh(Possivelmente isto tenha mudado no OS X pois este sistema é baseado em Linux).

CARACTERÍSTICAS DA LINGUAGEM: Parecida com C, C++:

Java tem a aparência de C ou de C++, embora a filosofia da linguagem sejadiferente. Por este motivo estaremos frequentemente fazendo comparações alguma destaslinguagens. O leitor que programa em qualquer uma delas, ou em uma linguagemorientada a objetos, se sentirá mais a vontade e se tornará um bom programador Java emmenos tempo.

Java também possui características herdadas de muitas outras linguagens deprogramação: Objective-C, Smalltalk, Eiffel, Modula-3, etc. Muitas das característicasdesta linguagem não são totalmente novas. Java é uma feliz união de tecnologias testadaspor vários centros de pesquisa e desenvolvimento de software.

Compilada:

Um programa em Java é compilado para o chamado “byte-code”, que é próximo asinstruções de máquina, mas não de uma máquina real. O “byte-code” é um código de umamáquina virtual idealizada pelos criadores da linguagem. Por isso Java pode ser maisrápida do que se fosse simplesmente interpretada.

Portável: Java foi criada para ser portável. O “byte-code” gerado pelo compilador para a sua

aplicação específica pode ser transportado entre plataformas distintas que suportam Java

(Solaris 2.3, Windows-NT, Windows-95, Mac/Os etc) . Não é necessáriorecompilar um programa para que ele rode numa máquina e sistema diferente, aocontrário do que acontece por exemplo com programas escritos em C e outras linguagens.

Esta portabilidade é importante para a criação de aplicações para a heterogêneainternet. Muitos d os programas exemplo deste tutorial foram escritos e compilados numaplataforma Windows-95 e rodaram perfeitamente quando simplesmente copiados parauma plataforma Solaris 2.3. Em Java um inteiro, por exemplo, tem sempre 32 bits,independentemente da arquitetura. O próprio compilador Java é escrito em Java, de

Java é Legal! 4

Page 5: Apostila Java

5

modo que ele é portável para qualquer sistema que possua o interpretador de “byte-codes”. Um exemplo de programa escrito em Java é o browser hotjava.

Orientada a Objetos:

A portabilidade é uma das características que se inclui nos objetivos almejados poruma linguagem orientada a objetos. Em Java ela foi obtida de maneira inovadora comrelação ao grupo atual de linguagens orientadas a objetos.

Java suporta herança, mas não herança múltipla. A ausência de herança múltiplapode ser compensada pelo uso de herança e interfaces, onde uma classe herda ocomportamento de sua superclasse além de oferecer uma implementação para uma oumais interfaces.

Java permite a criação de classes abstratas. Outra característica importante emlinguagens orientadas a objetos é a segurança. Dada a sua importância o tópico foi escritoa parte.

Segura: A presença de coleta automática de lixo, evita erros comuns que os programadores

cometem quando são obrigados a gerenciar diretamente a memória (C , C++, Pascal ). Aeliminação do uso de ponteiros, em favor do uso de vetores, objetos e outras estruturassubstitutivas traz benefícios em termos de segurança. O programador é proibido de obteracesso a memória que não pertence ao seu programa. Estas medidas são particularmenteúteis quando pensarmos em aplicações comerciais desenvolvidas para a internet.

A presença de mecanismos de tratamento de exceções torna as aplicações maisrobustas, não permitindo que elas abortem, mesmo quando rodando sob condiçõesanormais.

Suporta concorrência: A linguagem permite a criação de maneira fácil, de vários “threads” de execução. Isto que dizer que você pode dizer ao seu programa Java que varias tarefas vão

ocorrer paralelamente. Existem algumas bibliotecas que implementam o funcionamento dethreads em outras linguagens como C por exemplo, mas estas bibliotecas são dependentesde plataforma �. Eficiente:

Como Java foi criada para ser usada em computadores pequenos, ela exige poucoespaço, pouca memória. Java é muito mais eficiente que grande parte das linguagens de“scripting” existentes, embora seja cerca de 20 vezes mais lenta que C, o que não é ummarco definitivo. Com a evolução da linguagem, serão criados geradores de “byte-codes”cada vez mais otimizados que trarão as marcas de performance da linguagem maispróximas das de C++ e C. Além disso, um dia Java permitirá a possibilidade de gerarcódigo executável de uma particular arquitetura “on the fly”, tudo a partir do “byte-code”.

Java é Legal! 5

Page 6: Apostila Java

6

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

1.6 FerramentasAbaixo segue a lista das ferramentas que iremos precisar para editar, compilar e

executar nossos programas:• J2SDK ( Java 2 Software Development Kit – Versão 1.4.0 ou superior).• Editor ( EditPlus ou Crimson ).

Configurando o CLASSPATHQuando executamos um programa Java o SO precisa saber o local (PATH) da classe

que estamos querendo executar, no Windows esta informação esta na variável de ambienteCLASSPATH (normalmente definida no autoexec.bat). A questão do CLASSPATH geramuita confusão para quem está começando a programar em Java, pois nós conseguimoscompilar nossos programas, mas na hora da execução 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! 6

Page 7: Apostila Java

7

ponto informa ao SO que existem classes no diretório atual (diretório dos nossosarquivos .class).

Configurando o EditPlusSelecione no menu Tools a opção Configure User Tools.

>Para o compilador (javac.exe): Selecione Add Tool e em seguida Program. Na opçãoCommand coloque o caminho do javac.exe (dentro da pasta do J2SDK). Em Argumentescolha File Name.

>Para o interpretador (java.exe): Siga o mesmo procedimento acima, mas colocando emCommand o caminho do java.exe e em Argument escolhendo a opção File Name WithoutExtension.

Java é Legal! 7

Page 8: Apostila Java

8

2. Revisão P.O.O.

2.1 O que é uma classe? O que é um objeto?A grosso modo uma classe é uma “fôrma” a partir da qual podemos criar objetos, ou

seja, um objeto não pode ser criado se não houver uma definição 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, não defineobjetos individuais. Em vez disso, você define classes de objetos. Por exemplo, poderíamoster uma classe Tree descrevesse as características de todas as árvores:

• Possui folhas e raízes.• 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 instância(objetos = instâncias) concreta da classe Tree.

A partir da classe Tree podemos criar vários objetos Tree diferentes e cada um poderiater características diferentes (ver figura):

As classes que escrevemos em Java possuem dois tipos de componentes: métodos(comportamentos) e atributos. Os atributos são os elementos que nos permitem diferenciarclasses de objetos e determinam forma, estado e qualidades desta classe, por exemplo aclasse ProfessorDeComputação poderia incluir os seguintes atributos:

• Idade (qualquer valor entre 100 e 200).

• Especialidade (ADA, SO, BD, Nada...)• SalárioOs atributos também podem indicar o estado de um objeto como, por exemplo, o estado

de saúde (vivo ou morto) e tendências políticas (Malufista, Independente, café-com-leite).

Java é Legal! 8

Page 9: Apostila Java

9

Os métodos (mais ou menos procedures e functions do Pascal) são grupos de instruçõesque realizam tarefas específicas. Os objetos se comunicam através de si usando métodos.Uma classe ou um objeto pode chamar métodos em uma outra classe ou objeto por muitasrazões, como por exemplo:

• Para relatar uma alteração para outro objeto.• Para “pedir” que outro objeto faça algo.

2.2 Herança e Polimorfismo.A herança representa um dos conceitos mais importantes na programação orientada a

objetos e tem efeito direto sobre como você projeta e escreve suas próprias classes Java.Herança é um mecanismo que permite a uma classe herdar todo o comportamento e os

atributos de outra classe.

(figura herança pág 51 java21).Uma subclasse é a criação de uma nova classe que herda de outra já existente. A única

tarefa na subclasse é indicar as diferenças no comportamento e nos atributos, entre ela e asuperclasse.

A funcionalidade comum a várias classes pode ser colocada em superclasses, o quepermite que ela seja usada repetidamente em todas as classes que estejam abaixo nahierarquia.

As alterações em uma superclasse são refletidas automaticamente em todas as suassubclasses, e nas subclasses destas etc. Não há necessidade de mudar ou recompilarnenhuma das classes inferiores; elas recebem as novas informações por herança.

A forma da herança em Java e chamada herança simples, pois cada classe Java pode terapenas uma superclasse (embora cada superclasse possa ter várias subclasses).

Em outras linguagens de programação orientada a objetos como C++, as classespossuem mais de uma superclasse, e elas herdam variáveis e métodos combinados de todasestas superclasses. Isso se chama herança múltipla e proporciona meios para se criar classesque abrangem praticamente todo comportamento que se possa imaginar. Entretanto, issocomplica significativamente as definições da classes e o código necessário para produzi-las.A linguagem Java torna a herança mais fácil permitindo apenas herança simples.

Java é Legal! 9

Page 10: Apostila Java

10

O polimorfismo ( muitas formas ) é a capacidade de objetos semelhantes teremcomportamentos parecidos (???). Mas isto não é parecido com Herança?? De fato muitosautores apresentam o Polimorfismo como sendo um tipo de Herança, mas em Java oPolimorfismo se manifesta nas chamadas de métodos. Calma, não precisa ficar angustiadopor não ter entendido, este é um conceito que será fixado quando já tivermos começado aescrever nossas classes em Java. Por enquanto guarde que no Polimorfismo as classes têmcomportamentos parecidos.

InterfacesA herança simples torna os programas mais fáceis de entender e projetar, entretanto isto

pode ser restritivo. A linguagem Java contorna o problema do comportamentocompartilhado por meio de interfaces.

Uma interface é um conjunto de métodos que indica que uma classe possui umcomportamento além daquele herdado de suas superclasses.

Uma Interface difere de uma classe pelo simples fato de que na classe nós temos asimplementações dos métodos e na interface nós temos apenas as assinaturas destes métodos(ou seja, seus cabeçalhos).

Para não esquecer o que é uma interface tente lembrar das units que você escreve emPascal, nelas existe uma área chamada interface na qual você coloca todos os cabeçalhos(assinaturas) de procedimentos e funções (Por isso as classes que implementam interfacesdevem definir estes métodos, ou seja, pensando em Pascal a parte implementation dasunits ficam nas classes).

2.3 Padrões da Programação Orientada a Objetos.Antes de começarmos a escrever nossos programas em Java devemos conhecer o

“estilo” da programação orientada a objetos isso torna nossos programas mais legíveis efáceis de entender.

Por definição todo identificador (nome) de classe em Java começa com letra maiúsculae se caso precise de mais de um nome para identificar sua classe cada um destes nomesdeve também começar com letra maiúscula.

Exemplo de uma definição de classe:class JogadorDeFutebol {...}O padrão para nomeação de métodos e atributos (variáveis) é semelhante, apenas

diferenciando o primeiro nome que deve sempre iniciar com uma letra minúscula.Exemplos:

int totalDeFuncionarios;public void atualizaSaldo( ... ) {...}A medida que formos aprendendo novos conceitos da linguagem Java veremos mais

padrões de desenvolvimento.

Atenção: Java é case sensitive, ou seja, diferencia maiúsculas de minúsculas. Portantouma variável casa é deferente de CASA.

Java é Legal! 10

Page 11: Apostila Java

11

3. Programando em Java.Existem duas categorias de programas Java os aplicativos (standalone) e os applets. A

diferença é que os applets são programas Java que executam em um browser. Vamosaprender a construir aplicativos standalone para depois construirmos nossos applets.

Agora vamos iniciar nossa programação com um exemplo simples de um aplicativo queimprime uma linha de texto no vídeo.

(exemplo HelloJava.java)

Explicação passo a passo do programa exemplo:

//Comentário de uma linha

Comentários em Java seguem a mesma sintaxe de C++, “//” inicia uma linha decomentário, todo o restante da linha é ignorado. Existe também um outro tipo decomentário formado por /* Insira aqui o texto a ser ignorado */ , este tipo de comentáriopode ser intercalado em uma linha de código. Comentários são tratados como espaços embranco.

public class HelloJava {

class é a palavra reservada que marca o inicio da declaração de uma classe. public éum especificador, por enquanto guarde public class como o início da declaração de umaclasse. Todas as classes serão declaradas assim até o tópico modificadores de acesso.

HelloJava

É o nome dado a esta classe. O “abre chaves” marca o início das declarações daclasse que são os atributos e métodos. Esta classe só possui uma declaração, a do métodomain, note que um método, ao contrário de C++, só pode ser declarado {internamente} aclasse a qual pertence, evitando as confusões sobre “escopo”. Desta forma, todo pedaçode código em Java deve pertencer ao abre chaves, fecha chaves da definição de umaclasse.

public static void main (String args[]) {

System.out.println("Java é Legal!");

}

public

É um qualificador do método que indica que este é acessível externamente a estaclasse (para outras classes que eventualmente seriam criadas), não se preocupe com eleagora, apenas declare todos os métodos como public. Voltaremos a este assunto quandoestivermos falando em modificadores de acesso.

static

É um outro qualificador ou “specifier”, que indica que o método deve sercompartilhado por todos os objetos que são criados a partir desta classe. Os métodosstatic podem ser invocados, mesmo quando não foi criado nenhum objeto para a classe,para tal deve-se seguir a sintaxe: <NomeClasse>.<NomeMetodoStatic>(argumentos);.Retornaremos a esta explicação mais tarde, por hora você precisa saber que

Java é Legal! 11

Page 12: Apostila Java

12

particularmente o método main precisa ter essa qualificação porque ele é chamado semque se crie nenhum objeto de sua classe (a classe HelloJava).

void

Semelhante ao void C++ ou C, é o valor de retorno da função, quando a função nãoretorna nenhum valor ela retorna void, uma espécie de valor vazio que tem que serespecificado.

main

Este é um nome particular de método que indica para o compilador o início doprograma, é dentro deste método e através das iterações entre os atributos, variáveis eargumentos visíveis nele que o programa se desenvolve.

(String args[])

É o argumento de main e por conseqüência do programa todo, ele é um vetor deStrings que é formado quando são passados ou não argumentos através da invocação donome do programa na linha de comando do sistema operacional, exemplo:java HelloJava argumentotexto1 argumentotexto2

No nosso caso, ignoramos a possível passagem de argumentos via linha decomando, retornaremos a este assunto mais tarde.

{ ... }

“Abre chaves” e “fecha chaves”. Para quem não conhece C ou C++, eles podem serentendidos como algo semelhante ao BEGIN END de Pascal ou Modula-3, ou seja:delimitam um bloco de código. Os programadores Pascal notarão que variáveis locais dosmétodos podem ser declaradas em qualquer local entre as chaves. Mas por motivos declareza do código declararemos todas no início do abre chaves.

System.out.println("Java é Legal!");

Chamada do método println para o atributo out da classe ou objeto System, oargumento é uma constante do tipo String. println assim como writeln de Pascal, imprimea String e posiciona o cursor na linha abaixo , analogamente print não avança linha. Porhora você pode guardar esta linha de código como o comando para imprimir mensagensna tela, onde o argumento que vem entre aspas é a String a ser impressa. O ; “ponto evírgula” separa operações.

}

Finalmente o fecha chaves termina com a declaração da classe HelloJava.

No exemplo HelloJava não criamos nenhum objeto, o que não é muito útil de se fazerem uma classe principal, agora vamos realmente começar a entender porque devemos criarobjetos que sejam “úteis” para nosso programas. Vamos dar uma olhada no programaCirculo.

Java é Legal! 12

Page 13: Apostila Java

13

3.1 Tipos de Dados.Todas as variáveis em Java precisam ter um tipo de dado. Podem existir duas

“categorias”1. Primitivas.2. Referências.

Uma variável de tipo primitivo pode assumir um valor único de acordo com otamanho apropriado e formato para este tipo primitivo.

Tipos primitivos de dados.

Keyword Description Size/Format

(integers)

byte Byte-length integer 8-bit two's complement

short Short integer 16-bit two's complement

int Integer 32-bit two's complement

long Long integer 64-bit two's complement

(real numbers)

float Single-precision floating point 32-bit IEEE 754

double Double-precision floating point 64-bit IEEE 754

(other types)

char A single character 16-bit Unicode character

boolean A boolean value (true or false) true or false

Arrays, classes e interfaces são tipos de referências (ou seja, um apontador, ou umendereço ). Exemplo:

Importante: Ao contrario de outras linguagens Java não permite a especificação depassagem de variáveis por referência ou valor. Por definição todas as variáveis detipos primitivos são passadas por valor e somente os objetos ( arrays são consideradosobjetos em Java ) são passados por referência.

Java é Legal! 13

Page 14: Apostila Java

14

Nomes de Variáveis:

� Precisam ser identificadores legais começados por uma letra, sublinhado( _ ) ou $.

� Não podem ser palavras reservadas da linguagem Java.

Lista de Palavras reservadas.

abstract double int strictfp **

boolean else interface super

break extends long switch

byte final native synchronized

case finally new this

catch float package throw

char for private throws

class goto * protected transient

const * if public try

continue implements return void

default import short volatile

do instanceof static while

* indica uma palavra reservada que não é atualmente usada. ** palavra que foi adicionada pelo Java 2

Tipos de dados Referências.

Tipos de dados não primitivos em Java são sempre manipulados por sua referência,ou seja, o endereço do objeto ou array é armazenado em uma variável, por comparação,tipos primitivos de dados armazenam não um endereço, mas um valor de seu tipo primitivode dado. Devido ao fato de dos objetos serem manipulados através de suas referências,podemos ter duas variáveis referenciando o mesmo objeto (ou endereço).

Exemplo:

Button p, q;p = new Button(); // p referencia um objeto Button.q = p; // q referencia o mesmo Button.p.setLabel("Ok"); // Uma mudança no Objeto através dep...

Java é Legal! 14

Page 15: Apostila Java

15

String s = q.getLabel(); // ...é visível através de q.// s agora contém "Ok”.

Mas isto não é verdade para tipos primitivos:

int i = 3; // i contem o valor 3.int j = i; // j contem uma copia do valor em i.i = 2; // Mudança em i não altera j.

// Agora, i == 2 e j == 3.

Apesar de Java manipular objetos por referência, isto não é totalmente verdade, paramétodos as referências são passadas por valor. (Atenção isto é muito importante).

Estamos acostumados a dizer que uma referencia para uma variável é passada paraum método, o que não é verdade, Java não trabalha desta maneira. Por exemplo o códigoabaixo não tem o efeito de “swap” desejado:

public void swap(Object a, Object b) {Object temp = a;a = b;b = temp;

}

Com o código acima somente dentro do método swap teríamos o efeito de trocadesejado, isto porque os parâmetros do método contêm apenas as referências para osobjetos, ou seja, uma cópia destes valores.

Então a terminologia correta para o uso de passagem por referência em Java seria:Java manipula objetos por referência, mas passa a referência destes objetos por valor paraos métodos (O problema acima é resolvido utilizando o método clone() da classe Object).

Copiando ObjetosPela razão dos tipos referências não serem passados por valor, atribuir um objeto a

outro em Java não faz a copia deste objeto, Java apenas atribui a referência a este objeto.Considere o trecho de código:

Button a = new Button("Okay");Button b = new Button("Cancel");a = b;

Após a execução destas linhas, a variável a contem a referência para o objeto que btambém referencia. O objeto que a referenciava foi perdido.

A cópia dos dados de um objeto para outro objeto pode ser feita usando-se o métodoclone( ):

Vector b = new Vector;c = b.clone();

Com isso, a variável c faz referencia a um objeto que é cópia de um outro objetoreferenciado por b.

Java é Legal! 15

Page 16: Apostila Java

16

É importante notar que nem todos os tipos suportam o método clone( ). Apenas asclasses que implementam a interface Cloneable podem ser “clonadas”.(Ver java.lang.Cloneable e java.lang.Object.clone( ) );

Arrays também são tipos de referência (objetos), e atribuindo um array para outroapenas copia sua referencia. Para copiar os valores armazenados em um array, deve-seatribuir cada elemento do array individualmente ou usando o método System.arraycopy( ).

Checando igualdade dos objetos.Uma outra implicação da passagem por referencia, é que o teste com o operador = =

só retorna true quando duas variáveis fazem referencia ao mesmo objeto, e não quandopossuem o mesmo valor. Para testar se dois objetos são iguais deve-se usar métodosespeciais. Como por exemplo, strcmp( ) para duas strings. Em Java várias classesimplementam o método equals( ) que também pode ser usado para comparação.

Escopo de variáveis:O escopo da variável é a “região” do programa onde esta variável pode ser

referenciada. Exemplo:

puclic class Escopo { int variavel; //variável de instância ou de classe

public void metodo1() { int variavel; //variável local ou de bloco.

... } ...}

Variáveis de instância podem ser referenciadas em qualquer parte do programa, aopasso que variáveis locais só podem ser referenciadas no bloco onde foram declaradas.

Java permite criar variáveis dentro de blocos de comando como if, else,do/while, e etc.

Usando a classe Escopo como exemplo se quisermos utilizar a variável de classedentro do método metodo1 devemos utilizar a palavra chave this (só utilizar this paraidentificadores com mesmo nome). Exemplo:

public void metodo1() {

int variavel; //variável local ou de bloco.

//variável da classe recebendo valor da variável local.

this.variável = variavel

}

this:

Java é Legal! 16

Page 17: Apostila Java

17

this é uma palavra chave usada num método como referência para o objetocorrente, ela tem o significado de: “o objeto para o qual este trecho de código está sendoexecutado”.

Suponha uma classe que possui a seguinte declaração de atributo: int qualquer; Sequisermos em um método desta classe alterar o atributo qualquer para o valor 3, bastaescrever qualquer=3; , mas este código escrito dentro de um método da classe que declaraqualquer, é totalmente equivalente a this.qualquer=3; , sendo o último uma opção maisclara e capaz de eliminar ambigüidades entre os nomes dos atributos de uma classe e osnomes dos argumentos de um dos métodos desta (quando estes nomes forem iguais). Ouso de this também é válido fazer para chamadas de métodos para o objeto corrente.

Java é Legal! 17

Page 18: Apostila Java

18

3.2 OperadoresOs operadores Java são idênticos aos operadores de C e C++ abaixo segue a tabela

de operadores. Os operadores são mostrados na ordem decrescente de precedência, de cimapara baixo.

Tabela de Operadores Java.

Java é Legal!

Operadores Associatividade Tipo()

[]

.Da esquerda para direita

Parênteses Subscrito de arraySeleção de membro

++ --

Da direita para esquerda Pós-incremento unárioPós-decremento unário

++--+-!~( tipo )

Da direita para esquerda Pré-incremento unárioPré-decremento unárioMais unárioMenos unárioNegação lógica unáriaComplemento unário sobre bitsCoerção (type casting)

*/%

Da esquerda para direita MultiplicaçãoDivisãoMódulo

+-

Da esquerda para direita AdiçãoSubtração

<<>>

>>>

<<=>>=instanceof

Da esquerda para direita Deslocamento de bit para esquerdaDeslocamento de bit para direita com extensãode sinalDeslocamento de bit para direita com extensãode zerosRelacional menor queRelacional maior ou igual aRelacional maior queRelacional maior ou igual aComparação de tipo

= =! =

Da esquerda para direita Relacional é igual aRelacional não é igual a

& Da esquerda para direita E sobre bits^ Da esquerda para direita OU exclusivo sobre bits

OU exclusivo lógico booleano| Da esquerda para direita OU inclusivo sobre bits

OU inclusivo lógico booleano&& Da esquerda para direita E lógico| | Da esquerda para direita OU lógico? : Da direita para esquerda Ternário condicional

18

Page 19: Apostila Java

19

Tabela de Operadores Java (continuação).

Exemplos do Uso de Operadores.

Java é Legal!

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

>>>=

Da direita para esquerda

AtribuiçãoAtribuição e adiçãoAtribuição e subtraçãoAtribuição e multiplicaçãoAtribuição e divisãoAtribuição e móduloAtribuição E sobre bitsAtribuição OU exclusiva sobre bitsAtribuição OU inclusiva sobre bitsAtribuição de deslocamento para esquerdaAtribuição de deslocamento para direita comextensão de sinalAtribuição de deslocamento para direita comextensão de zeros.

19

Page 20: Apostila Java

20

3.3 Estruturas de ControleAqui vamos tratar os blocos de construção que são essenciais para a construção de

programas estruturados. As estruturas de controle nos ajudam a definir o quais instruçõesdevem ser executadas levando em consideração uma determinada condição, basicamenteestas estruturas “transferem” o fluxo de execução.

Durante a década de 1960, tornou-se clara que a utilização indiscriminada daestruturas de controle eram a fonte de muitos grupos de desenvolvimento de software. Etoda a culpa foi para o goto (o mesmo do Pascal, C, Basic,...) que permite “desviar” ocontrole para uma ampla variedade de destinos possíveis em um programa. A noção daprogramação estruturada tornou-se “Eliminem o goto”. Java não tem instrução goto, masesta é uma palavra reservada e não pode ser usada em programas Java.

Java fornece três tipos de estruturas de seleção; A estrutura de seleção if executa(seleciona) uma ação se uma condição for verdadeira e “pula” a ação se for falsa. Aestrutura de seleção if / else executa uma ação de uma condição for verdadeira e executauma ação diferente se a condição for falsa. A estrutura de seleção switch executa apenasuma de muitas ações diferentes, dependendo do valor de uma expressão.

• if : Sintaxe: if ( condição )

commando;

Ou:if ( condição ) {

comando1;comando2;…

}

Importante: Os parênteses em torno da condição são obrigatórios para todas as estruturasde controle.

• if / else: Sintaxe:if ( condição ) comando1; //; obrigatório else comando2;

Ou:if ( condição ) { comando1; comando2; ...} else { comando3; ... }

Java é Legal! 20

Page 21: Apostila Java

21

Ou:if ( condição )

comando1;else if ( condição )

comando2;else ( condição )

comando3;Importante: O comando else sempre se refere ao último if do mesmo escopo.

• switch: Sintaxe:switch ( variável ) { case VALOR1: comando1;

comando3; case VALOR2: comando2; … case VALORN: comandoN default : comandoX;}

Importante: O switch “pula” os cases até encontrar a condição variável = VALORN.Quando o switch encontra o valor ele continua a executar todos os outros cases abaixo, paraevitar que o switch continue a executar comandos devemos “quebrar” a execução usandobreak.Obs: A clausula default é opcional, se nenhum case for encontrado então os comandosapós default são executados, default também pode ser executado se o case anterior nãotiver um break.

• break (dentro do switch): Sintaxe:switch ( variável ) { case VALOR1: comando1;

… break; //cai for a do switch

case VALOR2: comando2; break;

default: comandoN;}

Vimos as estruturas de seleção, agora vamos aprender as estruturas de repetição emJava. Java também oferece três estruturas de repetições: O laço while verifica se umacondição for verdadeira, se sim então ele executa os comandos dentro do seu escopo, casocontrário o loop é terminado. O laço do / while executa os comandos de seu escopoenquanto uma condição for verdadeira, se falsa cai fora do loop. A diferença básica entreum laço while e um laço do / while é que no do / while os comandos vão ser executadospelo menos uma vez, ao passo que no laço while dependendo da condição inicial oscomandosd não chegarão a ser executados. Após os exemplos das estruturas veremos queos dois laços citados anteriormente necessitam de uma sentinela ou contador para que acondição de parada seja satisfeita, e indo mais além temos que criar estas variáveis antes

Java é Legal! 21

Page 22: Apostila Java

22

dos laços. A estrutura for cuida de todos estes detalhes pois fornece espaço para que oprogramador possa criar variáveis (que só vão ser validas dentro do escopo do for), definira condição de parada e estipular qual será o critério de incremento.

• while: Sintaxe:while ( condição )

comando;

Ou:while ( condição ) {

comando1; comando2;

…}

• do / while: Sintaxe:do comando;while ( condiçao );

Ou:do { comando1; comando2; …} while ( condição );

• for: Sintaxe:for ( expressão1; expressão2; expressão3 )

comando; Ou:

for ( expressão1; expressão2; expressão3 ) {comando1;comando2;...

}Onde: expressão1 é onde iniciamos variáveis de controle do laço for. Exemplo: intíndice = 0.expressão2 é a condição de parada do laço. Exemplo: índice < SIZE.expressão3 é o incremento do laço. Exemplo: índice += 2;

Importante: Todas os “parâmetros” (expressões 1, 2 e 3) da estrutura for podem seromitidos. Caso a expressão de condição de parada seja omitida devemos parar o laço forusando break. Um break em uma laço faz com que a próxima instrução após (fora do laço)o laço seja executada e qualquer código que estiver dentro do laço e depois do break seráignorado.

Assim como o break altera o fluxo de controle de um programa a instruçãocontinue também faz o mesmo mas de um modo diferente. Ambas instruções só podem serusadas dentro de estruturas de repetição, com exceção do break que como já vimos podeaparecer dentro de um switch.

Java é Legal! 22

Page 23: Apostila Java

23

Como já foi dito uma instrução break quando executada dentro de um estruturawhile, do / while, for ou switch, causa a saída imediata dessa estrutura. A execuçãocontinua com a primeira instrução depois da estrutura. Utilizações comuns da instruçãobreak são escapar no começo de um laço ou pular o restante de uma estrutura switch.

A instrução continue, quando executada dentro de uma estrutura while, do / whileou for, pula as instruções restantes do corpo do laço e prossegue com a próxima iteração dolaço. Nas estruturas while e do / while, o programa avalia o teste de continuação do laçoimediatamente depois da instrução continue ser executada. Em estruturas for, a expressãode incremento é realizada e depois o programa testa a condição de continuidade do laço.

Instruções break e continue rotuladas.A instrução break pode apenas interromper a estrutura que a envolve

imediatamente. Para interromper um conjunto de aninhado de estruturas, podemos utilizar ainstrução rotulada break. Essa instrução quando executada em uma das estruturas derepetição ou switch, ocasiona a saída imediata dessa estruturas e de um numero qualquer deestruturas de repetição que a envolvem, a execução do programa prossegue com a primeirainstrução após o bloco rotulado.

A instrução continue rotulada, quando executada em uma das estruturas derepetição pula as instruções restantes do corpo do dessa estrutura e de qualquer numero deestruturas de repetição que a envolvem e prossegue com a próxima iteração da estrutura derepetição rotulada que a envolve.

3.4 Criando Classes em JavaAgora vamos realmente de fato começar com a programação orientada a objetos. A

unidade central da programação orientada a objetos é a classe (Java não tem nada parecidocom o record do Pascal ou struct do C. Na verdade as nossas classes é que representamestas estruturas). Todos os programadores de linguagens orientadas a objetos se concentramem escrever classes que forneçam atributos e comportamentos bem definidos e se possívelescrever esta classe para que outros programadores possam tirar proveito. O ponto centralda programação orientada a objetos é a reutilização de código, Java possui uma extensaAPI, a qual tiramos proveito ao escrever nossos aplicativos Java.

Em Java nós nunca começamos a escrever nossas classes do zero. Todos as classesem Java herdam da classes Object (pacote java.lang ) a não ser que especificado de outramaneira. Como já vimos no começo deste capitulo um classe em Java é definida com apalavra reservada class (Nota: Começamos com public, porque ainda não vimos osmodificadores de acesso) seguida do nome da nossa classe.

Definição genérica de uma classe:[modificador de acesso] class NomeDaClasse {

...}

As chaves indicam onde começa e onde termina nossa classe e são obrigatórias.Note que esta classe genérica é uma subclasse de Object isso significa que nossa classe vaiherdar métodos e atributos da classe Object.

Mas caso queiramos que a nossa classe seja descendente de alguma outra classe quenão seja Objetc, o que devemos fazer?

Java é Legal! 23

Page 24: Apostila Java

24

Para especificar que nossa classe deve herdar de outra, devemos logo após o nomeda classe informar de qual classe vamos herdar, fazemos isso através da palavra reservadaextends.

Exemplo de herança:[modificador de acesso] class NomeDaClasse extends ClassePai{

... ...}

Quando fazemos isso estamos dizendo que a classe NomeDaClasse é uma subclassede ClassePai ou que NomeDaClasse herda de ClassePai. Isso significa que NomeDaClassevai herdar todos os atributos e métodos de ClassePai. Mas por que utilizamos herança?Utilizamos herança para tornar a ClassePai mais especifica ou para adicionar novoscomportamentos.

Mas apenas utilizar a palavra reservada extends não garante que iremos conseguircompilar nossas classes. A API Java está toda dividida em pacotes (packages), quandoutilizamos objetos em nossos programas Java devemos informar qual pacote está a classeque define tal objeto. Por default o pacote java.lang é importado implicitamente em todosos nossos programas Java, isso faz sentido, uma vez que todas as classes Java herdam deObject por default e a classe Object faz parte do pacote java.lang. Para importar nossasclasses usamos a palavra reservada import seguida do nome pacote que queremosimportar. Todas as instruções import devem vir antes da definição da classe.

Exemplo, importando a classe JButton do pacote javax.swing:import javax.swing.JButton;class TesteImporta {

JButton b = new JButton( “Um Botão” );…

}Se quisermos importar várias classes de um mesmo pacote ao invés de escrever

varias instruções import podemos usar o * após o nome do pacote. Nota: usar * após onome do pacote em uma instrução import não significa que todas as classes serãoimportadas, somente aquelas classes que são mencionadas no nosso programa Java serãoimportadas.

Como já sabemos como declarar nossas classes agora vamos a parte maisinteressante que é o que aparece dentro de uma classe. Agora vamos aprender a definiratributos e comportamentos para nossas classes. Entenda atributos como variáveis em POOas variáveis globais são chamadas de variáveis de classe ou de instância. Oscomportamentos são denominados métodos. Normalmente as classes oferecem métodosque operam em cima dos atributos. No próximo capitulo veremos porque é crucial queapenas os métodos fornecidos pelo programador possam acessar os atributos.

Atributos de uma classeOs atributos (variáveis) de uma classe podem ser de um dos tipos primitivos, pode

ser uma referência para um objeto ou pode ser um array. Deixamos para falar sobre arraysaqui pois é um tipo de dado especial.

Para declarar uma variável dentro da nossa classe devemos fazer:[modificador de acesso] TIPO nomeDaVariavel;

Java permite que as variáveis tenham um valor atribuído logo em sua declaraçãocomo mostra o exemplo abaixo:

Java é Legal! 24

Page 25: Apostila Java

25

[modificador de acesso] TIPO nomeDaVariavel = VALOR;

ArraysOs arrays em Java funcionam parecidos com os arrays em C e C++, na verdade

apenas o modo de declarar e acessar os arrays é que são parecidos.Como já foi citado anteriormente os arrays são considerados objetos em Java, e todo

o array em Java “conhece” seu próprio tamanho (através da variável de instância e palavrareservada length), portanto merecem uma atenção especial.

Um array é um grupo de posições contíguas na memória que possuem o mesmonome e o mesmo tipo. Para referir-se a uma localização ou elemento particular no array,especificamos o nome do array e o número da posição (ou índice) do elemento particular doarray.

Os arrays como em qualquer outra linguagem precisam ter um tipo de dadoassociado. Modos de se declarar um array:

TIPO nomeDoArray[ ];TIPO[ ] array1, array2, ..., arrayN;

Não se pode informar o tamanho do array na sua declaração, é um erro de sintaxe.Isto é feito na instanciação (alocação de espaço) do array.

Basicamente existem três 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 não permite que o programador especifiquequal vai ser a faixa dos índices do vetor. Por definição todo índice de array começa noZERO. No primeiro exemplo acima temos um array de tamanhoDoArray posições, masos elemento são acessados na faixa de 0 a tamanhoDoArray-1. Tentar acessar umelemento fora desta faixa causa um erro de execução.

Na primeira forma de alocação apenas estamos dizendo ao compilador para alocar oespaço para o nosso array, nas duas ultimas formas não precisamos informar qual otamanho do nosso array, ele será definido pela lista de valores que estão entre chaves eseparados por virgulas. Cada posição do nosso array já contem um valor. Para sabermosqual o tamanho do nosso array é só acessar a variável inteira length da seguinte maneira:

nomeDoArray.length

(Exemplos)Arrays multidimensionais

Os arrays citados até agora tinham apenas uma dimensão, ou seja, eram vetores.Para declarar que um array deve ter mais de uma dimensão apenas acrescentamos outro(s)par(es) de colchetes nas declarações do array. Exemplos:

TIPO nomeDoArray[ ][ ];TIPO nomeDoArray[ ][ ] = new TIPO[ nroDeLinhas ][ nroDeColunas ];

Java é Legal! 25

Page 26: Apostila Java

26

Uma das características importantes de arrays multidimensionais é que os sub-arrays podem ter dimensões diferentes. Isso torna a alocação mais eficiente pois permite aoprogramador instanciar exatamente a quantidade de elementos que precisa.

Exemplo:int array[ ][ ] = { {1, 2, 3, 4, 5},

{1, 2, 3}, {1,2}

};

O trecho de código acima nos da um array bidimensional (uma matriz) com trêslinhas (lembre-se que nesse tipo de inicialização você não precisa indicar qual a dimensãodo array, o compilador faz isso para você contando os elementos na lista). Note que cadalinha tem comprimentos diferentes. Mas como saber qual o comprimento de cada linha?Através do já conhecido length.

Para o exemplo anterior teríamos:array[ 0 ].length = = 5.array[ 1 ].length = = 3.array[ 2 ].length = = 2.

Inicialização automática de Variáveis.Em Java as variáveis de classe e objetos tem sua inicialização automática isto

significa que logo quando são declaradas estas variáveis já tem valores atribuídosautomaticamente por default estes valores estão representados na tabela abaixo:

byte 0short 0

int 0long 0 Lfloat 0 F

double 0 DBoolean false

Char \u0000Objetos null

Dentro de métodos e outros blocos sempre se deve iniciar uma variável ou ocompilador irá apresentar uma mensagem de erro.

Exemplo: Erro gerado ao compilar o Arquivo TesteVar.javaTesteVar.java:7: variable variavel might not have beeninitialized

System.out.println("Valor " + variavel); ^ 1 error.

Inicialização automática de arrays.Quando alocamos memória para arrays (ou seja, instanciamos este array) todos os

“campos” deste array vão ser iniciados automaticamente de acordo com o tipo especificado,independente do array ser variável de classe ou local.

Ou seja, quando fazemos:int vetor[ ] = new int[ 10 ];

Java é Legal! 26

Page 27: Apostila Java

27

Estamos instanciando um array de inteiros com dez posições, e todas as posiçõesdeste array já estão “preenchidos” com o valor 0 (zero) por default,

Analogamente se fizermos:Button vetorDeBotoes[ ] = new Button[ 5 ];

Vamos estar alocando para o vetorDeBotoes o espaço para 5 objetos do tipoButton, note que os elementos do array ( vetorDeBotoes[ i ], i=1,2,3,4,5 ) não foraminstanciados mas têm por default o valor null.

Importante: Antes de usarmos o operador new para instanciar os arrays (asreferências) estão com o valor null. Se tentarmos exibir um elemento de um array que aindanão foi instanciado teremos uma NullPointerException.

Métodos de um classeOs métodos determinam o comportamento dos objetos de um classe. Quando um

método é invocado, se diz que o objeto está recebendo uma mensagem (para executar umaação). Programas complexos formam conjuntos de objetos que trocam mensagens entre sigerenciando inclusive os recursos do sistema.

A seguir temos a maneira de declaração de métodos em Java:[modificador de acesso] [tipo de retorno] nomeDoMétodo( lista de parâmetros ) { ...

...}

O programa a seguir exemplifica chamadas de métodos, para tal define um objetoque serve como contador, a implementação representa a contagem no atributo num que éum número inteiro. Os métodos são simples: incrementa adiciona um ao contador emqualquer estado e começa inicializa a contagem em zero. Decrementa faz o oposto deincrementa.

(Exemplo Contador.java e TesteContador.java)Nos exemplos acima nossos métodos não retornavam nenhum valor, ou seja, tinham

tipo de retorno void. Os métodos podem ter qualquer tipo de retorno inclusive objetos. Diferente de Pascal, Java permite que o programador escreva métodos com nomes

iguais desde que as listas de parâmetros destes métodos sejam diferentes. Isto se chamasobrecarga de métodos (ou Overloading). Java diferencia os métodos através de seusnomes e listas de parâmetros.

• Quando definimos que nosso método tem um tipo de retorno diferente de void eleobrigatoriamente deve devolver um valor através da palavra chave return VALOR.

• Omitir o tipo de valor retorno em uma definição de método é um erro de sintaxe.• Retornar um valor de um método cujo tipo foi definido como void é um erro de

sintaxe.• Declarar parâmetros de métodos do mesmo tipo como float x, y em vez de float x,

float y é um erro de sintaxe porque são exigidos tipos diferentes de para cadaparâmetro da lista de parâmetros.

• Redefinir um parâmetro de um método dentro do corpo do método é um erro desintaxe.

• Passar para um método um argumento que não é compatível com o tipo doparâmetro da lista de parâmetros é um erro de sintaxe.

• Definir um método dentro de outro método é um erro de sintaxe.

Java é Legal! 27

Page 28: Apostila Java

28

Construtores de classes Construtores são métodos especiais chamados pelo sistema no momento da criação

de um objeto. Eles não possuem valor de retorno, porque você não pode chamar umconstrutor para um objeto, você só usa o construtor no momento da inicialização 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 classeString, pré-definida na linguagem o construtor tem a forma String( “Constante do tipoString” ); com o argumento entre aspas que é especificado pelo programador. Ele seriachamado automaticamente no momento da criação, declaração de uma String, semnecessidade de uso do nome do construtor como método, apenas dos argumentos:

String a;a = new String( “Texto” ); //alocacao e inicializacao atraves do construtora.mostra(); //mostra so pode ser chamada depois do construtor

Nos exemplos anteriores também usávamos construtores no momento de inicializar nossosobjetos, só que eles não possuíam argumentos.

Para não esquecer: A grosso modo o construtor é um “método” que somente échamado na alocação de um objeto (quando usamos new).

Garbage CollectionEm Java não é problema do programador se preocupar com a memória que foi

alocada pelos seu objetos. Java implementa o coletor de lixo automático que verifica seexiste alguma referencia para um objeto na memória, caso não exista este objeto é marcadopara a coleta de lixo. Existe um método na classe System (System.gc( )) que faz umachamada explicita ao coletor de lixo, mas não é garantido que o coletor de lixo vai serexecutado exatamente após a chamada deste método, isto porque o coletor é uma thread debackground, ou seja só executa quando a CPU esta ociosa. Ou seja, o coletor de lixo Javanão pode ser forçado. Falaremos mais do coletor de lixo quando estivermos no capitulo 9.

3.5 Exemplos

Java é Legal! 28

Page 29: Apostila Java

29

4. Modificadores de acessoNeste capitulo vamos compreender a importância dos modificadores de acesso

(public, protected e private). Primeiramente estes modificadores são cruciais para umaboa engenharia de software pois torna acessível apenas parte do código das nossas classes.

(Obs: Os modificadores são palavras reservadas)• public: Este modificador indica que o membro é acessível para todas as

classes de qualquer pacote. (Acessível para o “mundo”). Este modificador emais comumente usado para métodos e classes. Uma classe public indicaque ela pode ser instanciada por qualquer objeto (dentro de qualquer outraclasse). Os métodos e atributos declarados como public podem seracessados por qualquer objeto dessa classe.

• private: Este modificador implica no nível mais alto de restrição de acessopois os membros private só podem ser acessados dentro da própria classe.Usamos private para atributos, métodos e inner-classes (capitulo 5). Usarprivate na definição da classe principal é um erro de sintaxe. É lógico quequando definimos algum membro como private dentro de uma classe,devemos também fornecer membros public para o acesso a estes membros,caso contrario os membros private ficam inacessíveis!!

• protected: O modificador protected define um nível de acessointermediário a public e private. Membros declarados como protected sópodem ser acessados dentro da classe, por subclasses e classes do mesmopacote. O modificador protected só pode ser usado em métodos e atributos.

Você com certeza deve estar se perguntando agora: Se eu só posso utilizar omodificador public nas classes por que sempre tenho que usa-lo? Todas as minhas classesnão serão public por default? A resposta é simples: public não é default do Java, quandonão definimos nenhum modificador de acesso, o acesso é feito por pacote. Então existemais um modificador de acesso? Sim. Qual é? Não tem nome.

Isso mesmo, o modificador que na verdade não é um modificador tem acesso porpacote. Evite ao máximo não especificar modificadores de acesso em seus programas, istopode evitar vários bugs.

4.1 Níveis de acessoPodemos dizer que o Java suporta quatro níveis de acesso:

Especificador classe subclasse package mundoprivate X

protected X X Xpublic X X X X

package X X

4.2 Outros modificadores (final, static e abstract)Existem outros modificadores mas não são chamados de modificadores de acesso,

mas nem por isso deixam de ser menos importantes. Neste bloco iremos saber comodeclarar constantes em Java, como “proibir” que nossas classes sejam herdadas por outra.Vamos ver também como criar classes abstratas e porque criar tais classes. E vamosaprender como funcionam os membros estáticos.

Java é Legal! 29

Page 30: Apostila Java

30

• final: A palavra reservada final ante de classes especifica que a classe emquestão não pode ser mais herdada. Basicamente fazemos isso quando aclasse declarada como final já é o mais específico possível que não fazsentido entendê-la. Apenas uma pequena parte das classes da API Java sãodo tipo final. Quando queremos declarar constantes em Java utilizamos finalantes de atributos. As constantes não são iniciadas automaticamente como asoutras variáveis em Java, as constantes devem ser inicializadas no momentode sua criação ou devem ser inicalizadas dentro de cada construtor da classeonde são declaradas. Somente classes e atributos podem ser declarados comofinal.

• abstract: O modificador abstract indica que uma classe deve ser abstrata ouseja, esta classe vai definir métodos, ou melhor, vai definir os cabeçalhosdos métodos. Todos os métodos que não são implementados devem serdeclarados abstract e como conseqüência uma classe que possui métodosabstract deve ser declarada abstract também. O propósito de criar classesabstract é que definimos que uma classe que herda de outra classe abstractdeve implementar todos os métodos declarados abstract na sua superclassecaso contrário deve ser declarada abstract também, declarar classes abstractgarante que pelo menos uma subclasse deve implementar os métodosabstract isso permite definir comportamentos para subclasses. Importante:classes abstratas não podem ser instanciadas!!! Somente classes e métodospodem ser declarados abstratos.

• static: O modificador static indica que todos os objetos instanciados temapenas uma cópia deste atributo, ou seja todos os objetos “apontam” para omesmo membro static. Os membros static estão disponíveis antes mesmo dequalquer objeto ser instanciado. Para acessar os membros static temos duasopções uma é através do nome da classe seguido pelo nome do membrostatic, a outra é através de qualquer referência para um objeto da classe quecontém membros static seguido pelo nome do membro static. Apenasatributos e métodos podem ser declarados static.

Importante: Sempre que possível defina os atributos de sua classe como private eforneça métodos public get e set para acessá-los, isso torna nossas classes menos sujeitas aerros e usuários mal intencionados.

Eficiência: Alguém pode argumentar que programas que usam muitas chamadas demétodos podem se tornar pouco eficientes e que poderia ser melhor obter acesso direto aosdados de um tipo definido pelo usuário ao invés de passar por todo o trabalho de cópia deargumentos, inserção de função na pilha, etc.

Em verdade não se perde muito em eficiência, por que tal metodologia deprogramação nos leva a organizar o código de maneira mais compacta. E além disso muitasvezes não se deseja permitir sempre o acesso direto aos dados de um tipo definido pelousuário por razões de segurança.

4.3 Exemplos

Java é Legal! 30

Page 31: Apostila Java

31

5. Componentes (Swing x AWT)Neste capitulo vamos aprender como criar aplicativos que utilizam as classes dos

pacotes que contêm componentes de GUI (Graphics User Interface – Interface Gráfica como Usuário). Somente iremos utilizar componentes Swing em nossos aplicativos por diversasrazões. A principal é que os componentes Swing são escritos totalmente em Java ao passoque componentes AWT tinham parte do código dependente de máquina isso fazia com queos aplicativos Java que usavam componentes GUI AWT tivessem aparências diferentes emdiferentes sistemas operacionais. Os componentes Swing estão disponíveis desde a versão1.2 da linguagem Java e se tornaram os componentes GUI padrão da linguagem.

5.1 Usando Componentes SwingNeste capitulo não vamos ficar filosofando a respeito dos componentes até porque

não existe muita teoria sobre eles. O que devemos saber é onde estão os componentes GUIna API Java. Os componentes AWT (que nós não vamos usar) estão no pacote java.awt eos componentes Swing estão no pacote javax.swing.

5.2 Usando LayoutsAgora vamos aprender como posicionar nossos componentes em nossos aplicativos

para obter melhores visualizações. Não iremos ver todos os tipos de layouts apenas os maisusados, todos os layouts estão 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 façam alguma coisa realmente útil. Os “ouvidoresde evento” (melhor chamá-los de Listeners) são interfaces (lembre-se de que as interfacesem Java não possuem nenhuma implementação de código, contém apenas as assinaturasdos métodos) que chamam um determinado método de acordo com um evento associado aalgum objeto. Por exemplo, poderíamos querer tratar o clique do mouse dentro de umJFrame, ou se um usuário estivesse digitando um texto em um JTextField e se por acasoele digitasse um caractere invalido, nosso programa poderia emitir um som que o deixassesurdo. Os listeners que iremos utilizar se encontram no pacote java.awt.event.

As interfaces existem para definir um comportamento, mas como utilizar interfacesem nossos programas? Existem duas formas: podemos dizer que nossa classe implementaesta interface, quando dizemos que nossa classe implementa uma cetra interface X, nossaclasse deve implementar (definir) todos os métodos desta interface, mesmo que nossasclasse não precise de todos os métodos somos obrigados escrevê-los. Para que nossa classepossa implementar uma interface usamos a palavra reservada implements seguido do nomeda Interface.

Nota: implements deve vir depois da instrução extends (se esta existir).Bom bem no começo desta apostila você deve ter lido ou alguém deve ter contado

para você que Java não permite múltipla herança e para contornar esse problema, podemosdizer que nossas classes implementam várias interfaces, para declarar isto em nossos

Java é Legal! 31

Page 32: Apostila Java

32

programas devemos apenas separar por vírgula os nomes das interfaces na declaração denossas classes.

Exemplo:public class MyClass extends JFrame implements ActionListener {

…}

Estamos dizendo que nossas classe herda de JFrame e implementa a interfaceActionListener.

Exemplo:public class MyClass implements ActionListener, MouseListener {

…}

Estamos dizendo que MyClass implementa as interfaces ActionListener eMouseListener.

Inner-classesJá sabemos que não podemos declarar métodos dentro de métodos em Java, mas não

fique revoltado pois, podemos criar as classes internas (chamem de inner-class) que sãoclasses dentro de classes. Muitos programadores não gostam de inner-class, pois dizem queelas “violam” o conceito de POO, pois inner-classes podem ter acesso aos membros privateda 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 não precisa bater em seu irmão menor por isto. Inner-classes podemser private, pois são consideradas como um “membro” da classe que é sua “proprietária”,definimos uma inner-class como private para que ninguém fora da nossa classe possainstanciar um objeto InnerClass pois este objeto tem acesso aos nossos membros private.Podemos também ter static inner-classes, mas elas não fazem sentido algum uma vez queela vai existir sem que nenhum objeto seja instanciado e só vai poder acessar membrosstatic da classe proprietária.

Importante: Uma inner-class só pode ser instanciada através de um objeto de suaclasse proprietária. Uma classe pode ter várias inner-classes.

Bom, mas por que estamos falando de inner-classes? Porque existe uma outramaneira de adicionar listeners aos nossos componentes, é através de inner classesanônimas. Por exemplo se quisermos que nosso botão “b” imprima uma linha de texto novídeo a cada clique devemos fazer:

Java é Legal! 32

Page 33: Apostila Java

33

b.addActionListener(

new ActionListener( ) {

public void actionPerformed( ActionEvent e ){

System.out.println( “Clique” );}

});//Ficou bonito não?

5.4 Exemplos

Java é Legal! 33

Page 34: Apostila Java

34

6. Tratamento de ExceçõesUma exceção é uma indicação de que ocorreu um problema durante a execução do

programa. Os recursos que vamos ver permitem escrever programas mais claros, maisrobustos e mais tolerantes a falhas. Também analisamos quando o tratamento de exceçõesdeve ser utilizado.

6.1 Por que o tratamento de exceções?O tratamento de exceções é fornecido para permitir aos programas capturar e tratar

erros em vez de deixá-los ocorrer e arcar com as conseqüências. Veremos que as exceçõessão objetos de classes derivadas da superclasse Exception. Mostraremos como lidar comexceções “não capturadas”. Analisaremos como exceções inesperadas são tratadas por Java.

O tratamento de exceções pode ser visto como outro meio de retornar o controle deum método ou sair de um bloco de código. Normalmente, quando ocorre uma exceção, elaé tratada por um chamador do método que gera a exceção, por um chamador dessechamador, ou tão longe para trás na pilha de chamadas quanto seja necessário paraencontrar um tratador para essa execução.

Com outras linguagens de programação que não suportam o tratamento de exceções,os programadores freqüentemente demoram para escrever o código de processamento deerro, e, as vezes, simplesmente o esquecem de fazer. Isso resulta em produtos menosrobustos, e, portanto, inferiores. Java força o programador a lidar com o tratamento deexceções desde o começo de um projeto. Ainda assim, o programador precisa de umesforço considerável para incorporar uma estratégia de tratamento de exceções aos projetosde software.

6.2 Como tratar exceções (uso do try, catch e finally).O programador inclui em um bloco try o código que pode gerar uma exceção e

qualquer código que não pode ser executado se uma exceção ocorrer. O bloco try éimediatamente seguido por zero ou mais bloco catch. Cada bloco catch especifica o tipo deexceção que ele pode capturar e contém um tratador exceção. Depois do ultimo bloco catch,um bloco finally opcional fornece o código que é sempre executado, independentemente deocorrer ou não uma exceção. Como veremos, o bloco finally é um lugar ideal para códigoque libera recursos. O bloco try deve ser seguido por um bloco catch ou por um blocofinally.

Quando um método dispara um exceção, o controle de programa sai do bloco try econtinua a execução no primeiro bloco catch. O programa pesquisa nos blocos catch emordem, procurando um tratador apropriado (em breve discutiremos o que torna um tratador“apropriado”). Se o tipo de exceção disparada corresponder ao tipo de parâmetro em umdos blocos catch, o código daquele bloco catch é executado. Se um bloco try termina comsucesso, sem disparar nenhuma exceção, o programa pula os tratadores de exceção paraaquele bloco e retorna a execução depois do último bloco catch. Se um bloco finallyaparece depois do último bloco catch, ele é executado independentemente de ter ocorridouma exceção.

Em uma definição de método, uma clausula throws especifica as exceções que ométodo dispara. Esta clausula aparece depois da lista de parâmetros e antes do corpo dométodo. A clausula contém uma lista separada por virgulas das exceções que o métodopoderá potencialmente disparar se ocorrer um problema enquanto o método esta sendoexecutado. Tais exceções podem ser disparadas por instruções no corpo do método ou elas

Java é Legal! 34

Page 35: Apostila Java

35

podem ser disparadas por métodos chamados no corpo. O ponto no qual o disparo ocorre échamado ponto de disparo.

Quando ocorre uma exceção, o bloco em que a exceção ocorreu termina (expira) – oprograma não pode retornar diretamente ao ponto de disparo. Na ocorrência de umaexceção, é possível passar informações para o tratador de exceções a partir da vizinhançaem que ocorreu a exceção. Essas informações são do tipo de objeto de exceção disparadoou informações colhidas da vizinhança em que a exceção ocorreu e colocadas no objetodisparado.

Blocos TryUma exceção que ocorre em um bloco try normalmente é capturada por um tratador

de exceções especificado por um bloco catch imediatamente após aquele bloco try comoem:

try {codigo que pode gerar uma exceção.

}catch ( TipoDeExceção referenciaParaExceção ) {

instruções para processar uma exceção.}

• É um erro de sintaxe separar com outro código os tratadores catch quecorrespondem a um bloco try particular.

Disparando uma exceçãoA instrução throw é executada para indicar que uma exceção ocorreu (isto é, um

método não pode ser completado com sucesso). Esse processo se chama disparar umaexceção. A instrução throw especifica um objeto a ser disparado. O operando de um throwpode ser qualquer classe derivada da classe Throwable (pacote java.lang). As duassubclasses imediatas da classe Throwable são exception e Error. Erros são problemas desistema particularmente sérios que geralmente não devem ser capturados. Exceptions sãocausadas por problemas que devem ser capturados e processados durante a execução doprograma para torná-lo mais robusto. Se o operando throw é um objeto da classe Exception,ele é chamado de objeto de exceção.

• É um erro de sintaxe capturar o mesmo tipo em dois catch diferentes associadoscom um bloco try em particular.

• Colocar catch (Exception exception) antes de outros blocos catch que capturamtipos específicos de exceções impede que esses blocos sejam executados; O tratadorde exceções que captura o tipo Exception deve ser colocado por ultimo na lista dostratadores de exceções 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 forcolocado antes de um catch para tipos de subclasses daquela classe.

Clausula throwsA clausula throws lista as exceções que podem ser disparadas por um método, como

em:

Java é Legal! 35

Page 36: Apostila Java

36

int nomeDeMetodo ( lista de parâmetros )throws TipoDeExceção1, TipoDeExceção2, TipoDeExceção3,...

{//corpo do método

}Os tipos de exceções que são disparadas por um método são especificados na

definição do método como uma lista separada por virgulas em uma clausula throws. Ummétodo pode disparar objetos das classes indicadas ou pode disparar objetos de suassubclasses.

Algumas exceções podem ocorrer em qualquer ponto durante a execução doprograma. Muitas dessas exceções podem ser evitadas por codificação adequada. Trata deexceções durante a execução e elas derivam da classe RuntimeException. Por exemplo, se oprogramam tentar acessar um subscrito de array fora do intervalo, ocorre uma exceção dotipo ArrayIndexOutOfBoundsException (derivada de RuntimeException). O programaevidentemente pode evitar esse problema; Portanto é uma exceção durante a execução.

Bloco finallyOs programas que obtém certos tipos de recursos devem devolver explicitamente

esses recursos para o sistema para evitar a perda de recursos. Em linguagens deprogramação como C e C++, o tipo mais comum de perda de recurso e a perda de memória.Java realiza coleta automática de lixo de memória não mais necessária para os programas,evitando assim, a maioria das perdas de memória. Mas outros tipos de perdas de recursospodem ocorrer em Java.

O bloco finally é opcional. Se estiver presente, ele é colocado depois do ultimobloco catch de um bloco try, como segue:

try {instruções;instruções de aquisição de recursos;

}catch ( TipoDeExceção exceção1 ) {

instruções de tratamento de exceção;}catch ( OutroTipoDeExceção exceção2 ) {

instruções de tratamento de exceção;}finally {

instruções;instruções de liberação de recurso;

}

Java garante que o bloco finally (se houver um) será executado independentementede qualquer exceção ser ou não disparada no bloco try. Corresponde ou quaisquer de seusblocos catch correspondentes. Java também garante que o bloco finally (se houver um) seráexecutado se um bloco try for encerrado com instrução return, break ou continue.

6.3 Exemplos

Java é Legal! 36

Page 37: Apostila Java

37

7. Manipulando Arquivos e StreamsUm programa Java abre um arquivo através da criação de objetos e a associação de

um fluxo de bytes a este objeto. Java também pode associar fluxos de bytes associados comdispositivos. Na verdade, Java cria três objetos de fluxo que são associados comdispositivos quando a execução de um programa Java é iniciada: System.in, System.out eSystem.err. Os fluxos associados com esses objetos fornecem canais de comunicação entreum programa e um dispositivo particular. Por exemplo, o objeto System.in (objeto de fluxode entrada padrão) normalmente permite que um programa insira dados pelo teclado, oobjeto System.out (objeto de fluxo de saída padrão) normalmente permite aos programagerar como saída dados na tela e o objeto System.err (objeto de fluxo de erro padrão)permite a um programa gerar como saída mensagens de erro na tela. Cada um desses fluxopode ser direcionado. Para System.in isso permite ao programa ler bytes de fonte diferente.Para System.err isso permite enviar a saída para um destino diferente, como um arquivoem disco. A classe System fornece métodos setIn, setOut e setErr para redirecionar osfluxos padrões.

Os programas Java fazem o processamento de arquivos usando classes do pacotejava.io. Esse pacote inclui definições para as classes de fluxo como FileInputStream (paraentrada baseada em bytes de um arquivo), FileOutputStream (para saída baseada em bytespara um arquivo), FileReader (para entrada baseada em caracteres de um arquivo) eFileWriter (para saida baseada em caracteres para um arquivo). Os arquivos são abertoscriando-se objetos dessas classes de fluxo, que herdam das classes InputStream,OutputStream, Reader e Writer, respectivamente. Portanto, os métodos dessas classes defluxo também podem ser aplicados a fluxos de arquivo. Para realizar a entrada e saída detipos de dados, os objetos das classes ObjectInputStream, DataInputStream,ObjectOutputStream e DataOutputStream serão utilizados junto com a classe de fluxode arquivos baseadas em bytes, FileInputStream e FileOutputStream.

7.1 Escrevendo e resgatando informações de arquivos em JavaAqui vamos aprender como abrir um arquivo e salvar nosso objetos dentro deste

arquivo. Para escrever nosso objetos em arquivo vamos utilizar objetos da classeObjectOutputStream, e para resgatar estes objetos iremos utilizar objetos da classeObjectInputStream. O acesso aos arquivos com estes fluxos é seqüencial o que indica quedevemos resgatar os objetos do arquivo na ordem em que foram escritos. Estas classesfornecem métodos para escrever e resgatar qualquer tipo de objeto, desde que estes objetosimplementem a interface Serializable, esta interface não contém métodos apenas servecomo uma identificação para objetos.

Para criar arquivos de acesso aleatório vamos utilizar objetos da classeRandomAccessFile, esta classe têm todos os recursos das classes DataInputStream eDataOutputStream discutidos anteriormente. Quando o programa associa um objeto daclasse RandomAccesFile com um arquivo, o programa lê ou escreve os dados a partir daposição do arquivos especificada pelo ponteiro de posições no arquivo e todos os dados sãolidos ou gravados como tipos primitivos de dados. Os programas de processamento dearquivo de acesso aleatório raramente gravam um único campo em um arquivo.Normalmente, eles gravam um objeto por vez, como mostramos nos seguintes exemplos.

Java é Legal! 37

Page 38: Apostila Java

38

7.2 A classe FileNesta seção vamos discutir a classe File, que é particularmente útil para recuperar

do disco as informações sobre um arquivo ou diretório. Na verdade, os objetos da classeFile não abrem um arquivo nem fornecem nenhuma capacidade de processamento dearquivo. Uma aplicação da utilização de um objeto File é verificar se existe um arquivoantes de tentar abrir o arquivo. Nos exemplos anteriores vimos que abrir um arquivo comum objeto do tipo FileOutputStream descarta o conteúdo do arquivo sem aviso prévio. Seo programa determina que o arquivo já existe, o programa pode avisar o usuário que osdados do arquivo original estão prestes a serem perdidos.

Dica: Ao construir strings que representam informações sobre caminho, utilizeFile.separatorChar para obter o caractere separador próprio da maquina local, em vez deusar explicitamente / ou \.

7.3 Exemplos

Java é Legal! 38

Page 39: Apostila Java

39

8. AppletsComo 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 quecontém uma applet, esta applet é baixada para o navegador e começa a ser executado.Fundamentalmente as applets não tem muitos segredos pois elas incorporam código Java jávisto nesta apostila. As únicas diferenças são os métodos que utilizamos em nossas applets(init, start, stop, paint e destroy).

8.1 Como criar uma AppletPara 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. Após 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>Após a criação 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 Métodos da classe JAppletNa classe JApplet estão definidos 5 métodos chave que são chamados

automaticamente durante a execução de um applet. São eles: init, start, stop, paint edestroy.

Esses métodos são definidos na API para não fazer nada, a menos que você forneçauma definição para eles na definição de classe do seu applet. Se você deseja utilizar estesmétodos em uma applet que você está escrevendo, deve definir o cabeçalho do métodocomo mostrado abaixo, caso contrário o método não será chamado automaticamentedurante a execução da applet.

• public void init( ): Este método é chamado uma vez pelo appletviewer oupelo navegador quando uma applet é carregado para execução. Ele executa ainicialização de uma applet. Ações típicas a realizar aqui são a inicializaçãode variáveis de instancia e dos componentes GUI da applet e o carregamentode sons para reproduzir ou imagens a exibir, ou criação de threads.

• public void start( ): Esse método é chamado depois que o método initcompleta sua execução e a cada vez que o usuário retorna para a pagina emque a applet reside. Esse método executa quaisquer tarefas que devam sercompletadas quando a applet é carregado pela primeira vez no navegador, eisso deve ocorrer cada vez que a pagina html em que o applet reside érevisitada. Ações típicas realizadas aqui incluem iniciar uma animação eoutro threads.

• public void paint( Graphics g ): Este método é chamado depois que ométodo init completou sua execução e o método start começou a serexecutado, para desenhar a applet. Também é chamado automaticamentecada vez que a applet precisa ser repintada. Por exemplo, se o usuário cobre

Java é Legal! 39

Page 40: Apostila Java

40

a applet com outra janela e então descobre a applet, o método paint échamado. Ações típicas realizadas aqui envolvem desenhar com o objetoGraphics que é passado automaticamente para o método paint para você.

• public void stop( ): Este método é chamado quando a applet deve parar deexecutar – normalmente quando o usuário do navegador deixa a pagina htmlem que a applet reside. Esse método executa quaisquer tarefas que sãoexigidas para suspender a execução da applet. Ações típicas realizadas aquisão parar a execução de animações e threads.

• public void destroy( ): Esse método é chamado quando a applet está sendoremovido da memória – normalmente quando o usuário do navegador sai dasessão de navegação. Este método executa quaisquer tarefas que sãoexigidas para destruir recursos alocados para a applet.

8.3 Exemplos

Java é Legal! 40

Page 41: Apostila Java

41

9. Threads

A simultaneidade é importante em nossas vidas, ironicamente, apesar disso, muitaslinguagens de programação não permitem que os programadores especifiquem que tarefasdevam ser executadas simultaneamente. Em vez disso, as linguagens fornecem apenas umpequeno conjunto de estruturas de controle que permite aos programadores realizar umaoperação por vez e depois passar para a próxima ação depois que a anterior é terminada. Otipo de simultaneidade (entenda com “processamento paralelo”) só é alcançado com“primitivas” de sistemas operacionais disponíveis somente para “programadores desistemas” altamente experientes.

Java é única, entre linguagens de programação de uso geral e popular, no sentido deque torna as primitivas de simultaneidade disponíveis para o programador de aplicativos. Oprogramador especifica que os aplicativos contêm threads (fluxos ou linhas de execução),cada thread executa uma parte do programa em paralelo que também podem ter outrasthreads. Esse recurso chamado de multithreading ou multiescalonamento, oferece aoprogramador Java recursos poderosos, não disponíveis em C e C++, as linguagens em queJava é baseada. C e C++ são chamadas de linguagens de uma única thread (Obs: em muitasplataformas, os programas C e C++ podem executar multithreading usando bibliotecas decódigo específicas para o sistema). Java inclui as primitivas de multithreading na próprialinguagem o que evita as chamadas às rotinas do sistema operacional (as classes paramanipulação de threads estão dentro do pacote java.lang, Thread, ThreadGroup,ThreadLocal e ThreadDeath).

9.1 Multithreading

A classe Thread: uma visão geral dos métodos.Agora teremos uma visão geral dos vários métodos relacionados com thread na Java

API. Utilizamos muitos desses métodos em exemplos de código ativo ao longo destecapitulo. Se quiser obter detalhes mais específicos sobre cada método, especialmente asexceções disparadas por cada método, consulte a API.

A classe Thread (pacote java.lang) tem vários construtores. O Construtor:public Thread( String threadName )

Constrói um objeto Thread cujo nome é threadName.public Thread( )

Constrói uma Thread cujo nome é “Thread-“ concatenado com um número, comoThread-1, Thread-2 e assim por diante.

O código que “faz o trabalho de verdade” de uma thread é colocado dentro dométodo run (este é o método mais importante de uma thread, pois é nele que especificamosquais atividades devem ocorrer em paralelo). O método 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 execução de uma thread chamando o método start da thread,que por sua vez chama o método run. Depois de start disparar a thread, start retorna aoseu chamador imediatamente, este chamador então é executado simultaneamente com athread que foi disparada. A chamada á start resulta numa exceção se a thread já tiver sidodisparada.

Java é Legal! 41

Page 42: Apostila Java

42

9.2 Sincronização de ThreadsJava utiliza monitores para fazer sincronização. Todo objeto com métodos

synchronized tem um monitor. O monitor permite que uma thread de cada vezexecute um método synchronized sobre o objeto. Isso se faz bloqueando o objetoquando o programa invoca um método synchronized – também conhecido comoobtenção de bloqueio. Se houver vários métodos synchronized, somente um podeestar atuando sobre um objeto de cada vez, todas as outras threads que tentaminvocar métodos synchronized devem esperar. Quando um método synchronizedtermina de ser executado, o bloqueio sobre o objeto é liberado e o monitor permiteque a thread pronta com prioridade mais alta tente invocar um métodosynchronized para prosseguir (Obs: Java também possui blocos de códigosynchronized).

A thread que sendo executada em um métod synchronized pode deteminarque ela não pode mais prosseguir, de modo que a thread chama waitvoluntariamente. Isso tira a thread da disputa pelo processador e da disputa peloobjeto monitor, A thread agora está no estado de espera. Quando uma thread queestá executando um método synchronized termina ou satisfaz a condição pela qualoutra thread pode estar esperando, a thread pode nitificar (notify) um thread emespera para ela se tornar novamente pronta. Neste ponto, a thread original podetentar readquirir o bloqueio sobre o objeto monitor e ser executada. O notify atuacomo sinal para a thread em espera de que a condição pela qual a thread em esperaestava esperando agora está satisfeita, de modo que a thread em espera pode entrarnovamente no monitor. Se uma thread chama notifyAll, então todas as threads queestão esperando o objeto tornam-se elegíveis para entrar novamente no monitor (istoé, todas são colocaas em um estado pronta). Lembre-se que somente uma dessasthreads pode obter o bloqueio sobre o objeto de cada vez – outras threads quetentam adquirir o mesmo bloqueio serão bloqueadas pelo sistema operacional atéque o bloqueio se torne disponível novamente. Os métodos wait, notify, notifyAllsão herdados da classe Object por todas as classes, então, qualquer objeto pode terum monitor.

A interface RunnableAté agora usamos a classe Thread para escrever nosso aplicativos. Entretanto, se

queremos suporte multithreading em uma classe que já é derivada (herda) de uma classediferente de Thread, devemos implementar a interface Runnable nessa classe, porque Javanão permite herança múltipla. A própria classe Thread implementa a interace Runnable(pacote java.leng).

Implementar a interface Runnable um uma classe permite que um programamanipule objetos daquela classe como objetos Runnable. Assim como ocorre com aderivação da classe Thread, o código que controla a thread é colocado no metodo run.

9.3 Exemplos

Java é Legal! 42

Page 43: Apostila Java

43

10. Bibliografia

DEITEL, H. M. e P. J. Java como programar. 3ª. Edição. – Porto Alegre: Bookman 2001.

DEITEL, H. M. e P. J. Java como programar. 4ª. Edição. – Porto Alegre: Bookman 2003.

CESTA, A. A. Tutorial: “A linguagem de programação Java” – Unicamp 1996.

LEMAY, L. e CADENHEAD, R. Aprenda em 21 dias Java 2. – Rio de Janeiro: Campus1999.

Grupo de Usuários Javawww.guj.com.br

Java Ranchwww.javaranch.com

Sun Microsystemswww.javasoft.com

Portal Javawww.portaljava.com.br

Java é Legal! 43