Você está na página 1de 17

Programao

JAVA

C a pit u lo 8

Fortaleza, Abril de 2010.

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

Captulo 8. Trabalhando com Bibliotecas de Classe em java


8.1. Objetivos
Nesta aula, abordaremos alguns conceitos bsicos da Programao Orientada a Objetos ou POO. Mais adiante, discutiremos o conceito de classes e objetos e como usar as classes e seus membros. Comparao, converso e casting de objetos, tambm sero vistos algumas classes j definidas do Java pacote Java.util. Por enquanto,o foco ser o uso das classes j definidas nas bibliotecas Java e, posteriormente, discutiremos como criar nossas prprias classes. Ao final desta aula, o estudante ser capaz de: Explicar o que Programao Orientada a Objetos e alguns dos seus conceitos. Diferenciar entre classes e objetos. Diferenciar atributos e mtodos de objeto de atributos e mtodos de classe. Explicar o que so mtodos, como invoc-los e como enviar argumentos. Identificar o escopo de um atributo. Realizar converses entre tipos de dados primitivos e entre objetos. Comparar objetos e determinar suas classes.

8.2. Uma viso de P.O.O.


Programao Orientada a Objetos (POO) refere-se ao conceito de objetos como elemento bsico das classes. O mundo fsico (real) constitudo por objetos tais como carro, leo, pessoa, dentre outros. Estes objetos so caracterizados pelas suas propriedades (ou atributos) e seus comportamentos. Por exemplo, um objeto "carro" tem as propriedades, tipo de cmbio, fabricante e cor. O seu comportamento pode ser 'virar', 'frear' e 'acelerar'. Igualmente, podemos definir diferentes propriedades e comportamentos para um leo, um avio ou qualquer outro objeto do mundo real. Veja um exemplos.
Objeto carro Propriedades tipo de cmbio fabricante cor peso cor apetite (faminto ou saciado) temperamento (dcil ou selvagem) Comportamento Virar frear acelerar Rugir dormir caar

leo

Com tais descries,os objetos do mundo fsico podem ser facilmente modelados como objetos de software usando as propriedades como atributos e os comportamentos como mtodos. Estes atributos e mtodos podem ser usados em softwares de jogos ou interativos para simular objetos do mundo real! Por exemplo, poderia ser um objeto de 'carro' numa competio de corrida ou um objeto de 'leo' num aplicativo educacional de zoologia para crianas.

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

8.3. Classes e Objetos 8.3.1. Diferenas entre Classes e Objetos


No mundo do computador,um objeto um componente de software cuja estrutura similar a um objeto no mundo real. Cada objeto composto por um conjunto de atributos (propriedades) que so as variveis que descrevem as caractersticas essenciais do objeto e,consiste tambm, num conjunto de mtodos (comportamentos) que descrevem como o objeto se comporta. Assim, um objeto uma coleo de atributos e mtodos relacionados. Os atributos e mtodos de um objeto Java so formalmente conhecidos como atributos e mtodos de objeto,para distinguir dos atributos e mtodos de classes,que sero discutidos mais adiante. Vejamos o exemplo de um objeto na figura abaixo.

A classe a estrutura fundamental na Programao Orientada a Objetos. Ela pode ser pensada como um gabarito, um prottipo ou, ainda, uma planta para a construo de um objeto. Ela consiste em dois tipos de elementos que so chamados atributos (ou propriedades) e mtodos. Atributos especificam os tipos de dados definidos pela classe, enquanto que os mtodos especificam as operaes.

Exemplo de uma classe em Java.

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

8.3.2. Construtor
um tipo especial de mtodo que utilizado para a construo ou criao de um novo objeto. Lembre-se que construtores no so elementos (atributos, mtodos e classes internas de um objeto). Exemplo de construtor.

Um objeto uma instncia de uma classe. Para diferenciar entre classes e objetos, vamos examinar um exemplo. O que temos aqui uma classe Carro que pode ser usada pra definir diversos objetos do tipo carro. Na tabela mostrada abaixo, Carro A e Carro B so objetos da classe Carro. A classe tem os campos nmero da placa, cor, fabricante e velocidade que so preenchidos com os valores correspondentes do carro A e B. O carro tambm tem alguns mtodos: acelerar, virar e frear.

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

Quando construdos, cada objeto adquire um conjunto novo de estado. Entretanto, as implementaes dos mtodos so compartilhadas entre todos os objetos da mesma classe. As classes fornecem o benefcio do Reutilizao de Classes (ou seja, utilizar a mesma classe em vrios projetos). Os programadores de software podem reutilizar as classes vrias vezes para criar os objetos.

8.3.3. Encapsulamento
Encapsulamento um princpio que prope ocultar determinados elementos de uma classe das demais classes. Ao colocar uma proteo ao redor dos atributos e criar mtodos para prover o acesso a estes, desta forma estaremos prevenindo contra os efeitos colaterais indesejados que podem afet-los ao ter essas propriedades modificadas de forma inesperada. Podemos prevenir o acesso aos dados dos nossos objetos declarando que temos controle desse acesso. Aprenderemos mais sobre como Java implementa o encapsulamento quando discutirmos mais detalhadamente sobre as classes. Exemplo:

8.3.4. Atributos e Mtodos de Classe


Alm dos atributos de objeto, tambm possvel definir atributos de classe, que so atributos que pertencem classe como um todo. Isso significa que possuem o mesmo valor para todos os objetos daquela classe. Tambm so chamados de atributos estticos. Para melhor descrever os atributos de classe, vamos voltar ao exemplo da classe Carro. Suponha que a classe Carro tenha um atributo de classe chamado Contador. Ao mudarmos o valor de Contador para 2, todos os objetos da classe Carro tero o valor 2 para seus atributos Contador.

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

6 Objeto Carro A ABC 111 Azul Mitsubishi 50 km/h

Classe Carro Atributos de Objeto Nmero da placa Cor Fabricante Velocidade Atributos de Classe Contador = 2 Mtodos de Objeto Mtodo Acelerar Mtodo Virar Mtodo Frear

Atributos e mtodos da classe Carro

8.3.5. Instncia de Classe


Para criar um objeto ou uma instncia da classe, utilizamos o operador new. Por exemplo, para criar uma instncia da classe String, escrevemos o seguinte cdigo:

O operador new aloca espao na memria para o objeto e retorna uma referncia para essa alocao. Ao criar um objeto,invoca-se,na realidade,o construtor da classe.

O construtor um mtodo onde todas as inicializaes do objeto so declaradas e possui o mesmo nome da classe.
funcionario fprg = new programador(); funcionario fcrd = new coordenador();

8.4. Mtodos 8.4.1. O que so mtodos e porque usar mtodos?


Nos exemplos apresentados anteriormente, temos apenas um mtodo, o mtodo main(). Em Java, ns podemos definir vrios mtodos e podemos cham-los a partir de outros mtodos. Um mtodo um trecho de cdigo distinto que pode ser chamado por qualquer outro mtodo para realizar alguma funo especfica.

Mtodos possuem as seguintes caractersticas:

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

Podem ou no retornar um valor; Podem aceitar ou no argumentos; Aps o mtodo encerrar sua execuo, o fluxo de controle retornado a quem o chamou o que necessrio para se criar mtodos? Porque no colocamos todas as instrues dentro de um grande mtodo? O foco destas questes chamado de decomposio. Conhecido o problema, ns o separamos em partes menores, que torna menos crtico o trabalho de escrever grandes classes.

8.4.2. Chamando Mtodos de Objeto e Enviando Argumentos


Para ilustrar como chamar os mtodos, utilizaremos como exemplo a classe String. Podese usar a documentao da API Java para conhecer todos os atributos e mtodos disponveis na classe String. Posteriormente, iremos criar nossos prprios mtodos. Para chamar um mtodo a partir de um objeto, escrevemos o seguinte:
nomeDoObjeto.nomeDoMtodo([argumentos]);

Usando os mtodos:

8.4.3. Passagens de argumentos para mtodos.


Em exemplos anteriores, enviamos atributos para os mtodos. Entretanto, no fizemos nenhuma distino entre os diferentes tipos de atributos que podem ser enviados como argumento para os mtodos. H duas formas para se enviar argumentos para um mtodo,o primeiro envio por valor e o segundo envio por referncia.

8.4.3.1. Passagem de parmetros por valor:


Quando ocorre uma passagem por valor, a chamada do mtodo faz uma cpia do valor do atributo e o reenvia como argumento. O mtodo chamado no modifica o valor original do argumento mesmo que estes valores sejam modificados durante operaes de clculo implementadas pelo mtodo. Vejamos o que acontece com os tipos primitivos: Englobam os tipos numricos (byte, short, int, long, char, float, double) e booleano (boolean). Uma varivel de tipo primitivo recebe um valor primitivo, este valor armazenado diretamente no espao de memria alocado para a varivel.

Exemplo:

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

p ublic static void main(String[] args) { byte a = 10; byte b = a; }

A figura abaixo representa as duas reas de memria alocadas para as variveis a e b, cada uma das variveis mantendo o seu respectivo valor. Exemplo:

No exemplo dado, o mtodo testeValor foi chamado e o valor de i foi enviado como argumento. O valor de i copiado para o atributo do mtodo j. J que j o atributo modificado no mtodo testeValor, no afetar o valor do atributo i, o que significa uma cpia diferente do atributo. Como padro, todo tipo primitivo, quando enviado para um mtodo, utiliza a forma de passagem de parmetro por valor.

8.4.3.2. Passagem de parmetros por referncia:


Quando ocorre um passagem por referncia,a referncia de um objeto enviada para o mtodo chamado. Isto significa que o mtodo faz uma cpia da referncia do objeto enviado. Entretanto, diferentemente do que ocorre no envio por valor, o mtodo pode modificar o objeto para o qual a referncia est apontando. Vejamos o que acontece com os tipos referncia: Referncia englobam os tipos classes, interfaces e arrays. Observando que uma String uma classe. Uma varivel do tipo referncia recebe como valor uma referncia para um objeto. Na rea de memria da varivel armazenado um ponteiro para a rea de memria que est o objeto. Objeto uma instncia de classe ou array. Exemplo:

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

p ublic static void main(String[] args) { Carro a = ne w Carro(); Carro b = a; }

Ento veja a figura que apresenta a rea de memria alocada para o objeto Carro e as duas reas de memria alocadas para as variveis a e b. Notem que as duas variveis possuem reas de memrias distintas, mas que referenciam o mesmo objeto. Para que possamos entender melhor, Java usa a passagem de parmetro SEMPRE POR VALOR, isto , ao passar uma varivel como parmetro de um mtodo sempre ser efetuada a cpia dos bits desta varivel,vamos ver este exemplo. Varivel primitiva:
p ublic static void main(String[] args) { byte preco = 10; System.out.println("Preo antes : " + preco); // Sada "Preo antes : 10" somaPreco(preco); System.out.println("Preo depois: " + preco); // Sada "Preo depois: 10" } p r i vate static void somaPreco(byte parametro) { parametro = parametro + 5; }

Notamos que o contedo da varivel preco foi copiado para a varivel parametro, portanto quando somamos 5 a varivel parametro estamos alterando apenas o contedo desta varivel, enquanto a varivel numero permanece com o mesmo valor.

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

10

Varivel referncia:
p ublic static void main(String[] args) { Carro carro = ne w Carro(); carro.preco = 10; System.out.println("Preo antes : " + carro.preco); // Sada "Preo antes : 10" somaPreco(carro); System.out.println("Preo depois: " + carro.preco); // Sada "Preo depois: 10" } p r i vate static void somaPreco(Carro parametro) { parametro = n ull; } p r i vate static class Carro { byte preco; }

Aqui o contedo da varivel carro passado para a varivel parmetro, ou seja, uma cpia da referncia para o objeto Carro, as duas variveis apontam para o mesmo objeto. Quando alteramos o contedo da varivel parmetro para null, a varivel carro permanece inalterada. A regra de passagem por valor pode ser generalizada para qualquer atribuio. Passagem de parmetro ou retorno de mtodo em Java, sempre feita a cpia dos bits da varivel, ou seja, SEMPRE POR VALOR. Por exemplo:

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

11

Boas dicas de programao em java: 1. Um erro comum sobre envio por referncia acontece quando criamos um mtodo para fazer trocas (swap) usando referncia. Note que Java manipula objetos 'por referncia', entretanto envia-se a referncia para um mtodo 'por valor'. Como consequncia, no se escreve um mtodo padro para fazer troca de valores (swap) entre objetos.

8.4.4. Chamando mtodos estticos


Mtodos estticos so mtodos que podem ser invocados sem que um objeto tenha sido instanciado pela classe (sem utilizar a palavra-chave new). Mtodos estticos pertencem a classe como um todo e no ao objeto especifico da classe. Mtodos estticos so diferenciados dos mtodos de objeto pela declarao da palavra-chave static na definio do mtodo. Para chamar um mtodo esttico, digite:
NomeClasse.nomeMtodoEsttico(argumentos);

Alguns mtodos estticos, que j foram usados em nossos exemplos so:

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

12

// Converter a String 10 em um atributo do tipo inteiro int i = I n teger.parseI nt ("10"); // Retornar uma String representando um inteiro sem o sinal da // base 16 String hexEquivalent = I n tege r.to Hex St r i n g (10);

8.4.5. Escopo de um atributo


Alm de o atributo ter um nome e um tipo, ele tambm possui um escopo. O escopo determina onde o atributo acessvel dentro da classe. O escopo tambm determina o tempo de vida do atributo ou quanto tempo o atributo ir existir na memria. O escopo determinado pelo local onde o atributo declarado na classe. Para simplificar,vamos pensar no escopo como sendo algo existente entre as chaves {...}. A chave direita chamada de chave de sada do bloco (outer) e a chave esquerda chamada chave de entrada do bloco (inner). Ao declarar atributos fora de um bloco, eles sero visveis (usveis) inclusive pelas linhas da classe dentro do bloco. Entretanto, ao declarar os atributo dentro do bloco, no ser possvel utiliz-los fora do bloco. O escopo de um atributo dito local quando declarado dentro do bloco. Seu escopo inicia com a sua declarao e vai at a chave de sada do bloco. Por exemplo, dado o seguinte fragmento de cdigo:

O cdigo acima representa cinco escopos indicado pelas letras. Dados os atributos i, j, k, m e n, e os cinco escopos A, B, C, D e E, temos os seguintes escopos para cada atributo: O escopo do atributo i A. O escopo do atributo j B. O escopo do atributo k C. O escopo do atributo m D. O escopo do atributo n E. Dado dois mtodos: main e testeValorReferencia teremos o seguinte exemplo: Para o mtodo main, os escopos dos atributos so:

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

13

array[] - escopo A i em B - escopo B i em C escopo C E, no mtodo testeValorReferencia, os escopos dos atributos so: vetor[] - escopo D i em E - escopo E Quando atributos so declarados, o identificador deve ser nico no escopo. Isto significa que se voc tiver a seguinte declarao: O compilador ir gerar um erro pois deve-se ter um nome nico para o atributos dentro do bloco. Entretanto, possvel ter atributos definidos com o mesmo nome, se no estiverem declarados no mesmo bloco. Por exemplo:

Quando a primeira instruo System.out.print for invocada, exibir o valor 10 contido na primeira declarao do atributo testeValor. Na segunda instruo System.out.print,

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

14

o valor 20 exibido, pois o valor do atributos testeValor neste escopo.

8.5. Casting, converso e comparao de objetos


Nesta seo, vamos aprender como realizar um casting. Casting, ou typecasting, o processo de converso de um certo tipo de dado para outro. Tambm aprenderemos como converter tipos de dados primitivos para objetos e vice-versa. E, finalmente, aprenderemos como comparar objetos.

8.5.1. Casting de Tipos Primitivos


Casting entre tipos primitivos permite converter o valor de um dado de um determinado tipo para outro tipo de dado primitivo. O casting entre primitivos comum para os tipos numricos. H um tipo de dado primitivo que no aceita o casting, o tipo de dado boolean. Como demonstrao de casting de tipos, considere que seja necessrio armazenar um valor do tipo int em um atributo do tipo double. Por exemplo:

uma vez que o atributo de destino double, pode-se armazenar um valor cujo tamanho seja menor ou igual aquele que est sendo atribudo. O tipo convertido implicitamente. Quando convertemos um atributo cujo tipo possui um tamanho maior para um de tamanho menor, necessariamente devemos fazer um casting explcito. Esse possui a seguinte sintaxe:
(tipoDado)valor

onde: tipoDado o nome do tipo de dado para o qual se quer converter o valor valor um valor que se quer converter. Por exemplo:

Outro exemplo quando desejamos fazer um casting de um valor do tipo int para char. Um carcter pode ser usado como int porque para cada carcter existe um correspondente numrico que representa sua posio no conjunto de caracteres. O casting (char)65 ir produzir a sada 'A'. O cdigo numrico associado letra maiscula A 65, segundo o conjunto de caracteres ASCII. Por exemplo:

8.5.2. Comparando Objetos


Em lies anteriores aprendemos sobre operadores para comparar valores igualdade, negao, menor que, etc. Muitos desses operadores trabalham apenas com dados de tipo

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

15

primitivo, no com objetos. Ao tentar utilizar outros tipos de dados, o compilador produzir erros. Uma exceo para esta regra so os operadores de igualdade: == (igual) e != (diferente). Quando aplicados a objetos, estes operadores no fazem o que se poderia supor. Ao invs de verificar se um objeto tem o mesmo valor de outro objeto, eles determinam se os dois objetos comparados pelo operador tm a mesma referncia. Por exemplo:

Para comparar objetos de uma classe e ter resultados apropriados, deve-se implementar e chamar mtodos especiais na sua classe. Um bom exemplo disso a classe String. possvel ter dois objetos String diferentes que contenham o mesmo valor. Caso se empregue o operador == para comparar objetos, estes sero considerados diferentes. Mesmo que seus contedos sejam iguais, eles no so o mesmo objeto. Para ver se dois objetos String tm o mesmo contedo, um mtodo chamado equals() utilizado. O mtodo compara cada carcter presente no contedo das Strings e retorna true se ambas strings tiverem o mesmo valor.

O cdigo seguinte ilustra essa comparao.

A sada dessa classe a seguinte:

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

16

A primeira parte dessa classe declara dois atributos (str1 e str2) e atribui a literal "Brasil o pas do futebol." a str1, e depois atribui esse valor a str2. Como visto anteriormente, str1 e str2 agora apontam para o mesmo objeto, e o teste de igualdade prova isso. Em seguida, temos a seguinte instruo:

Em seguida, temos a seguinte instruo na mesma classe:

Na segunda parte da classe, cria-se um novo objeto String com o mesmo valor de str1 e fazse a atribuio de str2 para esse novo objeto String. Agora temos dois diferentes tipos de objetos na str1 e str2, ambos com o mesmo contedo. Testando para ver se eles so o mesmo objeto usando o operador de igualdade obtemos a resposta esperada: false eles no so o mesmo objeto na memria. Utilizando o mtodo equals() recebemos a resposta esperada: true eles tem o mesmo contedo.

A linguagem Java possui inteligncia suficiente para retornar apenas a posio em memria do primeiro objeto String criado. Ou seja, ambas as strings se referem ao mesmo objeto como se fosse um apelido. Para obrigar ao Java criar um novo objeto String, deve-se utilizar o operador new.

8.5.3. Determinando a Classe de um Objeto


Existem duas maneiras de se descobrir a qual classe determinado objeto pertence: 1. Para obter o nome da classe: Utiliza o mtodo getClass() que retorna a classe do objeto (onde Class a classe em si). Esta, por sua vez, possui o mtodo chamado getName() que retorna o nome da classe. Por exemplo:

P rojeto e-Jo vem - M d u lo I I: P ro g ra m ao J AV A

17

2. Para testar se um objeto qualquer foi instanciado de uma determinada classe utiliza-se a palavra-chave instanceof. Esta palavra-chave possui dois operadores: a referncia para o objeto esquerda e o nome da classe direita. A expresso retorna um lgico dependendo se o objeto uma instncia da classe declarada ou qualquer uma de suas subclasses. Por exemplo:

Você também pode gostar