Você está na página 1de 77

Introduo Linguagem Java

por Christian Cleber Masdeval Braz

Sumrio
1 Introduo ao Java 1.1 Histrico da Linguagem 1.2 Caractersticas da Linguagem 1.3 Plataformas Java 1.4 Java 2 System Development Kit 1.5 A Mquina Virtual Java 1.6 Garbage Collection 1.7 Produtos e Terminologias da Tecnologia Java 2 Estrutura bsica de um programa 2.1 Princpios Bsicos da Linguagem 2.2 Membros de uma Classe 2.3 O mtodo Main 2.4 Modificadores de Acesso 2.5 Conveno de Nomes 2.6 Compilao e Execuo de Programas 2.7 Passagem de Parmetro na Linha de Comando 3 Variveis e Operadores 3.1 Nome de Variveis 3.2 Tipo de Dados 3.3 Escopo de Variveis 3.4 Converses Entre Tipos Primitivos de Dados 3.5 Operadores 3.6 Constantes 4 Controle de Fluxo 4.1 Comando if else 4.2 Comando switch 4.3 Comando while 4.4 Comando do - while 4.5 Comando for 4.6 Comando break 4.7 Comando continue 5 Mtodos 5.1 Modificadores de Acesso 5.2 Nome de Mtodos 5.3 Argumentos 5.4 Retornando Valor a Partir de um Mtodo 5.5 Passando Parmetros para um Mtodo 4 4 4 5 5 5 6 7 8 8 8 9 9 9 10 10 13 13 14 17 17 18 20 22 22 23 23 24 24 24 25 28 28 28 28 29 29

6 Classes e Objetos em Java 6.1 Encapsulamento 6.2 Criando Objetos e Acessando Dados Encapsulados 6.3 Construtores 6.4 O Ponteiro this 7 Mais Sobre Classes e Objetos 7.1 Pacotes 7.2 Atributos e Mtodos de Classe 7.3 Destrutores e o Mtodo finalize() 8 Herana e Polimorfismo 8.1 Herana 8.2 Polimorfismo 8.3 - Criao de um objeto de uma subclasse e o ponteiro super 8.4 Mtodos e Classes final 9 Estruturando o Cdigo com Classes Abstratas e Interfaces 9.1 Classes Abstratas 9.2 Interfaces 10 Usando Strings e Arrays 10.1 Strings 10.1.1 Operaes em Strings 10.1.2 Convertendo primitivos para Strings e vice-versa 10.1.3 A classe StringBuffer 10.2 Arrays 10.2.1 Arrays de Primitivos 10.2.2 Arrays de Referncias 10.2.3 Arrays como Objetos 10.2.4 Arrays e Excees 10.2.5 Arrays Multidimencionais 11 Tratamento de Excees 11.1 Classes de Excees 11.2 Tratando de Excees 11.2.1 Capturando Excees 11.2.2 Deixando uma exceo passar atravs do mtodo 11.2.3 Capturando uma exceo e disparando outra diferente

32 35 36 37 39 43 43 44 45 48 48 49 52 53 56 56 57 62 62 63 64 64 65 65 66 66 67 67 72 72 73 73 75 76

1 Introduo ao Java
A linguagem Java foi desenvolvida pela Sun Microsystems em 1995. Apesar de relativamente nova, a linguagem obteve uma espetacular aceitao por programadores do mundo inteiro, tendo se difundido como nunca antes ocorreu com uma linguagem de programao. Um fator que colaborou com isso, o fato da linguagem possuir vantagens agregadas tais como: orientao a objetos, independncia de plataforma, multitarefa, robusta, segura e distribuda. Com o advento da Internet, que tornou ainda mais necessrio a comunicao entre plataformas heterogneas, estes fatores fizeram com que o Java fosse a tecnologia perfeita para este novo cenrio. 1.1 - Histrico da Linguagem No incio da dcada de 90, um pequeno grupo de projeto da Sun pretendia criar uma nova gerao de computadores portteis inteligentes, que pudessem se comunica entre si de diversas formas. Para isso, decidiu-se criar uma plataforma de desenvolvimento onde o software pudesse ser executado em diversos tipos de equipamentos. Para o desenvolvimento desta plataforma foi escolhida a linguagem de programao C++. A linguagem C++ no permitia realizar com facilidade tudo o que o grupo pretendia. Neste ponto, James Gosling, coordenador do projeto, decidiu criar uma nova linguagem de programao que pudesse atend-los em suas necessidades. A criao dos chips inteligentes foi abandonada devido ao alto custo de produo. Posteriormente, a exploso da Internet no mundo todo fez surgir a necessidade de uma tecnologia onde computadores de diferentes plataformas pudessem conversar. Surge da, baseada na linguagem criada para o projeto de Gosling, a linguagem Java. 1.2 Caractersticas da Linguagem Orientada a Objetos : Paradigma atual mais utilizado na construo de softwares. Dentre suas vantagens, podemos citar reaproveitamento de cdigo e aumento da manutenibilidade dos sistemas assim desenvolvidos. Simples e Robusta : Java representa em muitos aspectos um aperfeioamento da linguagem C++. Ela possui certas caractersticas que permitem a criao de programas de forma mas rpida, pois tiram do programador a possibilidade de cometer erros que so comuns de ocorrer em C++. Algumas dessas caractersticas so o tratamento obrigatrio de excees e o gerenciamento automtico de memria. Gerenciamento Automtico de Memria : Em Java no existe ponteiros, isto , no permitido ao programador acessar explicitamente uma posio de memria. Java automaticamente gerencia o processo de alocao e liberao de memria, ficando o programador livre desta atividade. O mecanismo responsvel pela liberao de memria que no est mais sendo utilizada conhecido como Garbage Collector. Independncia de Plataforma : Um dos elementos chave da linguagem Java a independncia de plataforma. Um programa Java escrito em uma plataforma pode ser utilizado em uma outra distinta da original. Este aspecto da linguagem geralmente referenciado como write once, run anywhere. Isto conseguido atravs da utilizao da Java Virtual Machine (JVM) a qual roda numa plataforma especfica e interpreta um programa Java para cdigo de mquina especfico da plataforma em questo. Como os programas em Java executam sob o controle da JVM, eles podem rodar em qualquer plataforma que possua uma disponvel.
4

Multi-threading : Um programa Java pode conter mltiplas threads para realizar vrias tarefas em paralelo.

1.3 Plataformas JAVA A tecnologia Java est organizada em trs plataformas com objetivos especficos: Java 2 Standard Edition (J2SE): ferramentas e APIs (Application Program Interface) essenciais para qualquer aplicao Java (inclusive para as outras plataformas). suficiente a utilizarmos se quisermos desenvolver aplicaes desktop com ou sem interface grfica. Java 2 Enterprise Edition (J2EE): ferramentas e APIs para o desenvolvimento de aplicaes distribudas. Engloba tecnologias tais como RMI, EJB, CORBA, JMS, etc. Java 2 Micro Edition (J2ME): ferramentas e APIs para o desenvolvimento de aplicaes para aparelhos portteis (palms, celulares, eletrodomsticos).

Neste curso, ser suficiente para ns utilizarmos apenas a plataforma J2SE, j que nosso objetivo principal aprender a linguagem Java. 1.4 Java 2 System Development Kit (J2SDK) O J2SDK corresponde ao produto disponibilizado pela SUN que implementa a plataforma J2SE, provendo o ambiente bsico necessrio para o desenvolvimento de aplicaes. Ele pode ser obtido no site da SUN no endereo http://java.sun.com. O J2SDK consiste de: JRE (Java Runtime Environment): ambiente para execuo de aplicaes Ferramentas para desenvolvimento: compilador, debugger, gerador de documentao, empacotador JAR, etc Conjunto de APIs e cdigo fonte das classes

1.5 A Mquina Virtual Java O JRE um conjunto de programas que possibilita executar aplicaes Java. O corao do JRE a Mquina Virtual Java ou Java Virtual Machine (JVM). a JVM que possibilita uma das caractersticas mais impressionantes da linguagem Java, a portabilidade do cdigo. Vamos compreender um pouco como isso funciona No processo de compilao, ao invs do programa ser compilado para cdigo de mquina da plataforma que vai ser executado, o programa compilado para bytecode O bytecode genrico, isto , no especfico para nenhum sistema operacional em particular Quando um programa Java executado, o arquivo bytecode interpretado pelo interpretador da tecnologia java, que denominado Java Virtual Machine. Existe uma JVM diferente para cada plataforma onde a tecnologia Java pode ser executada e dever existir uma instalada no computador no qual ser executado um programa Java. Os browsers, por exemplo, incorporam uma JVM para a execuo de applets.
5

MeuPrograma.java
_____ _____ _____

=> Cdigo fonte

Compilao => javac MeuPrograma.class


_____ _____ _____

=> Bytecode

Execuo => java JVM

DOS JVM

SCO JVM

Win JVM

Linux JVM

Figura 1- Esquema de compilao e execuo de um programa em Java. 1.6 Garbage Collection No C e C++ (e em outras linguagens) o programa desenvolvido responsvel pela alocao e desalocao da memria, o que um dos principais pontos causadores de erros nestes programas. Em Java, quando um objeto criado (e quase tudo em Java um objeto), a memria necessria alocada automaticamente para ele, pois no h forma de se manipular a memria diretamente. Podem existir inmeras variveis no programa referenciando um mesmo objeto e, durante o ciclo de execuo do programa, o Java verifica se um objeto ainda est sendo referenciado por alguma varivel e, caso no esteja, o Java libera automaticamente esta rea que no esta sendo utilizada. Ou seja, quando no resta mais nenhuma referncia para um objeto, ele marcado para ser coletado pelo garbage colletor ou coletor de lixo, que libera a memria ocupada por ele. O coletor de lixo executado de tempos em tempos num processo de baixa prioridade. Quando a JVM no est realizando nenhum processamento, ela executa o coletor de lixo que vasculha a memria em busca de algum objeto criado e no referenciado. Quando uma grande quantidade de objetos ou objetos muito grandes no so mais necessrios e no se quer esperar at que o coletor de lixo seja executado para liberar essa memria, pode-se chama-lo explicitamente no programa da seguinte forma : System.gc();

1.7 Produtos e Terminologias da Tecnologia Java Produto Java Virtual Machine (JVM) Java Runtime Environment (JRE) Descrio Interpreta arquivos .class (bytecode) para instrues especficas de plataforma. Somente o JVM no suficiente para uma aplicao Java ser executada. O JRE consiste do JVM mais ncleo de classes da plataforma Java e arquivos de suporte. O JRE o que deve estar instalado para a execuo de uma aplicao Java. Biblioteca de classes e interfaces que auxiliam no desenvolvimento das aplicaes. Corresponde ao nome da tecnologia Java at Novembro de 1999. JDK 1.1 foi a ltima verso. composto por : JVM, JRE, compilador, ferramentas e APIs. o nome da tecnologia a partir de Novembro de 1999. Corresponde ao JDK 1.2 na antiga terminologia. composto por : JVM, JRE, compilador, ferramentas e APIs. Corresponde a documentao das APIs. A ltima verso pode ser encontrada em http://java.sun.com/j2se/1.4.2/docs/api/. A ferramenta Javadoc auxilia na criao da documentao das classes.

Application Program Interface (API) Java Developer`s Kit (JDK)

Java 2 Platform, J2SE (Standard Edition )

Javadoc

2 Estrutura bsica de um programa


O desenvolvimento de aplicaes Java sempre feito atravs de classes. A definio de uma classe Java deve respeitar a seguinte sintaxe : <modificador de acesso> class <nome da classe> { <Declarao das Variveis de Instncia (Atributos)> <Declarao de Mtodos> public static void main( String args[] ) { //corpo principal do programa } } Exemplo 1 : Modificador de Acesso public class Exemplo1 Nome da Classe { Varivel de Instncia String mensagem = Meu primeiro programa em Java!; public void Imprime_Msg() { //Mostra um texto na tela System.out.println(mensagem); } public static void main (String [] args) { Imprime_Msg(); } } 2.1 Princpios Bsicos da Linguagem Java case-sensitive As classes, mtodos ou blocos de cdigo sempre estaro delimitados por um abrir ( { ) e fechar ( } ) de chaves. Um comando deve sempre ser finalizado por um ponto e vrgula ( ; ) Dois tipos de comentrio : //Comentrio de uma linha e /* Comentrio de Vrias */ Nomes de variveis, classes e mtodos devem sempre comear por letras, $ ou _

Definio de Mtodos

Corpo do Programa

2.2 Membros de uma Classe As variveis de instncia formam os atributos de um objeto e, juntamente com os mtodos, so os elementos bsicos para a formao de uma classe. Eles so denominados membros da classe. Os atributos so espaos em memria reservados para armazenar informaes durante a execuo da classe. Eles consistuem o estado interno de um objeto. Os atributos so inicializados no incio da execuo da classe e ficam disponveis para utilizao por
8

todos os seus mtodos. Os mtodos por sua vez definem as operaes que podem ser realizadas pela classe. Mais sobre atributos ser visto no captulo Variveis e Operadores e os mtodos sero vistos em maiores detalhes no captulo Mtodos. 2.3 O Mtodo Main Uma aplicao em Java caracterizada por possuir o mtodo main(). A declarao do mtodo deve ser : public static void main( String[] args ). O mtodo main um mtodo especial pois representa o ponto de entrada para a execuo de um programa em Java. Quando um programa executado, o interpretador chamar primeiramente o mtodo main da classe. ele quem controla o fluxo de execuo do programa e executa qualquer outro mtodo necessrio para a funcionalidade da aplicao. Nem toda classe ter um mtodo main. Uma classe que no possui um mtodo main no pode ser executada pois no representa um programa em Java. Ela ser sim, utilizada como classe utilitria para a construo de outras classes ou mesmo de um programa. 2.4 Modificadores de Acesso A declarao de uma classe geralmente comea com o modificador de acesso public, o que significa que pode ser acessada por qualquer outra classe. Se for omitido, a classe ser visvel apenas por outras classes do mesmo pacote que a contm. 2.5 Conveno de Nomes Nome de Arquivos : O cdigo fonte de programas Java armazenado em arquivos com extenso .java. Um arquivo fonte poder armazenar a definio de mais de uma classe, mas uma boa prtica armazenar apenas uma classe por arquivo fonte. Use o nome da classe principal do arquivo como sendo o nome do arquivo. Quando compilamos um arquivo fonte, ser gerado um arquivo com extenso .class para cada classe definida e com o mesmo nome da classe. O arquivo .class contm o bytecode gerado com a compilao. Exemplos : Cliente.java , ItemEstoque.java Nome de Classes : Utilize substantivos ou frases substantivas descritivas para nome de classes. Deixe maiscula a primeira letra de cada substantivo que compe o nome, por exemplo : MyFirstClassName Nome de Mtodos : Use verbos para nome de mtodos. Faa a primeira letra do nome minscula com cada letra inicial interna maiscula. Por exemplo : getUserName() Nome de Variveis : Escolha nomes que indiquem o uso pretendido da varivel. Utilize a primeira letra do nome minscula e a inicial das outras palavras que formam o nome maiscula. Exemplos : customerName, customerCreditLimit

2.6 Compilao e Execuo de Programas Para compilarmos e executarmos um programa Java necessrio que a mquina possua o J2SE instalado. Para compilarmos um programa na linha de comando, fazemos: prompt> javac Exemplo1.java - Sada do Compilador prompt> Se no ocorrer nenhum erro de compilao aps a execuo do comando, ser gerado o arquivo Exemplo1.class. Para o executarmos fazemos : prompt> java Exemplo1 Perceba que omiti-se a extenso .class Meu primeiro programa em Java! prompt> Isto ir chamar a JVM que carregar o arquivo Exemplo1.class e tentar chamar seu mtodo main (). Se o Exemplo1.class chama mtodos em outras classes, a JVM carregar estas outras classes somente quando for necessrio. 2.7 - Passagem de Parmetros na Linha de Comando Aplicaes Java permitem que se passe parmetros atravs da linha de comando. Os parmetros so separados por espaos em branco. Para passar um parmetro que contm ele prprio espaos em branco deve-se coloc-lo entre aspas duplas. Os parmetros so passados para as aplicaes atravs do vetor de strings do mtodo main. Atravs do mtodo length pode-se verificar o nmero de parmetros passados. O acesso feito indicando-se a posio no array, sempre iniciando em 0. Exemplo 2 : class ParametroLinhaComando { public static void main( String [] args ) { System.out.println(Meu nome : + args[0] + e tenho + args[1] + " anos." ); System.out.println("Tamanho do segundo parametro : " + args[1].length() + " Nmero de parametros : " + args.length); } } A seguinte chamada a este programa prompt> java ParametroLinhaComando Maria 18 gerar a seguinte sada : prompt> Meu nome Maria e tenho 18 anos. parametro : 2 Nmero de parametros : 2 Tamanho do segundo

10

Exerccios : 1 Siga os passos abaixo para criar e executar sua primeira aplicao Java. Ela possui alguns erros do jeito que est. Tente descobrir e corrigi-los antes de compilar. Caso no consiga, compile e tente descobrir os erros a partir da sada apresentada. a) Abrir um editor de textos e escrever o programa class PrimeiraApp { public void main( String args ) { System.out.println(Primeira aplicao.) } } b) Salvar o arquivo dando a ele o mesmo nome da classe e com a extenso .java. c) Compilar o arquivo prompt> javac PrimeiraApp.java Se a compilao foi com sucesso, ela gerou um arquivo PrimeiraApp.class, que o arquivo a ser executado. d) Execute o programa utilizando o interpretador java prompt> java PrimeiraApp 2 Examine o cdigo abaixo e responda as questes que seguem. public class HelloWorld { private int age; private String telephone; private String address; public static void main (String[] args){ showMessage(Hello World!); } static void showMessage(String msg) { int messageNumber = 0; int messagePriority =; messageNumber = messageNumber + 1; System.out.println(msg + + messageNumber); } }
11

a) Qual o nome da classe ? b) Quais os nomes dos mtodos ? c) Quais os nomes dos atributos ? d ) Quais os nomes das variveis do mtodo ? 3 Diga o que est de errado no cdigo abaixo : class mais_erros { int 1_Idade; int segundaIdade; public void somaIdades (){ System.out.println(A soma das idades : + (1_Idade + SegundaIdade) ); public static void main (String[] args) { // Esta chamada de metodo ira imprimir a soma das idades na tela. SomaIdades; } }

12

3 Variveis e Operadores
Uma varivel um nome simblico para uma poro de memria na qual um valor pode ser armazenado. Toda varivel tem as seguintes caractersticas : Deve ser declarada antes de ser utilizada; Possui um tipo, um identificador e um escopo; Podem ser locais, quando declaradas dentro de mtodos, ou atributos, quando declaradas no corpo da classe; Podem ser inicializadas;

Como Java uma linguagem fortemente tipada, todas as variveis devem ser declaradas antes de serem usadas. O tipo de uma varivel determina o tipo de informao que pode ser armazenada nela. Variveis em Java podem ser declaradas como atributos, no corpo da classe, ou podem ser declaradas localmente em qualquer parte da implementao de um mtodo. Variveis tambm possuem um escopo, o qual determina onde no programa ela estar visvel e poder ser acessada. A declarao de variveis no Java segue a seguinte sintaxe : String msg = Exemplos de declarao de variveis ; int umInteiro, UmInteiro; float umFloat = 0.5; char caracter = i; boolean flag = false; umInteiro = 90;

tipo identificador [= valor] [, identificador [= valor]];

3.1 Nome de Variveis O nome de uma varivel deve comear com uma letra (a-z/A-Z), um underscore ( _ ), ou um sinal de dlar ( $ ). Os caracteres subsequentes podem incluir os dgitos de 0 a 9. Como no existe restrio quanto ao tamanho dos nomes das variveis, recomendado que se escolha nomes significativos e que representem a real inteno de uso para a varivel ou constante. Resumindo : Conveno : Escolha nomes que indiquem o uso pretendido da varivel. Utilize a primeira letra do nome minscula e a inicial das outras palavras que formam o nome maiscula. Exemplos : customerName, customerCreditLimit

Exemplos de nomes para variveis : Legais a itemCost item$Cost Palavras-Chaves Toda linguagem tem um grupo de palavras que o compilador reserva para seu prprio uso. Essas palavras-chaves no podem ser usadas como identificadores em seus programas. Em Java, as palavras reservadas so :
13

Ilegais item#Cost item*Cost 2itemCost item-Cost sem%

item_Cost _itemCost itemCost2

abstract boolena break byte case *cast *catch char class *const continue default

do double else extends final finally float for *future generic *goto if

implements import *inner instanceof int interface long native new null operator *outer

package private protected public *rest return short static super switch synchronized this

throw throws transient try *var void volatile while

*os itens marcados com asterisco so para implementaes futuras da linguagem. 3.2 Tipos de Dados Uma varivel em Java pode ser de um dos quatro tipos de dados : classes, interfaces, arrays e tipos primitivos. No momento da compilao, o compilador classifica cada varivel como uma referncia ou um valor primitivo. Uma referncia um ponteiro para algum objeto. As classes, interfaces e os arrays so armazenados como referncias. Os tipos primitivos so diretamente armazenados e seu tamanho fixo. O tamanho e as caractersticas de cada tipo primitivo so consistentes entre as plataformas, no h variaes dependentes de mquina como em C e C++, um benefcio da portabilidade do Java. Tipos Primitivos de Dados Java possui 8 tipos primitivos onde 6 so tipos numricos, um tipo char para caracteres e um tipo booleano.

Categoria
Inteiro Inteiro Inteiro Inteiro Ponto Flutuante Ponto Flutuante Caracter Lgico Inteiro

Tipo
byte short int long float double char boolean

Tamanho
8 bits 16 bits 32 bits 64 bits 32 bits 64 bits 16 bits true / false

Os tipos de dados dessa categoria armazenam valores numricos inteiros, isto , nmeros sem casas decimais. O Java possui 4 tipos primitivos desta categoria e o que diferencia um do outro a sua capacidade de armazenamento.

14

Tipo
byte short int long

Tamanho
8 bits 16 bits 32 bits 64 bits

Variao
-128 a + 127 -32.768 a +32.767 -2.147.483.648 a +2.147.483.647 9.223.372.036.854.775.808 a 9.223.372.036.854.775.807

Por default, literais1 inteiros so de 32 bits (int) e podem ser especificados como decimais, octais e hexadecimais. Para definir um literal como um nmero decimal, basta atribuir um nmero decimal qualquer, como octal deve-se acrescentar um 0 no incio do nmero e como hexadecimal um 0x ou 0X. Os octais contm os dgitos de 0-7 e os hexadecimais os caracteres 0-9 e A-F em maisculo ou minsculo. possvel tambm definir literais inteiros do tipo long, ou seja, com 64 bits. Para isso, basta acrescentar um L no final do nmero. O efeito disso que, se a varivel foi definida como int, o compilador passa a interpret-la como long. Exemplos de literais do tipo Inteiro : Decimal Octal Hexadecimal Long Ponto Flutuante 0 02 0x0 365L 1998 077 0x2a 077L -23456 0123 0X1FF 0x1ffL

Os tipos de dados de ponto flutuante armazenam nmeros que possuem uma parte decimal, isto , representam nmeros reias. Em Java so dois os tipos dessa categoria : float e double. O tipo float permite representar valores reais com preciso simples (32 bits) enquanto o tipo double permite representar com preciso dupla (64 bits). Deve ser utilizado o ponto como separador de casas decimais. Quando necessrio, os nmeros podem ser escritos em notao exponencial, usando o caracter e ou E. Por exemplo : 4.2 * 106 pode ser representado por 4.2e6. A representao de um literal com ponto flutuante , por default, considerada do tipo double. Para representar um literal do tipo float com preciso simples (32 bits) devemos incluir a letra F ou f no final do nmero. Alguns exemplos de literais com ponto flutuante so : 1.0 , 4.7 , .47 , 1.22e19 (1.22 * 1019 ) , 4.6E-9 (4.6 * 10-9) , 6.2f , 6.21F Caracter

O nico tipo dessa categoria o tipo char. Uma varivel do tipo char permite armazenar apenas um caracter. Caso seja necessrio armazenar palavras ou textos dever ser utilizado o tipo String, que no um tipo primitivo. necessrio utilizar aspas simples para atribuir um literal para uma varivel do tipo char, por exemplo : char letra = a;

Enquanto variveis armazenam valores, os literais so os prprios valores. Literais podem ser usados em qualquer parte de um programa Java. 15

Java utiliza o padro UNICODE para armazenar as variveis do tipo char. Nesse padro, cada caracter ocupa 16 bits, podendo representar at 32.768 caracteres diferentes. Os literais dessa categoria podem representar caracteres imprimveis ou no. Abaixo segue uma relao de alguns deles : a-z A-Z \n \ \ Uma letra de a - z Uma letra de A- Z Nova linha Aspas duplas Aspas simples \r Retorno de carro \b Retrocesso do cursor \u006F Valores Unicode \t Tabulao

Lgico

Essa categoria tambm possui apenas um tipo de dado que o tipo boolean. Uma varivel do tipo boolean pode armazenar apenas dois valores lgicos : true ou false. O Java no associa valores numricos para true e false como ocorre em outras linguagens de programao. Tipos de Dados Armazenados por Referncia Os tipos podem ser primitivos ou de referncia. Os primitivos representam valores numricos, caracteres individuais e valores booleanos. Os tipos de referncia so representados por Classes, Interfaces e Arrays e podem ser definidos pelo usurio. A principal diferena entre os tipos primitivos e de referncia a memria que deve ser alocada, em tempo de execuo, para uma varivel de referncia, pois o ambiente de execuo no sabe quanta memria ser necessria. Na lista de tipos primitivos no encontramos um para tratar de strings de caracteres, isto porque em Java strings so manipuladas atravs de uma classe especfica para isso, a classe String. Veremos mais sobre ela posteriormente. Todo programa em Java possui dois tipos de memria : principal (stack) e auxiliar (heap). Uma varivel do tipo primitivo armazena o seu contedo diretamente na memria principal. J uma varivel do tipo referncia armazena o seu contedo na memria auxiliar e armazena na memria principal apenas o endereo onde foi armazenado o contedo da varivel. Abaixo segue uma representao grfica desse esquema : Memria Stack Memria Heap (Tipo Primitivo)Var1 valor
valor(es)

(Tipo Referncia) Var2

endereo

16

3.3 Escopo de Variveis O escopo de uma varivel o bloco de cdigo dentro do qual ela acessvel e determina quando a varivel criada e destruda. O bloco determinado por { e }. De maneira geral, uma varivel em Java pode ser um atributo, quando declarada na classe, ou uma varivel local a um mtodo, quando declarada dentro deste. Um atributo pode ser acessado por qualquer mtodo de uma classe e s so destrudos quando todo o objeto for. Uma varivel local pode ser acessada apenas dentro do mtodo onde ela foi definida. Mais especificamente, o escopo de uma varivel est diretamente relacionada ao bloco onde ela est contida. Uma varivel ser visvel apenas dentro do bloco imediatamente superior a ela. O exemplo abaixo ilustra essa regra : void metodo () { int x; { int y; x = 10; } y = 20; }

Incio do bloco de x

Incio do bloco de y OK ! A varivel x est sendo acessada dentro de seu bloco ! Fim do bloco de y ERRO ! A varivel y est sendo acessada fora de seu bloco ! Fim do bloco de x

3.4 - Converses Entre Tipos Primitivos de Dados A converso entre tipos primitivos de dados uma prtica bastante comum e necessria, porm, deve-se ter cuidado ao efetu-la para no perder informaes e obter um resultado no esperado. Java automaticamente converte um valor de um tipo numrico para outro tipo de maior capacidade de armazenamento. Por exemplo, se tentarmos atribuir um byte para um short, o compilador automaticamente converte o byte em short antes de realizar a atribuio. O esquema abaixo simboliza as converses automticas :
short int long

byte

O contrrio no verdadeiro. Para efetuarmos uma converso de um tipo maior para outro de menor capacidade necessrio usar um mecanismo chamado type cast, caso contrrio um erro ser lanado. Isso feito colocando-se o tipo pretendido para converso entre parnteses em frente da expresso ou varivel. Quando fazemos isso, foramos o compilador a realizar a converso. importante estar ciente que isto pode resultar em perda de dados e em resultados imprevisveis. Exemplo : byte b1 = 127, b2 = 127, b3;
17

b3 = b1+ b2; Erro, pois b1 + b2 resulta em 254 b3 = (byte) (b1 + b2); Est correto, mas ir ocorrer perda de informao! A tabela abaixo apresenta um resumo das possibilidades de cast, apontando os casos quando isso poder causar perda de dados. Tipo Original byte Short int long float double char boolean Tipo Destino long float double

byte C, P C, P C, P C, P C, P C, P X

short

int

C, P C, P C, P C, P C X

C, P C, P C, P C X

C, P C, P C, P C X C, P C X

C X

char boolean C X C X C, P X C, P X C, P X C, P X X X

C Utilizar cast explcito P Perda de magnitude ou preciso X Java no permite converso

3.5 Operadores Operadores so caracteres especiais usados para instruir o compilador a executar uma determinada operao em um operando. Operador de Atribuio Operador = Nome Atribuio Exemplo int var1 = 0, var2 = 0; var2 = var1 + 10; var1 = var2 = 50;

Operadores Aritmticos Operador + * / % Nome Adio Subtrao Multiplicao Diviso Mdulo (resto da diviso) Exemplo 23+29 29-23 0.5 * salario 100/50 20%3 Resultado 52 6 2 2

Nas operaes envolvendo byte, short ou char , estes valores so promovidos para int antes da operao, e o resultado ser tambm um int. Exemplo : byte b1 = 1, b2 = 2 , b3; b3 = b1 + b2 Erro pois o resultado um int! b1 = 100; b2 = 100; b3 = b1 + b2; Erro pois o resultado um int! b3 = (byte) (b1 + b2); Com o cast no apresentar erro, porm ocorrer perda de informao. Ao invs de ter 200 em b3, como ele um byte o valor ser 56 !
18

Se a operao envolve um long em um dos argumentos do operador, ento o argumento do outro lado promovido para long e o resultado tambm ser um long. Operadores Relacionais Operador == != < > >= <= Operadores Lgicos Operador && || ! ^ Atribuio Composta Operador += -= *= %= /= Nome mais igual menos igual vezes igual mdulo igual dividido igual Exemplo (x = 10;) x += 10; x -= 10; x *= 10; x %= 10; x /= 10; Resultado 20 10 100 0 0 Nome AND OR NOT XOR Exemplo (0 < 2) && ( 10 > 5) ( 10 >11 ) || (10 < 12 ) !( 1= = 4 ) ( 1!= 0) ^ ( 2< 3 ) Resultado true true true false Nome Igual Diferente Menor Maior Maior ou igual Menor ou igual Exemplo x = = 10 3 != 2 10 < 10 10 > 6 3 >= 3 7 <= 6 Resultado true false true true false

Incremento e Decremento Operador ++ incrementa de um. Ex : int var1 = 4; var1++; //var1 = 5 Operador -- decrementa de um Ex : int var1 = 4; var1--; //var1 = 3 Este decremento ou incremento pode ser feito antes ou depois da utilizao da varivel. Colocandose antes, primeiramente ser somado/subtrado 1 da varivel e depois ela ser utilizada. Ao contrrio, se o operador vier aps a varivel, primeiramente ela ser utilizada na expresso e o incremento ou decremento ser feito depois disso. Ex : int var1 = 2, var2; var2 = var1++; //var2 vale 2 var2 = ++var1; //var2 vale 3

Precedncia de Operadores A precedncia refere-se a ordem na qual os operadores so executados. Operadores de mesma precedncia so executados de acordo com sua associatividade. Por exemplo, considere a seguinte linha de cdigo :
19

int j = 3 * 10 % 7; Os operadores * e % possuem a mesma precedncia e associatividade da esquerda para direita. Assim, o * executado primeiro, produzindo o resultado 2. Se fosse colocado um parnteses para modificar a precedncia desta forma int j = 3 * (10 % 7), o resultado final seria completamente diferente (9). A tabela baixo mostra os operadores Java em ordem de precedncia, onde a linha 1 tem a mais alta precedncia. Com exceo dos operadores unrios, condicionais e o operador de atribuio, os quais so associativos da direita para esquerda, todos os outros operadores com a mesma precedncia so executados da esquerda para direita. Precedncia 1 2 3 4 5 6 7 8 9 10 11 12 13 R = Direita Operador ++ -- ! * / % + << >> < > <= >= = = != & ^ | && || ?: = op= L = Esquerda Comentrios Operadores Unrios Multi., Divi., Resto Add, Sub. Shift Relacionais Igualdade Bit/Loginal AND XOR (ou exclusivo) Bit/Logical OR AND OR Condicional Atribuio Associatividade R L L L L L L L L L L R R

3.6 Constantes Uma constante pode tanto ser definida como um atributo de classe como uma varivel local. Uma constante uma vez que foi declarada e atribudo um valor para a mesma, no permitido que outra atribuio seja efetuada, ocasionando um erro de compilao caso isso ocorra. A atribuio do valor inicial pode ser feita no momento da declarao, ou posteriormente em outra parte do programa. Para declarar uma varivel do tipo constante, devemos utilizar o modificador final dessa forma : final <tipo> <identificador> [= valor]; Declare constantes com nomes descritivos, escritos com todas as letras em maisculo. Separe nomes internos com underscores ( _ ). Exemplos : final double MIN_WIDTH = 100.0; final long MAX_NUMBER_OF_TIMES;

20

Exerccios : 1 Encontre os erros nas declaraes de variveis no cdigo abaixo e os corrija. 1. 2. 3. 4. 5. 6. 7. byte sizeof = 200; short $mom = 43; short hello mom; double old = 0.1 double new = 78; boolean consequence_2 = true; char maine = New England;

2 Crie um programa seguindo as orientaes abaixo. Faa tudo que pede dentro do mtodo main. a) Declare duas variveis para armazenar os valores de dois itens de venda. Os valores dos dois itens devem ser 2.95 e 3.50. Pense em nomes significativos para as variveis e tambm considere qual deve ser seu tipo. b) Use o System.out.println() para mostrar o contedo de suas variveis. Execute o programa e veja a sada. Apresente uma mensagem significativa como O Item 1 custa 2.95 e ... (Dica : utilize o operador + para concatenar o texto com o valor da varivel). c) Declare uma outra varivel para armazenar o custo total dos itens. Utilize o operador de adio para realizar o clculo e imprima o resultado. d) Crie uma constante para armazenar a taxa de 8.25 % que deve ser cobrada sobre o valor total. Armazene o clculo numa varivel chamada taxaCalculada e imprima o resultado. e) Adicione ao valor de cada item o valor da taxa calculado. Use a menor linha de cdigo possvel para fazer isso. Some novamente os dois valores e atribua o resultado a uma varivel chamada novoCusto. f) Crie uma varivel booleana chamada muitoCaro. Escreva uma assertiva lgica para setar esta varivel para true se novoCusto for maior que 10 e para false caso contrrio. Imprima o valor obtido em muitoCaro. (No utilize if para escrever a assertiva.) 3 Declare uma varivel chamada Long do tipo long e a inicialize com 100. Agora declare duas variveis do tipo int, int1 e int 2, e inicialize int1 com 200. Agora faa int2 receber int1 mais Long e explique os resultados. Arrume o cdigo para que no ocorra o erro anterior.

21

4 Controle de Fluxo
A maioria dos programas tomam decises que afetam seu fluxo. Os comandos que tomam essas decises so chamados de comandos de controle. 4.1 Comando if else Sintaxe : if ( boolean_expr ) comando1; [else comando2;] Exemplo : if ( fim = = true ) System.out.println(Trmino!); else System.out.println(Continuando...); Para mais de um comando ser executado depois da declarao, utiliza-se o conceito de blocos, delimitados por { }. Exemplo: if ( fim = = false ) && (cont > 0){ cont ++; System.out.println(Continuando...); } else { cont = 0; System.out.println(Trmino!); } recomendado sempre usar blocos de comandos para facilitar a leitura e compreenso do cdigo. possvel tambm criar comandos if aninhados. Exemplo : if ( fim = = false) && (cont < 0){ cont++; } else if (fim = = false) && (cont > 0){ cont--; } else { cont = 0; System.out.println(Trmino!!); }
22 Expresso booleana formada pelos operadores lgicos e relacionais. Se a expresso boolena for verdadeira (true), executa comando1, caso seja falsa (false), executa comando2.

4.2 Comando Switch Utilizamos o comando switch para avaliar uma expresso contra vrios resultados possveis. Aceita somente um char, byte, short ou int como sua expresso de comparao. O valor procurado nas declaraes case que vem depois da declarao switch e o cdigo adequado executado. Sintaxe : switch ( expresso ) { case constant1 : comando1; break; case constant2 : comando2; break; ... [default : comando_default;] } Exemplos : switch ( cmd ){ case 0: System.out.println(Item do menu 1); menu = ++cmd; break; case 1: System.out.println(Item do menu 2); menu = ++cmd; break; case 2: System.out.println(Item do menu 3); menu = ++cmd; break; default: System.out.println(Comando invalido!); } 4.3 Comando while Implementa um loop para executar um bloco de comandos sucessivas vezes. A expresso de comparao avaliada antes que o lao seja executado. Sintaxe : while ( boolean_expr ) { comandos; }
Enquanto a expresso for verdadeira o lao ser executado Deve resultar em char, byte, short ou int. Deve ser um literal ou uma constante !

Quando encontra u ma opo vlida, os comandos so executados at um break ser encontrado, o qual transfere o controle para o comando seguinte ao comando switch. Ou seja, se um break no especificado ao trmino de um case, todas as diretivas dos cases subsequentes sero executadas at que um break seja encontrado ou o comando switch termine.

Exemplo : while ( i != 0 ){ salario = salario * 0.5; i--; }

23

4.4 Comando do - while


Utilizado quando se quer que o corpo do lao seja necessariamente executado pelo menos uma vez A expresso de comparao avaliada depois que o lao for executado. Sintaxe: do { comandos; } while ( boolean_expr ); Exemplo: do { salario = salario * 0.5; i--; }while ( i != 0 );

4.5 Comando for


Comumente, um loop for possui uma parte inicial com a inicializao das variveis, seguida por uma expresso de comparao e depois a parte final com o incremento ou decremento das variveis do lao. Sintaxe : for ( inicializao; condio; iterao ) { comandos; } Exemplo: for (i = 0; i < 20; i ++){ salario = salario * 0.5; }

Pode-se declarar variveis na inicializao do for. for (int i = 0 ; i < 10 ; i++) comando;

O nico elemento realmente imprescindvel a condio. possvel construir laos for sem a inicializao e/ou o incremento. int 1 = 2; for ( ; i<10 ; ){ comandos; i++; } A inicializao e incremento podem ser feitos com mais de uma varivel. Neste caso devem estar separados por vrgula. for ( i = 0, j = 10 ; i < 8 && j > 2 ; i ++, j-- ) comando;

4.6 Comando break O break utilizado para transferir o controle para o final de uma construo de lao (for, do-while, while) ou de um switch. O lao vai encerrar independentemente de seu valor de comparao e o comando aps ele ser executado. Exemplo :

24

int i = 0; while (true) { System.out.println(i); i++; if ( i > 10 ) break; } ... 4.7 Comando continue Quando o comando continue encontrado (somente dentro de um lao), ele pra a execuo naquele ponto e a transfere de volta para o incio do lao para dar incio a uma nova iterao. Exemplo : for (int i = -10; i<10; i++) salta para a prxima iterao do { lao. if ( i = = 0 ) continue; System.out.println(1/i); //No deve ser executado o clculo 1/0 !! }
Abandona a iterao corrente e

25

Exerccios : 1 Identifique e corrija os erros dos cdigos abaixo : int x = 3, y = 5; if (x >= 0) if (y < 0) System.out.println(y menor que x); else System.out.println(x negativo); int x = 7; if (x = 0) System.out.println(x zero); 1

int x = 15, y = 24; if ( x %2 == 0 && y%2 == 0) ; System.out.println(x e y so pares);

2 Determine o nmero de dias num ms. Voc deve usar um comando switch para setar um inteiro com o nmero de dias no ms especificado. Por enquanto adicione todo o cdigo no mtodo main(). a) Declare trs inteiros, um para manipular os dias (1-31), outro os meses (112) e um terceiro para manipular o ano. Inicialize estas variveis com um dia da sua escolha. b) Imprima a data no formato dd/mm/yyyy. c) Declare uma varivel para armazenar o nmero de dias que contm o ms escolhido. Ento, usando o comando switch, determine o valor para esta varivel. So 30 dias em Abril, Setembro, Junho e Novembro e 31 nos restantes exceto para Fevereiro que tem 28 (ignore o ano bissexto). Experimente executar o programa com diferentes valores para o ms. O que acontece se ele for executado com um ms invlido como 13 ? Para 27 de Janeiro de 2000 a sada deve ser algo como 27/1/2000 31 dias no ms 3 Use um lao for para mostrar datas. a) Usando um lao for, estenda seu programa de forma que ele imprima todas as datas entre a que voc especificou at o final daquele ms. Para 27/1/2000 a sada deve ser 27/1/2000 28/1/2000 29/1/2000 30/1/2000 31/1/2000
26

b) Teste o programa para verificar se ele est funcionando corretamente com vrias datas diferentes. c) Agora o modifique para que ele imprima no mximo 10 datas. Por exemplo, se a data for 19/1/2000 o programa deve imprimir apenas as datas 19/1/2000 at 28/1/2000. J se a data for 30/1/2000, dever ser impresso apenas 30/1/2000 e 31/1/2000. d) Compile seu programa, corrija os erros se ocorrer algum, e teste com vrias datas para ter certeza que est funcionando corretamente. 4 Determine se o ano especificado um ano bissexto. a) Crie uma expresso booleana para testar se o ano bissexto. Um ano bissexto se : ele divisvel por 4, e ele no divisvel por 100, ou divisvel por 400 b) Modifique o comando switch da questo 2 para tratar de anos bissexto. Lembre-se que o ano Fevereiro tem 29 dias em anos bissextos e 28 nos outros. c) Compile e teste seu programa. A tabela abaixo apresenta alguns anos que so e outros que no so bissextos para voc poder testar seu programa : Anos Bissextos 1996 1984 2000 1964 Anos no Bissextos 1997 2001 1900 1967

5 Considere que a data que voc escolheu a data de emprstimo de uma mercadoria e que necessrio saber qual a data de devoluo da mesma. A data de devoluo a data atual mais 3 dias. a) Declare trs variveis para controlarem o dia , ms e ano da data de devoluo e uma outra com a quantidade de dias de emprstimo (inicializada com 3). b) Crie o cdigo para calcular a adio do tempo de emprstimo com a data escolhida. A sada deve se assemelhar a algo como : Data do Emprstimo : 27/2/2001 Nmero de Dias : 3 Data da Devoluo : 2/3/2001 Preste ateno na sada acima. A soma de trs dias na data de emprstimo resultou na passagem de um ms para outro. Alm disso, como o ano 2001 no bissexto e o ms de emprstimo foi fevereiro, ao somar-se 3 dias os dias que se passaram foram : 28/2 1/2 2/3 . Voc deve estar atento tambm para : Se o emprstimo passar de um ms para outro o ms deve ser incrementado Se o emprstimo passar de um ano para outro o ano dever ser incrementado

27

5 Mtodos
Quando definimos um objeto num programa orientado a objetos, implementamos todo o comportamento desse objeto em um ou mais mtodos. Um mtodo em Java equivalente a uma funo, subrotina ou procedimento em outras linguagens de programao. No existe em Java o conceito de mtodos globais. Todos os mtodos devem sempre ser definidos dentro de uma classe. A sintaxe para construo de um mtodo a seguinte : [modificador] tipo_retorno identificador ([argumentos]) { //Corpo do mtodo } 5.1 Modificadores de Acesso Java controla o acesso a atributos e mtodos atravs do uso dos modificadores de acesso. So eles : public : o menos restritivo de todos. Atributos e mtodos declarados como public em uma classe podem ser acessados pelos mtodos da prpria classe, por classes derivadas desta e por qualquer outra classe em qualquer outro pacote (veremos mais sobre pacotes e classes derivadas posteriormente). protected : Atributos e mtodos definidos como protected so acessveis pelos mtodos da prpria classe e pelas classes derivadas. private : o mais restritivo. Atributos e mtodos declarados como private s podem ser acessados pelos mtodos da prpria classe.

Quando nenhum modificador definido (acesso do tipo package), os atributos e mtodos podem ser acessados pelos mtodos da prpria classe, pelas classes derivadas e por qualquer outra classe dentro do mesmo pacote. importante destacar que esse controle no se aplica s variveis locais aos mtodos. 5.2 Nome de Mtodos O nome de um mtodo deve comear com uma letra (a-z/A-Z), um underscore ( _ ), ou um sinal de dlar ( $ ). Os caracteres subsequentes podem incluir os dgitos de 0 a 9. Conveno : Use verbos para nome de mtodos. Faa a primeira letra do nome minscula com cada letra inicial interna maiscula. Por exemplo : getUserName(), getMaxPrice().

5.3 Argumentos Um mtodo pode ter zero ou mais argumentos (ou parmetros).

28

Caso no tenha argumentos, necessrio informar os parnteses vazios tanto na definio como na chamada do mtodo. O nome do mtodo acrescido de seus parmetros denominado assinatura do mtodo. Cada argumento deve ser declarado como define-se uma varivel, especificando o seu tipo e nome. Caso seja mais de um argumento, cada declarao deve estar separada por vrgula.

Exemplos : public void setAge(int newAge) { age = newAge; } public void displayAge() { System.out.println(Age is : + age); }

public void setUser(int newAge, String newName) { age = newAge; name = newName; } 5.4 Retornando Valor a Partir de um Mtodo possvel associar um valor de retorno a um mtodo. Para isso, preciso definir, na frente do nome do mtodo, o tipo do valor a ser retornado. O tipo pode ser um primitivo ou ento uma classe ou interface. Caso o mtodo no retorne valor algum, obrigatria a utilizao do tipo void na assinatura do mtodo. Exemplos : public int getAge () { return age; } public String getName () { return name; }

O comando return utilizado para passar o valor requerido de volta para quem chamou o mtodo e obrigatrio quando o tipo de retorno no void. Ele deve receber um nico valor ou uma expresso que deve ser compatvel com o tipo de retorno especificado para o mtodo. Quando o comando encontrado, o mtodo termina sua execuo imediatamente, ignorando todas as instrues subsequentes. Um comando return sem valor de retorno retorna o tipo void, mas no obrigatria sua utilizao nestes casos. 5.5 Passando Parmetros para um Mtodo Passando um Primitivo : Quando um valor primitivo passado na chamada de um mtodo, uma cpia deste valor criada e atribuda para o argumento do mtodo responsvel por receb-la. Se o mtodo mudar este valor, apenas o valor do argumento local ao mtodo afetado. Quando o mtodo terminar sua execuo, o
29

valor original da varivel utilizada para passar o valor primitivo na chamada do mtodo permanecer inalterado. public void incrementa (int num) { num++; int num = 10; System.out.println(num : + num); } incrementa (num); Imprimir 11 System.out.println(num : + num); Imprimir 10

Passando a Referncia de um Objeto : Quando o tipo passado para o mtodo no for um primitivo mas sim um objeto, esse comportamento muda. Quando passamos um objeto, uma referncia ao objeto original passada ao invs de uma cpia do objeto. A referncia contm o endereo de memria onde est contido o objeto original e qualquer modificao feita pelo mtodo no argumento que recebeu esta referncia afetar tambm o objeto original. StringBuffer texto = new StringBuffer("Texto inicial!"); System.out.println("O valor de texto : " + texto); concatMsg(texto); System.out.println("O valor de texto : " + texto);
Texto inicial! Texto inicial! Esta frase foi acrescentada ao objeto dentro do mtodo!

StringBuffer

public void concatMsg (StringBuffer msg){ msg.append(" Esta frase foi acrescentada ao objeto dentro do mtodo!"); }

30

Exerccios : 1) Digite e execute o cdigo abaixo, onde um objeto da classe String passado como parmetro para um mtodo. Ocorreu algo de inesperado? Procure explicar o que. public class testeMetodos{ public testeMetodos() { } public void concatMsg (String msg){ System.out.println("O valor de texto : " + msg.concat("Esta frase foi acrescentada ao objeto dentro do mtodo!")); } public static void main(String[] args) { testeMetodos testeMetodos1 = new testeMetodos (); String texto = new String("Texto inicial!"); System.out.println("O valor de texto : " + texto); testeMetodos1.concatMsg(texto); System.out.println("O valor de texto : " + texto); } }

31

6 Classes e Objetos em Java


A orientao a objeto a tcnica de desenvolvimento e modelagem de sistemas que facilita a construo de programas complexos a partir de conceitos que nos permitem modelar o mundo real to prximo quanto possvel da viso que temos desse mundo. Enquanto o desenvolvimento estruturado baseia suas abstraes para compreenso de um problema nos procedimentos necessrios para sua soluo, a orientao a objetos nos permite model-lo num nvel maior de abstrao, atravs da identificao natural que fazemos das entidades que o compe, caracterizando-as a partir de certas propriedades que definem seus principais aspectos estruturais e comportamentais. Objetos so um conjunto de dados mais um conjunto de procedimentos que representam a estrutura e o comportamento inerentes s entidades, concretas ou abstratas, do mundo real. Entidades concretas so aquelas que representam objetos concretos tais como um carro ou um avio. Possuem uma coleo de atributos (material, caractersticas mecnicas, custos, mtodos construtivos) e uma coleo de mtodos prprios que manipulam e fornecem respostas a partir dos valores desses atributos (reaes, deslocamentos, custo total). Alm destas, entidades no to concretas, como a representao de elementos geomtricas num plano, por exemplo, so tratadas como objetos. Nesse caso, a estrutura composta por atributos que constituem variveis como o nmero de lados e valores dos ngulos internos e o comportamento ditado por mtodos que informam a rea ou algum outro valor que servir de contribuio para a soluo de um problema matemtico. Na Programao Orientada a Objeto (POO), nada impede que a essncia de um objeto seja o processamento ao invs da estruturao ou vice-versa. Na verdade, objetos podem ser, em princpio, o modelo de qualquer coisa, desde um processamento puro at um dado puro, sendo todos, sob a tica da POO, igualmente considerados objetos. O paradigma da orientao a objetos prev a definio de objetos como principal artifcio na modelagem de uma aplicao. Sendo assim, a primeira atividade a ser executada na implementao de uma aplicao orientada a objetos a identificao dos objetos que a compe e suas propriedades. Essa identificao sempre depende do propsito, porque o propsito que permite determinar quais informaes sero representadas e que operaes sero executadas pelos objetos. Em outras palavras, a identificao de quais atributos e mtodos ter um objeto depende sempre do contexto da aplicao, de como pretendemos usar o objeto. S tendo isso em mente podemos levantar os atributos e mtodos relevantes ao objeto e suprimir aqueles irrelevantes para o sistema em questo. A classe a construo de linguagem mais comumente utilizada para implementar um objeto em linguagens de programao orientada a objeto. Objetos com a mesma estrutura e o mesmo comportamento pertencem a mesma classe de objetos. O conjunto de dados de um objeto chamamos atributos e o conjunto de procedimentos de mtodos do objeto. Uma classe, portanto, uma descrio dos atributos e dos mtodos de determinado tipo de objeto. Em termos de programao, definir classes significa formalizar um novo tipo de dado e todas as operaes associadas a esse tipo, enquanto declarar objetos significa criar variveis do tipo definido. Uma instncia um objeto gerado por uma classe. A classe apenas a representao de um objeto enquanto a instncia de uma classe o objeto propriamente dito, com tempo
32

e espao de existncia. O contedo de um objeto, ou seu estado interno, definido por suas variveis de instncia (atributos), sendo que dois objetos diferentes da mesma classe podem possuir valores diferentes para seus atributos e conseqentemente apresentarem estados internos diferentes. Exemplo: public class Ponto { double x; double y; void girar (int grau, Ponto ponto) {
Os atributos ou variveis de instncia formam o estado interno de um objeto. Eles definem os dados que um objeto deve possuir. Os mtodos representam as operaes que um objeto pode executar. Estas operaes podem, dentre outras coisas, alterar o estado interno do objeto.

//Cdigo para girar esse ponto em torno de outro } } Ponto P1;


Aqui, estamos definindo uma varivel do tipo Ponto. Dizemos que P1 uma instncia da classe Ponto, isto , corresponde a um objeto desta classe.

Estudo de Caso Vamos analisar o problema abaixo extrado da computao grfica: Desenhar um crculo na tela do computador. Deve ser possvel configurar a cor que o crculo estar preenchido bem como seu dimetro. Dado o problema e seus requisitos, devemos proceder com a modelagem do mesmo, isto , analisar suas caractersticas para decidir qual a melhor forma de representar a soluo numa abordagem orientada a objetos. Vamos supor que no esteja disponvel uma rotina que execute o que se pede. A nica coisa que sabemos como imprimir na tela do computador uma linha dado seus pontos de origem e destino. Sendo assim, baseado no que sabemos fazer, teremos que analisar o problema at conseguirmos decomp-lo em estruturas mais primitivas que, quando combinadas, iro produzir uma soluo. Os passos de raciocnio poderiam ser estes: Deve ser possvel configurar o dimetro do crculo e o dimetro mede duas vezes o raio. O raio pode ser representado por uma linha cujo ponto inicial o centro do crculo e o ponto final sua extremidade. Uma linha formada por dois pontos, cada um com suas coordenadas (x,y) e possui uma cor. Uma cor definida por seus componentes RGB (Red, Green, Blue). Bem, se sabemos pintar uma linha na tela, podemos definir o raio do crculo e ir pintando uma linha do lado da outra, mantendo as coordenadas do centro constantes e calculando as coordenadas da extremidade de forma que represente um grau de distncia da linha anterior at completar 360.

De acordo com a descrio acima, podemos identificar 4 entidades com caractersticas prprias e que so candidatas a tornarem-se objetos da nossa aplicao: cor ponto linha circulo
33

Em Java, os dados e os mtodos pertinentes a cada uma dessas entidades poderiam ser modelados nas seguintes classes: public class Cor { double Red; double Green; double Blue; } public class Ponto { double x; double y; void girar (int grau, Ponto p) { Compoenentes RGB da cor

Coordenadas do ponto

Mtodo que implementa o comportamento do ponto de saber girar em torno de outro.

//Cdigo para girar o ponto em torno de outro ponto p a quantidade definida em //grau } } public class Linha { Ponto a; Ponto b; Cor color; void imprimeLinha() { Uma classe pode (deve) ser construda a partir de outras. A este relacionamento d-se o nome de agregao. Neste caso, a classe Linha utiliza as classes Ponto e Cor para compor seus atributos. Ela tambm possui um mtodo que implementa a operao de impresso da linha.

//Cdigo para imprimir essa linha na tela } } public class Crculo { final int GRAU = 360; Linha raio; Cor cor; void criaCrculo () { A classe Crculo a abstrao de mais alto nvel desse problema. Na verdade, criamos todas as outras classes para conseguirmos no final gerar um crculo na tela. O fato de quebrarmos um grande objeto (problema) em um nmero de objetos de mais baixo nvel, consiste numa abordagem eficaz para compreendermos problemas complexos e possibilita freqentemente a reutilizao destes objetos na soluo de outros problemas.

raio.imprimeLinha(); for (int i = 0 ; i < GRAU ; i++) { //gira o ponto b do raio (extremidade) i graus em relao ao ponto a (centro) raio.b.girar(i, raio.a); //imprime a linha resultante Este mtodo utiliza a Linha que raio.imprimeLinha(); representa o raio do crculo e gera um crculo da mesma cor da linha. A }//fim for funcionalidade do mtodo }//fim criaCirculo basicamente executada por chamadas a }//fim Circulo mtodos de outras classes, simplificando sua implementao.

34

A classe Crculo foi composta basicamente pela agregao de outras classes que implementam funcionalidades mais especficas. Essa abordagem bottom-up no tratamento de um problema, onde pequenos mdulos so agrupados para gerarem outros maiores e com funcionalidades mais complexas, facilita a implementao, aumenta a legibilidade do cdigo e melhora em muito a manutenibilidade da aplicao. 6.1 Encapsulamento Diferente da abordagem estruturada, onde dados e procedimentos so definidos de forma separada na cdigo, na programao orientada a objeto os dados e procedimentos que manipulam estes dados so definidos numa unidade nica, o objeto. Isso possibilita uma melhor modularidade do cdigo, porm, a idia principal poder utilizar os objetos sem ter que se conhecer sua implementao interna, que deve ficar escondida do usurio do objeto que ir interagir com este apenas atravs de sua interface. propriedade de se implementar dados e procedimentos correlacionados em uma mesma entidade e de se proteger sua estrutura interna escondendo-a de observadores externos d-se o nome de encapsulamento. O objetivo do encapsulamento separar o usurio do objeto do programador do objeto e seus principais benefcios so: possibilidade de alterar a implementao de um mtodo ou a estrutura de dados escondidos de um objeto sem afetar as aplicaes que dele se utilizam; criao de programas mais modulares e organizados, o que possibilita um melhor reaproveitamento do cdigo e melhor mantenabilidade da aplicao.

Via de regra, as variveis de instncia declaradas em uma definio de classe, bem como os mtodos que executam operaes internas sobre estas variveis, se houverem, devem ser escondidos na definio da classe. Isso feito geralmente atravs de construes nas linguagens de programao conhecidas como modificadores de acesso, como por exemplo o public, protected e private do Java. Quando definimos uma classe, recomendado (para alguns uma regra sagrada) que declaremos pblicos apenas os mtodos da sua interface. na interface (ou protocolo) da classe que definimos quais mensagens podemos enviar s instncias de uma classe, ou seja, quais so as operaes que podemos solicitar que os objetos realizem. Por exemplo, na classe Ponto acima, deveramos ter feito seus atributos protegidos e apenas o mtodo pblico: public class Ponto { private double x; private double y; public void girar (int grau, Ponto p) { //Cdigo para girar o ponto em //torno de outro ponto p a quantidade // definida em grau } public void setX (double k) { x = k; } public void setY (double k) { y = k; } public double getX () { return x; } public double getY () { return y; } }
35

Os mtodos pblicos consistuem a interface da classe.

comum em programao orientada a objeto definir mtodos gets e sets que provm acesso aos dados protegidos da classe.

6.2 Criando Objetos e Acessando Dados Encapsulados Criamos objetos em Java de forma muito similar a criao de variveis de tipos primitivos. Se uma aplicao quisesse usar a classe Crculo, poderia declarar uma varivel deste tipo da seguinte forma: Crculo crculo; Como Java case-sensitive pode-se declarar desta forma.

Esta sentena cria uma varivel crculo do tipo Crculo. Entretanto, isso no suficiente para acessarmos os mtodos e atributos pblicos da classe. A sentena acima somente declara uma varivel mas no cria um objeto da classe especificada. Em Java, objetos so criados usando o operador new da seguinte forma: Crculo crculo; crculo = new Crculo(); O operador new cria uma instncia da classe e retorna a referncia do novo objeto. Como vimos, todos os objetos em Java so tratados atravs da referncia ao endereo de memria onde o objeto est armazenado. O operador new realiza trs tarefas: 1. Aloca memria para o novo objeto 2. Chama um mtodo especial de inicializao da classe chamado construtor 3. Retorna a referncia para o novo objeto importante compreender o que ocorre na declarao da varivel e na inicializao da varivel. Quando fazemos O null um valor vlido em Java e
permite comparaes como:

Crculo crculo;

null

if (crculo == null)

reservado uma poro da memria principal do Java (stack) para armazenar o endereo na memria auxiliar (heap) onde o objeto ser armazenado. Como apenas com a declarao da varivel o objeto ainda no existe, o contedo inicial dela ser o valor nulo (null), indicando que ela ainda no se refere a nenhum objeto. Apenas aps a inicializao crculo = new Crculo();
raio; cor;

que uma varivel de um tipo no primitivo estar valendo algo e atravs dela ser possvel acessar os dados e operaes do objeto em questo. Uma vez um objeto tendo sido criado, seus mtodos e atributos pblicos podem ser acessados utilizando o identificador do objeto (varivel que armazena sua referncia) atravs do operador ponto: <identificador>.<atributo> <identificador>.<mtodo> A aplicao que criou o objeto Crculo acima pode solicitar ao objeto que ele se desenhe fazendo : crculo.criaCrculo();
36

6.3 Construtores O construtor de uma classe um mtodo especial com as seguintes caractersticas: o primeiro mtodo executado por um objeto Deve ter o mesmo nome da classe No pode ter um tipo de retorno utilizado quando um objeto instanciado atravs do operador new Na maioria das vezes declarado como public

obrigatrio uma classe conter ao menos um construtor. Se uma classe for definida sem a presena de um, o compilador Java ir criar automaticamente um construtor default da seguinte forma:
Construtores devem ter o mesmo nome da classe. O construtor default criado pelo compilador no executa comando algum e no possui nenhum parmetro.

Crculo() { }
Construtores no devem ter tipo de retorno.

Na classe Crculo no definimos nenhum mtodo construtor, mas mesmo assim podemos criar a varivel crculo chamando o construtor default da classe. Como os construtores so os primeiros mtodos executados por um objeto eles geralmente so utilizados para inicializar variveis de instncia da classe, porm, nada impede que executem qualquer operao que se queira. Vamos alterar nossas classes acima e definir construtores para elas: public class Cor { ! Cor(double vermelho, double verde, double azul) { Red = vermelho; Grenn = verde; public class Ponto Blue = azul; { } private double x; double Red; private double y; double Green; ! Ponto(double p1,double p2){x = p1; y = p2;} double Blue; public void girar (int grau, Ponto p) { } //Cdigo para girar o ponto em //torno de outro ponto p a quantidade public class Linha // definida em grau } { public void setX (double k) { x = k; } Ponto a; public void setY (double k) { y = k; } Ponto b; public double getX () { return x; } Cor color; public double getY () { return y; } void imprimeLinha() { ... } } ! Linha(Ponto ori, Ponto dest, Cor c) { a = ori; b = dest; color = c; } }
37

public class Crculo { final int GRAU = 360; Linha raio; Cor cor; ! Crculo() {}

Quando definimos algum construtor para a classe, temos que implementar manualmente o construtor default caso queiramos us-lo.

! Crculo(Ponto centro, Ponto extremidade, Cor c) { raio = new Linha(centro, extremidade, c); cor = c; } ! Crculo (double x1, double y1, double x2, double y2, Cor c) { raio = new Linha(new Ponto(x1, y1), new Ponto(x2, y2), c); cor = c ; } void criaCrculo () { raio.imprimeLinha(); for (int i = 0 ; i < GRAU ; i++) { //gira o ponto b do raio (extremidade) i graus em relao ao ponto a (centro) raio.b.girar(i, raio.a); //imprime a linha resultante raio.imprimeLinha(); }//fim for }//fim criaCirculo }//fim Circulo Dado os construtores definidos, vamos analisar as possibilidades de implementao para se construir um crculo: Usando o construtor Crculo(): Se quisermos criar um crculo usando o construtor default, teremos que criar antes uma linha e uma cor e ento atribuirmos seus valores manualmente para o crculo.
Crculo crculo = new Crculo(); Cor c = new Cor (1.0, 2.0, 1.0); Ponto p1 = new Ponto(0,0); Ponto p2 = new Ponto(2,0); Linha l = new Linha (p1, p2, c); crculo.raio = l; crculo.cor = c; crculo.criaCrculo();

Uma classe pode ter mais de um construtor.

Usando o construtor Crculo(Ponto, Ponto, Cor):


Cor c = new Cor (1.0, 2.0, 1.0); Ponto p1 = new Ponto(0,0); Ponto p2 = new Ponto(2,0); Crculo crculo = new Crculo(p1,p2,c) crculo.criaCrculo();

38

Usando o construtor Crculo(double x1, double y1, double x2, double y2, Cor c):
Cor c = new Cor (1.0, 2.0, 1.0); Crculo crculo = new Crculo(0, 0, 2, 0, c); crculo.criaCrculo();

Definir mais de um construtor para a mesma classe fornece maior flexibilidade para sua utilizao. 6.4 O Ponteiro this Todos os mtodos de instncia recebem um argumento implcito chamado this, que pode ser usado dentro do mtodo para se referir ao objeto ao qual aquele mtodo pertence. Mas para que iramos querer um ponteiro para o prprio objeto se dentro de um mtodo possvel acessar qualquer outro mtodo ou atributo da classe? Existem duas situaes onde devemos usar uma referncia explcita ao this: Quando o nome de uma varivel de instncia escondido por um argumento de um mtodo. Por exemplo, se tivssemos criado o construtor Crculo(Linha r) como Crculo (Linha raio) { raio = raio; cor = raio.color ; } a atribuio raio = raio no ia causar o efeito desejado pois onde raio aparece dentro do mtodo est se referindo ao argumento e no a varivel de instncia. Para este cdigo funcionar apropriadamente teramos que usar o ponteiro this da seguinte forma: Crculo (Linha raio) { this.raio = raio; cor = raio.color ; } Quando preciso passar uma referncia ao objeto corrente como argumento a um outro mtodo. Vamos supor a existncia de uma classe chamada Transforma capaz de realizar transformaes geomtricas num crculo qualquer. Vamos supor tambm que a classe Crculo possua um mtodo chamado Duplica() para duplicar seu tamanho e que este mtodo utiliza um objeto da classe Transforma. O cdigo de Duplica() : Duplica() { Transforma t = new Transforma(); t.duplicar(this); } Passa o prprio objeto como parmetro.

39

Exerccios : 1) Para iniciar a prtica deste captulo, voc deve modelar o problema descrito abaixo, que descreve o negcio da ACME Vdeo Locadora. Sero apresentadas inmeras informaes que ajudaro voc a determinar as classes, mtodos, atributos e associaes que compem o negcio. Fique livre para escolher o formato que pretende usar para comunicar o que voc encontrou. A ACME vdeo locadora est no negcio de aluguel de vdeos e estamos interessados neste momento em automatizar o processo de retirada das fitas. Este processo consiste do cliente, aps ter escolhido as fitas que deseja, lev-las at o balco de retirada. O funcionrio responsvel ir solicitar o nmero do carto de associado do cliente e depois cadastrar os IDs dos itens que este escolheu. Nossos clientes devem se cadastrar como associados antes de poderem efetuar qualquer locao. Ns armazenamos informaes como nome, endereo e telefone e cada cliente possui um ID nico que utilizar para efetuar as locaes. Quando uma locao efetivada, damos um nmero nico para ela que ser utilizado posteriormente para mantermos o controle da mesma. A efetivao de uma locao possui informaes como: data de incio, o cliente que solicitou e uma lista dos itens alugados. Para cada item alugado controlamos a data que deve ser devolvido e a data que realmente foi devolvido. A data de devoluo dependente de quantos dias um item pode permanecer emprestado, sendo assim, cada item pode ter uma data diferente. Os itens para emprstimo so atualmente apenas fitas de vdeo. Mas pretendemos alugar em breve jogos e DVDs. Cada item para emprstimo possui as seguintes informaes: preo do aluguel, o nmero de dias que pode permanecer emprestado, o ttulo do filme, [0][0] uma breve descrio (sinopse) e uma categoria (ao, aventura, etc). a) Identifique as classes que compem o negcio da ACME Locadora. Escreva uma breve descrio sobre ela para ter certeza de sua relevncia para o negcio. b) Identifique os atributos de cada uma das novas classes. Lembre-se que um atributo pode ser outra classe. c) Defina alguns comportamentos para cada uma das classes. 2) A partir da anlise do exerccio anterior, provavelmente (:-)) voc vai ter chegado nas seguintes classes, atributos e mtodos:
ItemAlugado dataDevolucao dataDevolvida item getPreco() calcDataDevolucao Item Id titulo descricao categoria preco numeroDias setPreco getPreco ...

;;;
Aluguel numeroAluguel dataInicio cliente AddItem() ... Cliente Id nome endereco telefone getNome() ...

40

Agora vamos iniciar a implementao da aplicao ACME Vdeo Locadora. Voc ir criar um projeto e adicionar as classes identificadas. Estas classes formam a base para a aplicao que ser desenvolvida no restante deste curso. a) Abra o projeto chamado ACMEVideo que deve conter um mtodo main. b) Crie a classe Cliente de forma que ela no contenha um mtodo main(), seja pblica e contenha um construtor default. Adicione ento os atributos privados da classe: int id String nome String endereco String telefone Adicione tambm mtodos pblicos para setar e pegar cada um dos atributos privados. Utilize um padro de nome como setId, setNome, getId, getNome, etc: void setId(int id){ this.id = id;} No mtodo main() do projeto crie dois clientes e estipule valores para seus atributos utilizando os mtodos pblicos da classe. At este momento no h uma forma de apresentar o contedo de um objeto cliente. Para remediar esta deficincia adicione classe Cliente o mtodo toString(), que retorna uma String contendo o id, nome do cliente, endereo e telefone. Voc pode usar o operador + para concatenar Strings. Chame este mtodo e imprima a String de retorno usando System.out.println(...). public String toString(){ return (atributo1 + + atributo2 ...); } c) Crie a classe Item como pblica, sem construtor e sem mtodo main(). Defina seus atributos privados e mtodos para setar (setId) e ler (getId) os atributos. int getId(){ return id;} Os atributos desta classe so: int id String titulo String descricao String categoria double preco int numeroDias Crie no mtodo main do projeto ACMEVideo alguns Itens para testar os mtodos.

41

Adicione classe um mtodo toString() que apresenta as variveis titulo, descrio e categoria. d) Vamos agora adicionar um outro construtor na classe Cliente. Este deve inicializar os atributos nome, endereo e telefone do objeto. Modifique o mtodo main() da aplicao ACMEVideo para usar o novo construtor. Compile e teste o programa imprimindo o contedo dos objetos Cliente criados para ter certeza que o construtor os inicializou corretamente. e) Adicione um construtor default que no faz nada para a classe Item e tambm um que inicialize os atributos titulo, descricao, categoria, preo e numeroDias. Modifique novamente o mtodo main() para usar este novo construtor e teste a aplicao como feito com a classe Cliente.

42

7 Mais Sobre Classes e Objetos


7.1 Pacotes Um pacote uma coleo de classes que esto logicamente relacionadas. Um pacote consiste de todas as classes Java contidas num diretrio. Por exemplo, as classes da aplicao ACME Vdeo que estamos desenvolvendo em nossos exerccios localizam-se no diretrio do projeto chamado ACMEVideo e consequentemente fazem parte do pacote ACMEVideo. O nome do pacote deve ter o mesmo nome do diretrio onde as classes esto armazenadas e a declarao do pacote a qual uma classe pertence dever ser feita no incio do arquivo fonte da classe da seguinte forma: package ACMEVideo; Como sabemos, Java tem uma vasta biblioteca2 de classes que podem ser utilizadas para ajudar-nos no desenvolvimento de nossos programas. Para termos acesso a uma biblioteca Java em nossa aplicao devemos utilizar o comando import da seguinte forma: import java.util.Vector; se quisermos utilizar apenas a classe Vector do pacote util, ou import java.util.*; se quisermos deixar todas as classes do pacote java.util disponveis para nossa aplicao. O comando import deve ser especificado antes da definio de todas as classes. O caminho java.util corresponde ao diretrio onde as classes do pacote util foram armazenadas, colocando-se o ponto (.) para referenciar a passagem de um diretrio para outro. importante ter em mente que, diferentemente do C, acrescentar pacotes num programa Java no implica em as classes contidas neles serem carregadas dentro do programa. Isto apenas instrui ao compilador e JVM onde procurar pelas classes que sero necessrias para a execuo. Resumindo, inserir comandos import no degrada a performance da aplicao. Alm de possibilitar uma melhor organizao, os pacotes servem para o Java desempenhar dois controles importantes: 1. Controle de nomes de classes: Dentro de um pacote no pode haver duas classes com o mesmo nome, porm, em pacotes diferentes, isto totalmente possvel. Se assim no fosse, teramos que nos certificar sempre que as classes que estamos desenvolvendo no possuem o mesmo nome de nenhuma classe em algum pacote que estejamos utilizando. Por exemplo, possvel definirmos uma classe chamada Vector pertencente ao pacote ACMEVideo. Se uma terceira classe X quiser utilizar a classe Vector do pacote util e a classe Vector do pacote ACMEVideo dever

Pacotes so distribudos em arquivos com extenso .JAR e consistem nas APIs do Java.
43

especificar o nome completo dos pacotes na declarao das variveis da seguinte forma: class X { java.util.Vector atributo1; ACMEVideo.Vector atributo2; ... } 2. Controle de acesso: Vamos recapitular os mecanismos de controle de acesso a mtodos e atributos vistos no Captulo 5: public: o menos restritivo de todos. Atributos e mtodos declarados como public em uma classe podem ser acessados pelos mtodos da prpria classe, por classes derivadas desta e por qualquer outra classe em qualquer outro pacote (veremos mais classes derivadas posteriormente). protected: Atributos e mtodos definidos como protected so acessveis pelos mtodos da prpria classe e pelas classes derivadas. private: o mais restritivo. Atributos e mtodos declarados como private s podem ser acessados pelos mtodos da prpria classe.

Quando nenhum modificador definido (acesso do tipo package), os atributos e mtodos podem ser acessados pelos mtodos da prpria classe, pelas classes derivadas e por qualquer outra classe dentro do mesmo pacote. Alm disso, existem os modificadores de acesso a classes. A declarao de uma classe geralmente comea com o modificador de acesso public, o que significa que pode ser acessada por qualquer outra classe. Se for omitido, a classe ser visvel apenas por outras classes do mesmo pacote que a contm. 7.2 Atributos e Mtodos de Classe Variveis de classe so declaradas de forma semelhante s variveis de instncia, com a diferena de que devemos acrescentar a palavra reservada static: static tipo identificador [= valor]; Uma varivel de classe compartilhada por todas as instncias desta classe. Por exemplo, considerem a classe X e o trecho de cdigo que utiliza X: class X { public static int a = 10; ... } X var1 = new X(); X var2 = new X(); System.out.println(var1.a); //imprime 10 var1.a = 20; System.out.println(var2.a); //imprime 20

44

Quando var1 modifica a varivel de classe a, o novo valor visvel a todos os objetos desta classe, pois a representa a mesma posio de memria acessada por todos. Variveis de classe no podem ser inicializadas nos construtores. Se precisarem de inicializao, isto geralmente feito no momento da declarao da varivel. Mtodos de classe tambm so declarados com o auxlio do modificador static: [modificador] static tipo_retorno identificador ([argumentos]) { //Corpo do mtodo } Como um mtodo de classe compartilhado por todas as instncias da classe, ele no se refere a um objeto em particular e por isso no recebe o ponteiro implcito this. Mtodos de classe podem acessar somente variveis de classe e outros mtodos estticos. Uma caracterstica interessante dos mtodos estticos, bem como dos atributos, que eles podem ser acessados mesmo sem a existncia de uma instncia da classe. class X { public static int a = 10; static void setA(int x){ a = x; } ... } No exemplo acima, o mtodo e atributo esttico da classe X foram acessados diretamente referenciando-se a classe, sem a necessidade de criarmos uma instncia da mesma . Nas bibliotecas do Java encontramos inmeros casos de atributos e mtodos estticos. Nosso conhecido mtodo main(), por exemplo, um mtodo esttico, que chamado pela JVM quando uma aplicao executada. A classe Math prove mtodos de classe que executam vrias funes matemticas, como funes trigonomtricas e logaritmos. Um exemplo o mtodo Math.sqrt() que calcula a raiz quadrada de um nmero no negativo. A classe System prove variveis de classe para representar o estado do sistema inteiro. System.out uma varivel de classe que faz referncia ao objeto PrintStream, que representa o fluxo padro de sada. O mtodo println() um mtodo de instncia da classe PrintStream. 7.3 Destrutores e o mtodo finalize() Em linguagens como C, uma classe pode ter um destrutor, utilizado normalmente para liberar recursos requisitados pelo objeto, como memria alocada, arquivos abertos, etc. Java gerencia a memria automaticamente, ento um objeto no precisa liberar qualquer memria alocada. Consequentemente, Java no suporta destrutores. Ao invs disso, para permitir a um objeto liberar outros recursos (diferentes de memria), tal como arquivos abertos, Java possibilita a implementao de um mtodo finalize().
45

... X.setA(20); System.out.println(X.a);

O mtodo finalize() chamado automaticamente quando um objeto coletado, portanto no possvel saber quando este ser chamado. Ele no possui tipo de retorno e no assume nenhum parmetro.

46

Exerccios : 1) Dada a classe abaixo, assinale as expresses que so corretas. public class Filme { private static float preco = 3.50f; private String taxa; public static void setPreco(float novoPreco) { preco = novoPreco; } public float getPreco() { return preco; } Filme.setPreco(3.98f); Filme mov1 = new Filme(); mov1.setPreco(3.98f); float a = Filme.getPreco(); float b = mov1.getPreco();

2) Nesta lio iremos melhorar as classes da lio passada com os recursos que aprendemos aqui. A classe Cliente possui dois construtores: um sem argumento e outro que recebe o nome, endereo e telefone de um cliente como parmetro. a) Crie uma varivel esttica e privada na classe Cliente do tipo inteiro e chamada proximoId. Esta deve ser inicializada com zero. b) Modifique o construtor default para que este incremente o valor desta varivel e atribua o resultado para o atributo id do novo objeto. c) Modifique o outro construtor para que ele chame o construtor default e desta forma tambm inicialize o atributo id. Obs: Em Java, para chamarmos um mtodo construtor dentro de outro mtodo qualquer, no podemos chamar o mtodo pelo seu nome mas sim utilizando a sintaxe abaixo: this (<lista de argumentos>); d) Recompile e execute novamente a aplicao. Observe que agora o valor de id no mais zero. e) Qual a vantagem de se usar um atributo de classe para fazer o controle do id dos objetos? 3) Faa as mesmas modificaes para a classe Item, porm com a varivel esttica proximoId iniciando em 1000.

47

8 Herana e Polimorfismo
Nas sees anteriores aprendemos sobre classes, objetos e encapsulamento, conceitos fundamentais do paradigma da orientao a objeto. Nesta seo, abordaremos dois outros conceitos importantes e relacionados entre si: herana e polimorfismo. 8.1 Herana A herana a principal caracterstica de distino entre um sistema de programao orientado a objeto e outros sistemas de programao. As classes so inseridas em uma hierarquia de especializaes de tal forma que uma classe mais especializada herda todas as propriedades da classe mais geral a qual subordinada na hierarquia. A classe mais geral denominada superclasse e a classe mais especializada subclasse. O principal benefcio da herana a reutilizao de cdigo. A herana permite ao programador criar uma nova classe programando somente as diferenas existentes na subclasse em relao superclasse. Isto se adequa bem a forma como compreendemos o mundo real, no qual conseguimos identificar naturalmente estas relaes. A fim de exemplificarmos este conceito, vamos considerar que queiramos modelar os seres vivos pluricelulares existentes no planeta. Podemos ento comear com a classe SerVivo abaixo:
SerVivo

Ela modela as caractersticas que todo ser vivo deve possuir, como a capacidade de reproduzir-se ou a necessidade de alimentar-se. Sendo assim, a classe SerVivo define atributos e mtodos tais como: Atributos: Alimentos, Idade Mtodos: Nascer, Alimentar, Respirar, Crescer, Reproduzir, Morrer

Os seres vivos por sua vez classificam-se em Animais e Vegetais, os quais possuem caractersticas prprias que os distingue:
SerVivo

Animal

Vegetal

Analisando o problema em questo (o de modelar os seres vivos), ns naturalmente identificamos classes que so especializaes de classes mais genricas e o conceito de herana da orientao a objeto nos permite implementar tal situao. Os animais e vegetais antes de tudo so seres vivos e cada subclasse herda automaticamente os atributos e mtodos (respeitando as regras dos modificadores de acesso) da superclasse, neste caso, a classe SerVivo. Alm disso, as subclasses podem prover atributos e mtodos adicionais para representar suas prprias caractersticas. Por exemplo, a classe Animal poderia definir os seguintes mtodos e atributos: Atributos: Forma de Locomoo, Habitat, Tempo Mdio de Vida Mtodos: Locomover
48

A herana na programao obtida especificando-se qual superclasse a subclasse estende. Em Java isto feito utilizando-se a palavra chave extends: public class SerVivo { //Definio da classe SerVivo } public class Animal extends SerVivo { //Atributos e mtodos adicionais que distinguem um Animal de um SerVivo //qualquer } Em Java, todas as classes, tanto as existentes nas APIs como as definidas pelos programadores, automaticamente derivam de uma superclasse padro, a classe Object. Se uma classe no especifica explicitamente uma superclasse, como o caso da classe SerVivo, ento podemos considerar que esta deriva diretamente de Object, como se ela tivesse sido definida como: public class SerVivo extends Object { ... } Alm disso, Java permite apenas herana simples, isto , uma classe pode estender apenas de uma nica outra classe. Resumindo, a classe SerVivo define os atributos e mtodos que so comuns a qualquer tipo de ser vivo. A subclasse Animal herda estes mtodos e atributos, j que Animal um SerVivo , e tem que especificar apenas seus atributos e mtodos especficos.
SerVivo Alimentos, Idade Nascer, Alimentar, Respirar, Crescer, Reproduzir, Morrer Animal Habitat, Locomoo, TMV Locomover

8.2 Polimorfismo O termo Polimorfismo origina-se do grego e quer dizer "o que possui vrias formas". Em programao est relacionado possibilidade de se usar o mesmo nome para mtodos diferentes e capacidade que o programa tem em discernir, dentre os mtodos homnimos, aquele que deve ser executado. De maneira geral o polimorfismo permite a criao de programas mais claros, pois elimina a necessidade de darmos nomes diferentes para mtodos que conceitualmente fazem a mesma coisa, e tambm programas mais flexveis, pois facilita em muito a extenso dos mesmos. O polimorfismo pode ser de duas formas, esttico ou dinmico: Polimorfismo Esttico: Ocorre quando na definio de uma classe criamos mtodos com o mesmo nome porm com argumentos diferentes. Dizemos neste caso que o mtodo est sobrecarregado (overloading). A deciso de qual mtodo chamar tomada em tempo de compilao, baseada nos argumentos que foram passados.
49

Como exemplo de polimorfismo esttico, podemos relembrar dos vrios construtores que criamos para a classe Crculo no Captulo 6: Crculo() {} Crculo(Ponto centro, Ponto extremidade, Cor c) { raio = new Linha(centro, extremidade, c); cor = c; } Crculo (double x1, double y1, double x2, double y2, Cor c) { raio = new Linha(new Ponto(x1, y1), new Ponto(x2, y2), c); cor = c ; } Todos estes mtodos construtores possuem o mesmo nome mas devem ser diferidos entre si pelos parmetros que recebem. Quando num programa fazemos Crculo circulo = new Crculo(linha); o compilador consegue decidir em tempo de compilao qual mtodo chamar, neste caso, o mtodo Crculo que recebe uma linha como parmetro. Polimorfismo Dinmico: Esta associado com o conceito de herana e ocorre quando uma subclasse redefine um mtodo existente na superclasse. Dizemos neste caso que o mtodo foi sobreescrito (overriding) na subclasse. A deciso de qual mtodo executar tomada somente em tempo de execuo, como veremos mais adiante. O polimorfismo dinmico ocorre quando uma subclasse redefine um mtodo de sua superclasse a fim de prover ao mtodo um comportamento mais adequado s suas caractersticas. Vamos rever a classe animal conforme a definimos acima class Animal extends SerVivo{ String formaLocomoo; String habitat; int tempoMdioVida; public void locomover() { ... } } Como nem todo ser ser vivo nasce, cresce, alimenta-se, respira, se reproduz e morre da mesma maneira, razovel que queiramos redefinir todos estes mtodos na classe animal

50

class Animal extends SerVivo{ String formaLocomoo; String habitat; int tempoMdioVida; public void locomover() { ... } public void nascer() { ... } public void crescer() { ... } public void alimentar() { ... } public void respirar() { ... } public Animal reproduzir() { ... } public morrer() { ... } } Os mtodos na subclasse devem ser definidos com a mesma assinatura do mtodo na superclasse, isto , com o mesmo nome, tipo de retorno e argumentos. Bem, mas a vantagem do polimorfismo dinmico no apenas a de permitir maior flexibilidade na modelagem das classes de objetos. Para entendermos o que h de mais fantstico nele, temos que nos atentar para o seguinte: ... SerVivo x; Declara uma varivel x do tipo SerVivo Animal y = new Animal(); Declara e inicializa uma varivel y do tipo Animal x = y; ...
extremamente comum e til em OO atribuirmos a uma varivel de um tipo base um objeto de um tipo derivado direta ou indiretamente deste tipo base.

Tendo isto em mente, poderamos definir um mtodo da seguinte forma void analisaSerVivo (SerVivo ser) { //Este mtodo faz a anlise clnica de qualquer SerVivo e para isso precisa pedir //ao animal que respire ser.respirar(); ... } e num determinado momento cham-lo desta maneira ... Animal animal = new Animal(); analisaSerVivo(animal); ... Neste caso fica a questo, se o mtodo tem um argumento declarado como SerVivo e recebe como parmetro um objeto Animal, quando tiver que executar o mtodo

51

respirar() qual mtodo ser efetivamente chamado, o mtodo respirar definido em SerVivo ou o mtodo respirar definido em Animal? O mtodo executado ser o mais apropriado, isto , aquele pertencente ao objeto que foi passado varivel, neste caso, o mtodo respirar existente em Animal. Isto o polimorfismo dinmico, que recebe este nome porque o compilador no consegue nestes casos decidir em tempo de compilao qual mtodo chamar, j que uma varivel de um tipo base pode receber qualquer tipo derivado. Esta deciso feita apenas em tempo de execuo, quando a o Java poder saber qual objeto a varivel est de fato referenciando. Se o polimorfismo dinmico no existisse, seria necessrio um mtodo analisaSerVivo para cada ser vivo existente, e sempre que um ser vivo novo fosse acrescentado o cdigo teria que ser modificado. Da forma como aqui est, o mtodo continuar funcionando para qualquer ser vivo existente no projeto. 8.3 Criao de um objeto de uma subclasse e o ponteiro super Objetos so sempre construdos da classe mais alta na hierarquia em direo mais baixa, isto , da classe Object at a classe que est sendo instanciada com o operador new. Isto garante que uma subclasse pode sempre contar com a construo apropriada de sua superclasse. Por padro, os construtores default das superclasses (aqueles sem argumentos) o que so chamados quando a superclasse criada. Se quisermos mudar este comportamento devemos usar o ponteiro super. O ponteiro super uma referncia para a superclasse e est disponvel implicitamente em qualquer classe que possua um ancestral. Como vimos, os mtodos na superclasse podem ser sobreescritos na subclasse atravs da criao de mtodos na subclasse com a mesma assinatura do mtodo da superclasse. Com o super possvel acessar um mtodo especfico da superclasse quando este foi sobreescrito pela subclasse. Por exemplo, vamos recordar a classe Animal definida acima que implementava sua prpria verso de todos os mtodos de sua superclasse, isto , SerVivo: class Animal extends SerVivo{ String formaLocomoo; String habitat; int tempoMdioVida; public void locomover() { ... } public void nascer() { ... } public void crescer() { ... } public void alimentar() { ... } public void respirar() { ... } public Animal reproduzir() { ... } public morrer() { ... } }

52

Vamos supor que num determinado momento quisssemos acessar o mtodo alimentarse tal qual como este foi implementado na superclasse. Para isto devemos usar o ponteiro super da seguinte maneira: ... super.alimentar(); ...
Acessa o mtodo alimentar-se de SerVivo.

Bem, mas como afinal de contas podemos mudar o comportamento padro de quando uma subclasse instanciada os construtores default serem executados? Um dos usos mais comuns da referncia super chamar um construtor de uma superclasse. Para isso, este deve ser acrescentado na primeira linha do construtor da subclasse. Por exemplo, se a classe SerVivo tiver um construtor que receba a idade do ser vivo como parmetro SerVivo(int idade){ this.idade = idade; } e queremos que este construtor seja chamado quando a classe Animal for instanciada ao invs do construtor padro SerVivo(), fazemos Animal (int idade){ super(idade); ... } 8.4 Mtodos e Classes final Vimos no Captulo 3 que para criar variveis que so constantes devemos usar o comando final. Vamos agora ver duas novas utilizaes para ele: Mtodos final: Mtodos definidos como final no podem ser sobreescritos. Geralmente isto feito com o intuito de garantir segurana, prevenindo que mtodos vitais, tais como aqueles que fazem autenticao de usurios, sejam redefinidos. Exemplo: public final boolean checkPassword(String p) { ... } Classes final: Uma classe declarada como final no poder ser estendida por outra classe. Esta uma forte deciso no projeto e significa que a classe auto-suficiente para dispor de todos os seus requisitos atuais e futuros. Classes definidas como final podem ajudar o compilador a produzir cdigos mais otimizados. Como uma classe final no pode ser estendida, quando o compilador encontra uma chamada a algum mtodo desta classe ele no gerar o cdigo necessrio para execuo do polimorfismo dinmico, o qual acarreta um overhead durante a execuo, mas sim far um acoplamento esttico com o mtodo em questo.
53

Exerccios: Nesta lio voc vai adicionar duas novas classes que derivam de Item. A ACME Vdeo Locadora decidiu expandir seus negcios e comear a alugar jogos alm dos vdeos. Como jogos possuem alguns atributos diferentes dos filmes, voc decidiu criar subclasses para cada um destes tipos de itens. Cada item possui seus prprios mtodos e redefinem o mtodo toString() da classe Item. Abaixo segue o diagrama UML que mostra o relacionamento entre Item, Filme e Jogos. A seta a notao UML para herana.
Item int id String titulo String descricao double preco int numeroDias String categoria toString() getId() setId() ...

Filme String diretor int duracao toString() setDiretor() getDiretor() setDuracao() getDuracao()

Jogo int memoria String tipo toString() setMemoria() getMemoria() setTipo() getTipo()

Abra o projeto ACME Video da lio 8. 1) Defina uma nova classe Filme. a) Defina a classe Filme que estende a classe Item. A nova classe deve incluir os atributos e mtodos definidos no diagrama acima. b) Adicione um construtor que aceite a seguinte lista de atributos como argumentos: titulo, decricao, preco, numeroDias, categoria, diretor e duracao. c) Inclua uma chamada ao construtor da superclasse Item usando a seguinte sintaxe super(titulo, descricao, categoria , preco, numeroDias) na primeira linha deste construtor. d) Rescreva o mtodo toString() de forma que este retorne uma string com os valores concatenados de id, titulo, diretor e preco da seguinte maneira: 1001 (filme) A Vida Bela (Leonardo Benine) R$ 6,00

54

O texto deve mostrar (filme) para indicar que este item um filme. 2) Defina uma nova classe Jogo a) Defina a classe Jogo que estende a classe Item. A nova classe deve incluir os atributos e mtodos definidos no diagrama acima. b) Acrescente um construtor que aceite como argumentos a seguinte lista de atributos: titulo, descricao, categoria, preco, numeroDias, memoria, tipo c) Adicione uma chamada ao construtor da superclasse Item usando a seguinte sintaxe super(titulo, descricao, categoria, preco , numeroDias) na primeira linha deste construtor. d) Rescreva o mtodo toString() de forma que este retorne uma string com os valores concatenados de id, titulo, tipo e preco da seguinte maneira 1011 (jogo) Lifelike racing (Play Station) - R$ 5,00 O texto deve mostrar (jogo) para indicar que este item um jogo. 3) Teste a aplicao. No mtodo main() do projeto, declare duas variveis do tipo Item chamadas filme e jogo respectivamente. Inicialize-as chamando os construtores recm criados da seguinte maneira: Item filme = new Filme(...); Item jogo = new Jogo(...); Chame o mtodo toString() dos dois objetos. Perceba como a atuao do polimorfismo dinmico ir garantir a correta execuo do mtodo apropriado da subclasse.

55

9 Estruturando o Cdigo com Classes Abstratas e Interfaces


Quando a hierarquia de classes em um programa orientado a objetos torna-se complexa, as classes mais acima (raiz e proximidades) costumam ser bastante gerais. Passa a ser interessante ento, poder definir prottipos de classes que sero usadas para guiar a criao de outras classes. Elas implementam ou apenas definem comportamentos que so genricos o suficiente para serem comuns a vrias outras classes. 9.1 Classes Abstratas Uma maneira de criar este prottipo definindo classes abstratas. Uma classe abstrata uma classe que no pode ser instanciada. Vejamos nossa hierarquia de classes para modelar seres vivos:
SerVivo

Animal

Vegetal

A classe SerVivo pode ser declarada como abstrata pois no possui detalhes o suficiente para representar sozinha um objeto completo. O usurio no poder criar objetos da classe SerVivo pois esta apenas uma classe parcial e existe apenas para ser estendida por subclasses mais especializadas, tal como Animal e Vegetal. public abstract class SerVivo { String Alimentos; int Idade; public void locomover() { ... } public void nascer() { ... } public void crescer() { ... } public void alimentar() { ... } public void respirar() { ... } public SerVivo reproduzir() { ... } public morrer() { ... } } Utilizamos a palavra reservada abstract para definir uma classe abstrata. Se tentarmos instanciar uma classe abstrata receberemos um erro de compilao. Uma classe abstrata pode conter: Mtodos e atributos como em classes convencionais. As classes derivadas de uma classe abstrata herdam da mesma forma os mtodos e atributos. Estes mtodos podem ser sobrescritos nas subclasses mas isto no obrigatrio. Mtodos abstratos, que obrigatoriamente devem ser sobrescritos pelas subclasses.

Mtodos abstratos podem existir apenas em classes abstratas. Como uma classe abstrata est num nvel muito alto de abstrao, muito freqentemente no possui detalhes o suficiente para implementar determinados comportamentos que sero comuns a todas as suas subclasses. Ao invs disso, elas apenas definem quais sero estes comportamentos obrigatrios atravs da criao de mtodos abstratos.
56

Um mtodo abstrato obrigatoriamente deve ser implementado em qualquer uma das subclasses que estendem a superclasse abstrata. A classe SerVivo por exemplo define uma srie de mtodos que ela por si s no capaz de prever qual ser o comportamento para todas as subclasses mas que ao mesmo tempo so comportamentos comuns a todos os seres vivos. Sendo assim, estes mtodos devem ser declarados como abstratos da seguinte forma: public abstract class SerVivo { String Alimentos; int Idade; public abstract void locomover(); public abstract void nascer(); public abstract void crescer(); public abstract void alimentar(); public abstract void respirar(); public abstract SerVivo reproduzir(); public abstract void morrer(); } Para definir um mtodo abstrato devemos prover apenas a assinatura do mtodo, isto , seu nome, argumentos e tipo de retorno. A implementao deste ficar a cargo de cada subclasse concreta, que poder dar a sua verso para ele. A utilizao de classes e mtodos abstratos uma forma muito comum para criarmos e utilizarmos bibliotecas orientadas a objetos: acoplamos nossas classes definindo heranas e implementamos os mtodos abstratos, os quais garantem que estas classes tero garantidamente um prottipo bsico. 9.2 Interfaces Uma interface semelhante a uma classe abstrata exceto pelo fato desta no poder ter qualquer mtodo concreto ou varivel de instncia. Uma interface representa uma coleo de declaraes de mtodos abstratos e possivelmente constantes. Qualquer classe que implementa uma interface deve obrigatoriamente implementar todos os mtodos especificados pela interface. Assim, interfaces fornecem a idia de um contrato que qualquer subclasse deve obedecer. Outra caracterstica importante que uma classe pode derivar de apenas uma nica outra classe (herana simples), mas pode implementar um nmero indeterminado de interfaces. Por exemplo, a classe Animal poderia ser definida da seguinte forma: class Animal extends SerVivo implements Sortable, Listable { ... }
Uma classe pode implementar mais de uma interface. Todos os diferentes tipos de seres vivos executam estas operaes de diferentes maneiras.

Como mostrado anteriormente, Animal herda de SerVivo seus dados e comportamentos e como SerVivo possui mtodos abstratos, estes devem ser implementados em Animal.

57

Alm disso, como fizemos Animal implementar as interfaces Sortable e Listable, este deve implementar tambm todos os mtodos especificados nestas interfaces. Uma interface descreve um aspecto de comportamento que muitas classes diferentes podem requerer. O nome de uma interface freqentemente um adjetivo como Sortable (ordenvel) ou Steerable (algo que pode ser pilotado). A interface Steerable pode incluir mtodos tais como turnRight(), turnLeft(), turnAround(), etc. Qualquer classe que precisar demonstrar o comportamento de poder ser dirigida pode implementar a interface Steerable.

No pilotvel

Pilotvel

importante notar que classes que implementam a mesma interface podem no ter absolutamente nada a ver umas com as outras (o que no ocorre quando classes implementam herana em relao mesma superclasse), a no ser o fato de apresentarem comportamentos semelhantes, porm, que podem estar implementados de formas completamente diferentes. Por exemplo, os principais pacotes Java incluem inmeras interfaces padro, tais como runnable, clonable, dentre outras. Estas interfaces so implementadas por todos os tipos de classes que no tm nada em comum, exceto o fato de precisarem ser clonveis ou executveis. Para definir uma interface devemos usar a palavra reservada interface. Todos os mtodos especificados so implicitamente pblicos e abstratos e qualquer varivel implicitamente public static final, ou seja, so constantes. A interface Steerable por exemplo, poderia ser definida da seguinte maneira public interface Steerable{ int MAXTURN = 45; void turnLeft (int deg); void turnRight (int deg); } o que equivale a seguinte definio se no suprimirmos o public, static, final e abstract public interface Steerable{ public static final int MAXTURN = 45; public abstract void turnLeft (int deg); public abstract void turnRight (int deg); }

58

Uma interface pode ser definida de qualquer uma das maneiras mas mais comum encontrarmos da primeira forma. Para implementarmos uma interface usamos a palavra reservada implements. Como exemplo, vamos considerar a classe Iate abaixo: public class Iate extends Barco implements Steerable { public void turnLeft (int deg){ ... } public void turnRight (int deg) { ... } } Neste exemplo, uma classe Iate que deriva da classe Barco tem a caracterstica de precisar ser pilotada e, sendo assim, implementa a interface Steerable. A classe Iate deve portanto, implementar todos os mtodos da interface, neste caso turnLeft(int deg) e turnRight(int deg).

Um exemplo real - Ordenao


A ordenao um exemplo clssico do uso de uma interface. Ordenar uma lista de objetos um processo bem definido que no precisa ser escrito repetidas vezes e muitas classes diferentes podem requerer serem ordenveis. Assim, uma rotina de ordenao precisa possuir a habilidade de ordenar qualquer objeto seguindo as caractersticas particulares de cada um. A abordagem tradicional de programao poderia propor a rescrever a rotina de ordenao para cada tipo diferente de objeto que precisasse ser ordenado. Usando a programao orientada a objetos de forma adequada pode-se eliminar esta necessidade e toda dificuldade de manuteno que ela acarreta. Vamos supor que queiramos que seja possvel ordenar um conjunto de objetos da classe Animal por ordem de idade. O que devemos fazer, correr atrs de um algoritmo de ordenao e implementar um mtodo que seja capaz de ordenar um vetor de animais? Graas a orientao a objetos e ao Java a resposta no! Java possui a classe java.util.Arrays que possui um mtodo esttico sort(Object[]) que realiza a ordenao de um array qualquer. Bem, mas como este mtodo consegue a faanha de ordenar um array de objetos arbitrrios? Se ele no conhece o objeto, como vai saber como comparar um objeto do vetor com outro de forma a determinar a ordem relativa entre eles? a que entra a necessidade de uma interface. A interface Comparable especifica mtodos requeridos para fazer a ordenao funcionar em cada tipo de objeto que precisa ser ordenado. Cada classe implementa a interface baseada em suas necessidades especficas de ordenao e apenas ela precisa saber como seus objetos devem ser comparados. Implementar a ordenao de maneira OO prov um modelo muito bem adequado para reutilizao de cdigo. O cdigo da ordenao completamente isolado dos objetos que usam a ordenao. Voltando ao exemplo, as classes e interfaces a serem utilizadas para ordenar um conjunto de Animais so:

59

Criadas pelos especialistas em ordenao


public interface Comparable public class Arrays

Criadas pelos especialistas em modelar seres vivos


public class Animal implements Comparable public class MyApplication

A interface Comparable declara um nico mtodo: compareTo(Object). Este mtodo deve ser implementado por qualquer classe que precisa utilizar os mtodos da classe Arrays. A classe Arrays contm o mtodo esttico sort(Object[]) para ordenar um array de objetos. A maioria dos algoritmos de ordenao funcionam atravs da comparao de pares de objetos. O mtodo sort(Object[]) faz esta comparao chamando o mtodo compareTo(Object) do objeto no array. A classe Animal implementa a interface Comparable. Ela contm um mtodo compareTo(Object) que compara o animal corrente com o animal passado como argumento do mtodo. MyApplication simboliza qualquer aplicao que precisa ordenar uma lista de animais.

Esquema de Execuo
MyApplication
4 sort(Object[] o) retorna a lista ordenada 1 MyApplication passa um array de animais para Arrays.sort(Object[] o)

Sort
3 O animal retorna o resultado da comparao 2 sort(Object[] o) pede ao animal para este comparar a si mesmo com outro animal

Animal

Interface Sortable
public interface Comparable { //compareTo(Object): Compara este objeto //com o outro passado como argumento // Retorno: // 0 se este objeto for igual a obj2 // um valor < 0 se este objeto for < obj2 // um valor > 0 se este objeto for > obj2 int compareTo (Object obj2); }

60

A classe Arrays
public class Arrays{ public static void sort (Object[] items){ for (int i = 1; i < items.length; i++){ for (int j = 0; j < items.length 1; j++){ if (items[j].compareTo(items[j+1]) > 0){ Comparable tempitem = items[j+1]; items[j+1] = items[j]; items[j] = tempitem; } } } }}

Uma interface tambm define um tipo.

Quando o mtodo sort precisa comparar dois itens do array ele chama o mtodo compareTo de um dos itens e passa o outro como argumento.

Note que o mtodo sort no sabe nada sobre o tipo de objeto que ele est ordenando. Ele sabe apenas que estes so objetos que implementam a interface Comparable e, sendo assim, ele pode contar com a existncia do mtodo compareTo nestes objetos. Podemos considerar uma interface como um contrato entre o objeto que usa a interface e o objeto que a implementa: A classe Animal (a implementadora) concorda em implementar um mtodo chamado compareTo(Object), com parmetros e valor de retorno que seguem o especificado pela interface. A classe Arrays (usurio) concorda em ordenar uma lista de objetos na ordem correta fazendo valer-se do mtodo compareTo.

A classe Animal
public class Animal extends SerVivo implements Comparable{ public int compareTo(Object animal2){ int idade1 = this.idade; int idade2 = ((Animal)animal2).idade; if (idade1<idade2) return (-1); if (idade1>idade2) return (1); if (idade1=idade2) return (0); } O mtodo compareTo(Object) pode comparar os dois objetos de qualquer maneira que quisermos, contanto que ele retorne um inteiro para indicar a ordem relativa entre eles. Por fim, a classe MyApplication para ordenar um array de Animais, pode simplesmente chamar Arrays.sort(Object[] ) passando o array de objetos a ser ordenado.
Foi necessrio fazer um cast pois o tipo do argumento Object.

61

10 Usando Strings e Arrays


Ao trmino deste captulo voc estar apto a: Criar strings em Java Realizando Operaes em Strings Converter primitivos para Strings e vice-versa Manipular strings usando a classe StringBuffer Criar arrays de elementos

10.1 Strings Como em muitas linguagens de programao, strings so usadas extensivamente em programas Java o que fez com que a API do Java disponibiliza-se a classe String para ajudar na manipulao deste tipo de dado. Ela faz parte do pacote java.lang, o qual automaticamente importado em todas as classes java. A classe String representa uma string imutvel. Isto significa que, uma vez criado criado um objeto desta classe, voc no poder alter-lo. Se voc quer modificar o contedo de uma String, voc deve pode usar a classe StringBuffer, a qual foi desenvolvida para este propsito. Existem vrias maneiras de se criar uma String: Atribuindo uma constante string a uma varivel
String categoria = Ao;

Concatenando outras strings


String nome = primeiroNome + + ultimoNome;

Usando o construtor
String nome = new String(Joe Smith);

Java utiliza o operador + para concatenao de strings. O mtodo concat() na classe String uma outra forma de fazer isso. O cdigo seguinte produz strings equivalentes: String nome = San Wong; String nome = Sam + Wong; String nome = Sam .concat(Wong); possvel tambm concatenar qualquer tipo primitivo com uma string, pois este implicitamente convertido para uma. int idade = 25; System.out.println(Idade = + idade);

62

10.1.1 Operaes em strings A classe String disponibiliza inmeros mtodos para realizarmos operaes sobre ela. Todas as operaes no modificam a string original. Alguns delas so: Retornando o tamanho da string: int length()
String categoria = Comedia ; int len = categoria.length();

len = 7

Encontrando um caracter numa posio especfica: char charAt(int index)


String categoria = Comedia ; char c = categoria.charAt(1);

c = o

O ndice comea em 0 (zero). Retornando uma substring: String substring (int beginIndex, int endIndex)
String categoria = Comedia ; String sub = categoria.substring(2,4)

sub = me

Este mtodo retorna a substring que inicia em beginIndex e que termina em endIndex-1. Convertendo para upper e lowercase
String toUpperCase() String toLowerCase()

Eliminando espaos em branco: String trim()


String comEspaco = XXX ; String semEspaco = comEspaco.trim();

semEspaco = XXX

Retira os espaos das extremidades. Encontrando o ndice de uma substring


String str = XXXYXXY; int i = str.indexOf (Y); String str = XXXYXXY; int i = str.lastIndexOf(Y);

i=3

i=6

String indexOf (String) retorna o ndice de uma string especificada. String lastIndexOf (String) retorna a ltima ocorrncia da string especificada.

63

Comparando Strings : boolean equals() e boolean equalsIgnoreCase()


String passwd = connection.getPassword(); if (passwd.equals(fgHPUw)) .... Neste caso fazer a comparao levando em conta o case importante. Neste caso fazer a comparao levando em conta o case no importante.

String categoria = Comedia; if (categoria.equalsIgnoreCase(Drama))

Os mtodos retornam true se a string especificada contm exatamente o mesmo texto. 10.1.2 Convertendo primitivos para Strings e vice-versa A classe String possui um mtodo esttico chamado valueOf() que retorna uma representao em string de um tipo primitivo. Existe uma verso do mtodo para cada tipo primitivo.
String sete = String.valueOf(7); String umPontoZero = String.valueOf(1.0f);

O mtodo System.out.println() tambm possui uma verso par cada tipo primitivo. Desta forma, possvel fazer int count = 10; System.out.println(count); sem a necessidade de antes concatenar count com uma string (o que faria com que ele fosse automaticamente convertido para uma string). possvel tambm converter uma string para um tipo primitivo atravs das classes de wrapper3. Para cada tipo primitivo Java prov uma classe de wrapper correspondente, a qual permite que um tipo primitivo seja tratado como um objeto. Cada classe de wrapper disponibiliza um mtodo esttico para converter uma String para o tipo primitivo correspondente. Exemplo :
int valor = Integer.parseInt(10); float valor = Float.parseFloat(10.00);

10.1.3 A classe StringBuffer A classe StringBuffer representa strings que podem ser modificadas em tempo de execuo. Assim, se voc pretende fazer modificaes numa string (acrescentar caracteres, remover caracteres, etc), voc deve usar esta classe. Por exemplo, quando fazemos String texto = Tinha uma pedra; texto = texto + no meio do caminho; texto = texto + , no meio do caminho tinha uma pedra.
3

Cada vez que uma atribuio feita, uma nova varivel criada na memria com o novo texto e a varivel anterior descartada.

A traduo de wrapper invlucro, envoltrio. 64

Esta abordagem para modificar o texto de uma String no a mais eficiente, tendo em vista que novas variveis so criadas em cada atribuio. O ideal utilizar a classe StringBuffer e seu mtodo append: StringBuffer texto = new StringBuffer(Tinha uma pedra); texto.append( no meio do caminho); texto.append(, no meio do caminho tinha uma pedra.); 10.2 Arrays Um array til quando queremos agrupar objetos do mesmo tipo. Possui as seguintes caractersticas: Todos os elementos devem ser do mesmo tipo Cada elemento pode armazenar um nico item Os itens podem ser primitivos ou referncias a objetos O tamanho do array fixado quando de sua criao

10.2.1 Arrays de Primitivos Para criar um array de primitivos fazemos: 1 Declaramos o array:
type[] arrayName; or type arrayName[];

Exemplo: int[] powers;


powers aponta para null at que seja inicializado com o perador new.

2 Criamos efetivamente o array:

int[] powers; powers = new int[4];

Cada elemento inicializado com o valor 0.

Um array deve ser criado com o uso do operador new e seu tamanho deve ser fixado dentro dos colchetes. O tamanho deve ser um inteiro mas no precisa ser uma constante, pode ser tambm uma expresso que retorna um inteiro. Quando um array de primitivos criado, seus elementos so inicializados automaticamente com valores padro da seguinte forma: char : \u0000 (Valor Unicode para 0000) byte, short, int e long : 0 boolean : false float e double: 0.0

3 Inicializando os elementos do array. Duas formas: Atribuindo valores para cada elemento do array:
arrayName[index] = value;

Exemplo: powers[0] = 1;
O ndice de um array inicia em 0. 65

Usando inicializadores:

type[] arrayName = {value list};

Exemplo: int [] primes = {2,3,5,7};


No h a necessidade de usar o operador new nem de definir o tamanho do .

10.2.2 Arrays de Referncias Os passos para criar um array de referncias de objetos so os mesmos do array de primitivos, com uma exceo: no existe uma inicializao default para os elementos. 1 Declarao:
categorias aponta para null.

String[] categorias; 2 Criao: categorias = new String[3]; 3 Inicializao. Duas formas: Atribuindo valores para cada elemento
String[] arr = new String[4]; for (int i = 0; i < arr.length; i++ ){ arr[i] = new String(); } Todo array tem o atributo length que contm o nmero de elementos do array. Os elementos no recebem uma inicializao default. Cada item aponta inicialmente para null.

Atravs de inicializadores
String[] categoias = { Ao, Comdia, Drama };

10.2.3 Arrays como objetos Quando criamos um array tanto de primitivos como de referncias usamos o operador new, o qual nos retorna o endereo da primeira posio do array. Quando passamos um array como argumento para um mtodo este passado por referncia, sendo assim, se o mtodo alterar o contedo do array, estas mudanas dar-se-o no array original e no numa cpia.

66

10.2.4 Arrays e Excees Um dos motivos de dizermos que Java uma linguagem robusta e segura devido a forma de como ela trata de acessos ilegais em arrays. Iremos estudar excees com mais detalhes no prximo captulo, porm vamos aproveitar para dar uma olhada em duas excees relacionadas a arrays. A primeira trata-se da ArrayIndexOutOfBoundsException, que ocorre quando tenta-se acessar uma posio invlida do array:
String[] list = new String[4]; System.out.println(list[5]); Erro! Posio 5 invlida!

A segunda, NullPointerException, ocorre quando tenta-se acessar um elemento que ainda no foi inicializado
Filme[] listaFilmes = new Filme[3]; String diretor = listaFilmes[0].getDirector();

Erro! Tentando acessar um mtodo da classe Filme sendo que o vetor ainda no foi inicializado com objetos deste tipo!

10.2.5 Arrays multidimencionais Java suporta arrays multidimencionais, isto , arrays de arrays.
type[ ][ ] arrayName = new type[n1][n2]; aux[0][0] aux [0][1] aux[0] aux[1] aux[2] aux[3] 1 0 0 0 7 0 0 0

Exemplo : int [] [] aux = new int [4][2]; aux [0][0] = 1; aux [0][1] = 7;

Representao em Memria de um Array

67

Exerccios: Abra a lio 10 e selecione o projeto ACMEVideo. Vamos realizar vrias modificaes na classe a fim de por em prtica o que aprendemos nesta lio. 1) Faa as seguintes modificaes na classe ACMEVideo. a) Defina um atributo array private static de objetos Cliente chamado clientes com capacidade para armazenar seis objetos Cliente. Para economizar tempo, o cdigo para criar um array de itens j foi adicionado para voc. b) Adicione uma varivel de instncia booleana, privada e esttica chamada clientesConstruidos que serve para controlar se o array de clientes j foi inicializado. Inicialize esta varivel com false. c) Crie um mtodo publico e esttico chamado constroiClientes(). Este mtodo contem o cdigo necessrio para inicializar as seis posies do array de clientes (lembre-se que o construtor de cliente espera receber um nome, endereo e telefone. Haja imaginao!!). Uma inicializao deve parecer-se com isso: clientes[0] = new Cliente(XXXX, YYYY, ZZZZ); d) Sete a varivel clientesConstruidos para true no interior deste mtodo. e) Adicione agora um mtodo pblico e esttico que recebe o ID de um cliente como argumento, busca no array clientes por um cliente que tenha este ID e, caso encontre-o, retorna o objeto correspondente. O mtodo pode usar um lao for para fazer a busca no array (voc pode usar a propriedade array.length para saber o final do array) e deve se chamar buscaClientePorId(). Se um cliente no for encontrado o mtodo deve retornar null. Adicione uma condio no mtodo para verificar, antes de iniciar a busca, se existem clientes cadastrados (atravs da varivel clientesConstruidos). Caso ainda no, faa o mtodo inicializar o array chamando o mtodo constroiClientes. O cdigo ir se assemelhar a isto: if (!clientesConstruidos) { constroiClientes(); } //o lao do for deve entrar aqui Nessa altura do campeonato, j temos em nosso projeto de locadora quatro classes : a classe Cliente que manipula os clientes da loja, a classe Item que manipula informaes gerais sobre os itens que podem ser alugados, a classe Filme e a classe Jogo que so tipos especficos de itens alugveis. Para concluir o diagrama apresentado no captulo 6, faltam as classes ItemAlugado e Aluguel. 2) Vamos definir agora a classe ItemAlugado, a qual controla as informaes de um item quando este alugado para um cliente. a) Crie a classe ItemAlugado e inclua as seguintes variveis privadas (no esquea dos mtodos getXXs e setXXs ): Item item String dataDevoluo String dataDevolvida Faa um import no pacote java.util.*

68

b) Adicione um mtodo getPreco(). Como preo no um atributo de ItemAlugado, voc deve chamar o mtodo getPrice do Item. Este aoenas um mtodo de convenincia para sabermos a partir de ItemAlugado qual o preo de aluguel do item. O cdigo deve assemelhar-se a isso: public double getPreco(){ return item.getPreco(); }

c) Crie um construtor para classe que aceite o ID de um Item (int) como parmetro. O construtor deve usar este valor para chamar o mtodo ACMEVideo.buscaItemPorId() (que j foi construdo para voc como um mtodo da classe ACMEVideo), o qual retorna um objeto do tipo Item, e inicializar seu atributo item. O construtor tambm deve inicializar a varivel dataDevolucao com o valor retornado pelo mtodo calcDataDevolucao(); 3) Neste momento voc est pronto para criar a ltima classe necessria para concluir a aplicao. A classe Aluguel representa uma locao efetivada. Deve controlar por exemplo qual cliente realizou a locao, os itens locados e a data que o emprstimo foi feito. a) Crie uma nova classe Aluguel e inclua um import no pacote java.util.*. b) Adicione as seguintes variveis privadas: ItemAlugado[] itens; Cliente cliente; int numeroAluguel; Date dataAluguel; int itemCount; c) Adicione as seguintes variveis privadas e estticas: static int proximoId = 500; final static int MAXITENS = 10; d) Crie um construtor que inicialize as trs variveis. Ele deve gerar o prximo nmero de aluguel baseado na varivel esttica proximoId (lembra como fizemos no capitulo 7 quando estudamos variveis estticas). Deve receber o Id de um cliente como parmetro e utilizar o mtodo ACMEVideo.buscaClientePorId() para inicializar a varivel cliente. Por fim, deve criar o array itens com o mximo de MAXITENS posies. Voc mesmo pode fazer este cdigo ou usar o abaixo: public Aluguel (int clienteId) { numeroAluguel = ++proximoId; cliente = ACMEVideo1.buscaClientePorId(clienteId); itens = new ItemAlgugado[MAXITENS]; } e) Crie um mtodo chamado addItem() para adicionar um item alugado num aluguel. Use o cdigo abaixo como guia.

69

public void addItem (int itemId) { ItemAlugado item = new ItemAlugado(itemId); // Adicione este item no array. Use a varivel itemCount para saber qual a //posio ... //Incremente itemCount } f) Por fim, voc deve criar o mtodo imprimeRelatorio() que imprime um relatrio relacionado a um aluguel. O relatrio deve ter o seguinte layout: Nome do Cliente: Telefone do Cliente: Data do Aluguel: Itens Alugados: Item 1 : <Titulo> <Data Devolucao> <Valor> ... Item n : <Titulo> <Data Devolucao> <Valor> Custo Total: 4) Teste a aplicao. No mtodo main do projeto ACMEVideo simule um aluguel da seguinte forma: //crie um novo aluguel para o cliente 3 Aluguel aluguel = new Aluguel(3); //adicione alguns itens locados aluguel.addItem(1001); aluguel.addItem(1002); aluguel.addItem(1005); //Imprima o relaorio aluguel.imprimeRelatorio(); Voc pode testar tambm para outras entradas. Clientes vlidos variam de 1-6 e Itens vlidos de 1001-1011.

70

11 Tratamento de Excees
Uma exceo um evento que ocorre durante a execuo de um programa e que desfaz o fluxo normal de instrues. Por exemplo, tentar acessar um elemento fora dos limites de um array, tentar dividir um nmero por zero, so exemplos de excees. Um erro em Java uma condio anormal irrecupervel. Por exemplo, uma condio de erro ocorre se existe algum erro interno na JVM ou se a JVM fica sem memria. A diferena entre um erro e uma exceo que uma exceo pode ser capturada e o programa pode seguir em frente a partir dali, j quando um erro ocorre o programa necessariamente ir terminar. Quando uma exceo ocorre no interior de um mtodo Java, o mtodo cria um objeto do tipo Exception e o retorna para o sistema. Este processo chamado de disparar uma exceo. O objeto Exception contm informaes sobre a exceo, incluindo seu tipo e o estado do programa quando a exceo ocorreu. Quando uma exceo disparada, o sistema busca em seqncia na pilha todos os mtodos para tentar encontrar um capaz de tratar este tipo de exceo. Na terminologia Java o mtodo captura a exceo. Se o sistema no encontra nenhum mtodo apto a capturar a exceo, o programa inteiro termina. 11.1 Classes de Excees Todos os erros e excees em Java derivam da classe Throwlable, resultando na hierarquia abaixo:
Throwable

Error

Exception

Erros irrecuperveis

Excees verificveis

RuntimeException Excees no verificveis (em tempo de excuo)

Erros: Erros so extenses da classe Error. Se um erro gerado, ele normalmente indica um problema que ser fatal para o programa. Excees no verificveis: Este tipo de exceo deriva da classe RuntimeException. Podemos escolher o que fazer com uma exceo que ocorre em tempo de execuo (como dividir um nmero por zero ou acessar um elemento invlido de um array); podemos tentar captur-la e trat-la ou ento a ignorarmos. Se optarmos pela segunda opo, a JVM ir terminar o programa e imprimir o nome da exceo e a pilha de mensagens. Exceo verificveis: Excees deste tipo so extenses da classe Exception. Elas devem obrigatoriamente ser capturadas em algum lugar da aplicao, sob pena de ocorrer erro de compilao caso isso no seja feito.

71

11.2 Tratando de Excees Quando chamamos um mtodo que pode retornar uma exceo (tanto verificvel quanto no), temos trs alternativas: 1. Capturar a exceo e trat-la 2. Deixar a exceo passar pelo mtodo; em algum outro lugar ela deve ser capturada. 3. Capturar a exceo e disparar uma exceo diferente. A nova exceo deve ser capturada em algum lugar. 11.2.1 Capturando Excees Se um bloco de cdigo chama um ou mais mtodos que podem disparar excees, coloque o cdigo dentro de um bloco try, com um ou mais blocos catch imediatamente posterior a este. Cada bloco catch trata de uma exceo particular. Pode-se opcionalmente incluir um bloco finally aps todos os blocos catch, o qual sempre executado mesmo que nenhuma exceo ocorra.
try { //cdigo que pode causar uma exceo } catch (exception1) { //tratamento da exceo 1 } catch (exception2) { //tratamento da exceo 2 } ... finally { //qualquer processamento final }

Para saber se um mtodo de alguma API JavaDoc. Exemplo 1 Capturando uma nica exceo:

Java dispara uma exceo, consulte o

int num; String s = getNumFromForm(); try{ //Pode disparar NumberFormatException num = Integer.parseInt(s); } catch (NumberFormatException e) { //trata a exceo }

72

Exemplo 2 Capturando Mltiplas Excees: try { //pode disparar MalformedURLException URL u = new URL(str); //pode disparar IOException URLConnection c = u.openConnection(); } catch (MalformedURLException e) { System.out.println(Impossvel abrir URL: + e); } catch (IOException e) { System.out.println(No foi possvel conectar: + e); } Um bloco catch ir capturar a exceo especificada bem como qualquer uma de suas subclasses. Por exemplo, a classe MalformedURLException estende IOException, sendo assim, poderamos substituir os dois blocos catch acima por catch (IOException e) { System.err.println(Operao falhou: + e); } Isso til quando iremos dar o mesmo tratamento para qualquer uma das excees de uma mesma hierarquia. Caso queiramos realmente tratar de forma diferente excees de uma mesma hierarquia, devemos nos atentar para a ordem em que estas sero especificadas no blocos catch. Ocorrer um erro de compilao caso especifiquemos primeiro a superclasse e depois a subclasse da exceo. try { //pode disparar MalformedURLException URL u = new URL(str); //pode disparar IOException URLConnection c = u.openConnection(); } catch (IOException e) { System.out.println(No foi possvel conectar: + e); } catch (MalformedURLException e) { System.out.println(Impossvel abrir URL: + e); }
Definir o bloco catch da superclasse primeiro que o da subclasse gerar erro de compilao!

Por fim, vamos ver um exemplo de como pode ser usado o bloco finally. Este bloco til quando queremos liberar recursos alocados num bloco try assim que este terminar.

73

FileInputStream f = null; try{ f = new FileInputStream(filePath); while (f.read() != -1) charcount++; } catch(IOException e) { System.out.println(Erro ao acessar arquivo + e); } finally { //Este bloco sempre executado f.close(); } O exemplo acima conta quantos caracteres h num arquivo. O arquivo depois fechado mesmo que a operao de leitura tenha resultado uma exceo. Um bloco finally executado independente de como o bloco try terminou: Terminou normalmente, isto , chegou at o colchete final Terminou devido a um return ou break Terminou com o disparo de uma exceo

11.2.2 Deixando uma exceo passar atravs do mtodo Quando uma exceo ocorre mas no temos condio de trat-la naquele local, podemos pass-la adiante para que num mtodo mais acima ela possa ser tratada adequadamente. Para liberarmos um mtodo de tratar uma determinada exceo devemos usar o comando throws na declarao do mesmo. public int myMethod() throws exception1 { //cdigo que pode gerar a exception1 } Exemplo: public URL changeURL(URL oldURL) throws MalformedURLException { return new URL(http://www.xxx.com); } O mtodo que chamou changeURL pode optar por tratar a exceo ou tambm pass-la adiante. Porm, se em nenhum momento algum mtodo trat-la, o programa terminar em erro.
Esta linha pode gerar uma exceo de MalformedURLException. Porm, o mtodo changeURL resolveu no trat-la e pass-la adiante.

74

11.2.3 Capturando uma exceo e disparando outra diferente Uma outra alternativa para tratar uma exceo captur-la e disparar uma exceo diferente, possivelmente uma criada por ns mesmos. catch (exception1 e) { throw new exception2(...); } public String getValue(int index) throws IndexOutOfBoundsException{ if (index == null || index >= values.length) { throw new IndexOutOfBoundsException(); } ... }
O mtodo deve indicar que no vai tratar da exceo que ele mesmo est disparando. Usamos new para criar uma nova exceo.

A exceo pode ser uma padro do sistema.

void ReadUserFile throws UserFileException { try { //cdigo para abrir e ler o arquivo } catch (IOException e) { throw new UserFileException(e.toString()); } }

A exceo disparada pode ser uma criada pelo usurio.

75

Exerccios: Na prtica do Captulo 10 supomos que os mtodos buscaClientePorId e buscaItemPorId sempre recebem IDs vlidos para fazer a busca no array de Clientes e Itens respectivamente. Porm, possvel que estes mtodos recebam IDs invlidos, isto , IDs que no estejam cadastrados nos arrays correspondentes. Iremos fazer a ltima melhoria em nossa aplicao ACME Vdeo para tratar estes possveis erros. Abra o projeto relacionado lio 11. 1) Defina no arquivo que contm a classe ACMEVideo duas novas excees, uma para emitir uma mensagem de erro caso um Cliente seja invlido e outra quando um Item for invlido. As classes derivam de Exception e devem se chamar ClienteNaoEncontrado e ItemNaoEncontrado: class ClienteNaoEncontrado extends Exception { public ClienteNaoEncontrado (String message) { super(message); } } 2) Modifique o mtodo buscaClientePorId() para que este emite a exceo apropriada se o Id for invlido: a) Adicione o throws ClienteNaoEncontrado a especificao do mtodo b) Logo antes do return, verifique se o que ir ser retornado um objeto Cliente ou se null. Se for null, dispare uma exceo de ClienteNaoEncontrado. O cdigo ser algo como: if (cliente = = null) { throw new ClienteNaoEncontrado (\n\t O ID informado no vlido! + \n\t Verifique se voc entrou com o ID correto.); } 3) Edite agora o construtor da classe Aluguel, que quem faz uso do mtodo buscaClientePorId, a fim de capturar a nova exceo. Se o construtor receber uma exceo de ClienteNaoEncontrado, o processo de locao no deve continuar. a) Adicione um bloco try em torno da chamada do mtodo buscaClientePorId(). Adicione um bloco catch para tratar da nova exceo: catch (ClienteNaoEncontrado e) { System.out.println(e); System.exit(0); } b) Modifique o exemplo no mtodo main que simula uma locao passando um Id de cliente invlido, tal como 999. c) Salve, compile e execute sua aplicao

76

4) Altere o mtodo buscaItemPorId() para disparar a exceo apropriada se o id recebido for invlido. a) Acrescente o throw definio de buscaItemPorId() relacionado exceo ItemNaoEncontrado. b) Antes de retornar o item verifique se este nulo e, caso afirmativo, crie a nova exceo ItemNaoEncontrado tal como foi feito com o cliente. 5) Edite agora o construtor da classe ItemAlugado, que quem faz uso do mtodo buscaItemPorId, a fim de capturar a nova exceo. Se o construtor receber uma exceo de ItemNaoEncontrado, o processo de locao no deve continuar. b) Adicione um bloco try em torno da chamada do mtodo buscaItemPorId(). Adicione um bloco catch para tratar da nova exceo: catch (ItemNaoEncontrado e) { System.out.println(e); System.exit(0); } d) Modifique o exemplo no mtodo main que simula uma locao passando um Id de item invlido, tal como 999, ao mtodo addItem.. e) Salve, compile e execute sua aplicao

77

Você também pode gostar