Вы находитесь на странице: 1из 21

Mdulo 1

Introduo Programao I

Lio 9
Trabalhando com Bibliotecas de Classe

Verso 1.0 - Jan/2007

JEDITM

Autor Florence Tiu Balagtas Equipe Joyce Avestro Florence Balagtas Rommel Feria Reginald Hutcherson Rebecca Ong John Paul Petines Sang Shin Raghavan Srinivas Matthew Thompson

Necessidades para os Exerccios

Sistemas Operacionais Suportados NetBeans IDE 5.5 para os seguintes sistemas operacionais: Microsoft Windows XP Profissional SP2 ou superior Mac OS X 10.4.5 ou superior Red Hat Fedora Core 3 Solaris 10 Operating System (SPARC e x86/x64 Platform Edition) NetBeans Enterprise Pack, poder ser executado nas seguintes plataformas: Microsoft Windows 2000 Profissional SP4 Solaris 8 OS (SPARC e x86/x64 Platform Edition) e Solaris 9 OS (SPARC e x86/x64 Platform Edition) Vrias outras distribuies Linux Configurao Mnima de Hardware Nota: IDE NetBeans com resoluo de tela em 1024x768 pixel Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 500 MHz Intel Pentium III workstation ou equivalente 500 MHz Intel Pentium III workstation ou equivalente UltraSPARC II 450 MHz AMD Opteron 100 Srie 1.8 GHz PowerPC G4 Memria 512 MB 512 MB 512 MB 512 MB 512 MB HD Livre 850 MB 450 MB 450 MB 450 MB 450 MB

Configurao Recomendada de Hardware Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 1.4 GHz Intel Pentium III workstation ou equivalente 1.4 GHz Intel Pentium III workstation ou equivalente UltraSPARC IIIi 1 GHz AMD Opteron 100 Series 1.8 GHz PowerPC G5 Memria 1 GB 1 GB 1 GB 1 GB 1 GB HD Livre 1 GB 850 MB 850 MB 850 MB 850 MB

Requerimentos de Software NetBeans Enterprise Pack 5.5 executando sobre Java 2 Platform Standard Edition Development Kit 5.0 ou superior (JDK 5.0, verso 1.5.0_01 ou superior), contemplando a Java Runtime Environment, ferramentas de desenvolvimento para compilar, depurar, e executar aplicaes escritas em linguagem Java. Sun Java System Application Server Platform Edition 9. Para Solaris, Windows, e Linux, os arquivos da JDK podem ser obtidos para sua plataforma em http://java.sun.com/j2se/1.5.0/download.html Para Mac OS X, Java 2 Plataform Standard Edition (J2SE) 5.0 Release 4, pode ser obtida diretamente da Apple's Developer Connection, no endereo: http://developer.apple.com/java ( necessrio registrar o download da JDK). Para mais informaes: http://www.netbeans.org/community/releases/55/relnotes.html

Introduo Programao I

JEDITM

Colaboradores que auxiliaram no processo de traduo e reviso


Alexandre Mori Alexis da Rocha Silva Aline Sabbatini da Silva Alves Allan Wojcik da Silva Andr Luiz Moreira Andro Mrcio Correa Louredo Antoniele de Assis Lima Antonio Jose R. Alves Ramos Aurlio Soares Neto Bruno da Silva Bonfim Bruno dos Santos Miranda Bruno Ferreira Rodrigues Carlos Alberto Vitorino de Almeida Carlos Alexandre de Sene Carlos Andr Noronha de Sousa Carlos Eduardo Veras Neves Cleber Ferreira de Sousa Cleyton Artur Soares Urani Cristiano Borges Ferreira Cristiano de Siqueira Pires Derlon Vandri Aliendres Fabiano Eduardo de Oliveira Fbio Bombonato Fernando Antonio Mota Trinta Flvio Alves Gomes Francisco das Chagas Francisco Marcio da Silva Gilson Moreno Costa Givailson de Souza Neves Gustavo Henrique Castellano Hebert Julio Gonalves de Paula Heraldo Conceio Domingues Hugo Leonardo Malheiros Ferreira Ivan Nascimento Fonseca Jacqueline Susann Barbosa Jader de Carvalho Belarmino Joo Aurlio Telles da Rocha Joo Paulo Cirino Silva de Novais Joo Vianney Barrozo Costa Jos Augusto Martins Nieviadonski Jos Leonardo Borges de Melo Jos Ricardo Carneiro Kleberth Bezerra G. dos Santos Lafaiete de S Guimares Leandro Silva de Morais Leonardo Leopoldo do Nascimento Leonardo Pereira dos Santos Leonardo Rangel de Melo Filardi Lucas Mauricio Castro e Martins Luciana Rocha de Oliveira Lus Carlos Andr Lus Octvio Jorge V. Lima Luiz Fernandes de Oliveira Junior Luiz Victor de Andrade Lima Manoel Cotts de Queiroz Marcello Sandi Pinheiro Marcelo Ortolan Pazzetto Marco Aurlio Martins Bessa Marcos Vinicius de Toledo Maria Carolina Ferreira da Silva Massimiliano Giroldi Mauricio Azevedo Gamarra Mauricio da Silva Marinho Mauro Cardoso Mortoni Mauro Regis de Sousa Lima Namor de S e Silva Nres Chaves Rebouas Nolyanne Peixoto Brasil Vieira Paulo Afonso Corra Paulo Jos Lemos Costa Paulo Oliveira Sampaio Reis Pedro Antonio Pereira Miranda Pedro Henrique Pereira de Andrade Renato Alves Flix Renato Barbosa da Silva Reyderson Magela dos Reis Ricardo Ferreira Rodrigues Ricardo Ulrich Bomfim Robson de Oliveira Cunha Rodrigo Pereira Machado Rodrigo Rosa Miranda Corra Rodrigo Vaez Ronie Dotzlaw Rosely Moreira de Jesus Seire Pareja Sergio Pomerancblum Silvio Sznifer Suzana da Costa Oliveira Tsio Vasconcelos da Silveira Thiago Magela Rodrigues Dias Tiago Gimenez Ribeiro Vanderlei Carvalho Rodrigues Pinto Vanessa dos Santos Almeida Vast Mendes da Silva Rocha Wagner Eliezer Roncoletta

Auxiliadores especiais
Reviso Geral do texto para os seguintes Pases:
Brasil Tiago Flach Guin Bissau Alfredo C, Bunene Sisse e Buon Olossato Quebi ONG Asas de Socorro

Coordenao do DFJUG

Daniel deOliveira JUGLeader responsvel pelos acordos de parcerias Luci Campos - Idealizadora do DFJUG responsvel pelo apoio social Fernando Anselmo - Coordenador responsvel pelo processo de traduo e reviso, disponibilizao dos materiais e insero de novos mdulos Regina Mariani - Coordenadora responsvel pela parte jurdica Rodrigo Nunes - Coordenador responsvel pela parte multimdia Srgio Gomes Veloso - Coordenador responsvel pelo ambiente JEDITM (Moodle)

Agradecimento Especial
John Paul Petines Criador da Iniciativa JEDITM Rommel Feria Criador da Iniciativa JEDITM

Introduo Programao I

JEDITM

1. Objetivos
Nesta lio, 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. 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 lio, 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

Introduo Programao I

JEDITM

2. Introduo Programao Orientada a Objeto


Programao Orientada a Objetos (POO) refere-se ao conceito de objetos como elemento bsico das classes. O mundo fsico 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. Veja exemplos na Tabela 1. Objeto carro Propriedades tipo de cmbio fabricante cor Comportamentos virar frear acelerar

leo

peso rugir cor dormir apetite (faminto ou saciado) caar temperamento (dcil ou selvagem)
Tabela 1: Exemplos de objetos do mundo real

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.

Introduo Programao I

JEDITM

3. Classes e Objetos
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. 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. 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. Classe Carro Cor Fabricante Velocidade Mtodos de Objeto Objeto Carro A Azul Mitsubishi 50 km/h Mtodo Acelerar Mtodo Girar Mtodo Frear
Tabela 2: Exemplos da classe Carro e seus objetos

Objeto Carro B XYZ 123 Vermelha Toyota 100 km/h

Nmero da placa ABC 111 Atributos de Objeto

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.

3.2. 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.

Introduo Programao I

JEDITM

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.

3.3. 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. Classe Carro Nmero da placa Atributos de Objeto Cor Fabricante Velocidade Atributos de Classe Mtodos de Objeto Objeto Carro A Objeto Carro B ABC 111 Azul Mitsubishi 50 km/h Contador = 2 Mtodo Acelerar Mtodo virar Mtodo Frear
Tabela 3: Atributos e mtodos da classe Carro

XYZ 123 Vermelho Toyota 100 km/h

3.4. 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: String ou, o equivalente: String str2 = "Hello world!"; str2 = new String("Hello world!");

Figura 1: Instanciao de uma classe

O operador new aloca a 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.

Introduo Programao I

JEDITM

4. Mtodos
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:

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.

4.2. Chamando Mtodos de Objeto e Enviando Argumentos


Para ilustrar como chamar os mtodos, utilizaremos como exemplo a classe String. Pode-se 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]); Vamos pegar dois mtodos encontrados na classe String como exemplo: Declarao do mtodo public char charAt(int index) Definio Retorna o caractere especificado no ndice. Um ndice vai de 0 at length() - 1. O primeiro caractere da seqncia est no ndice 0, o seguinte, no ndice 1, e assim sucessivamente por todo o array.

public boolean equalsIgnoreCase Compara o contedo de duas Strings, ignorando (String anotherString) maisculas e minsculas. Duas strings so consideradas iguais quando elas tm o mesmo tamanho e os caracteres das duas strings so iguais, sem considerar caixa alta ou baixa.
Tabela 4: Exemplos de Mtodos da classe String

Usando os mtodos: String str1 = "Hello"; char x = str1.charAt(0); // retornar o caracter H // e o armazenar no atributo x

Introduo Programao I

JEDITM

String

str2 = "hello";

// aqui ser retornado o valor booleano true boolean result = str1.equalsIgnoreCase(str2);

4.3. Envio 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. 4.3.1. Envio por valor

Quando ocorre um envio 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. Por exemplo: public class TestPassByValue { public static void main( String[] args ){ int i = 10; //exibe o valor de i System.out.println( i ); //chama o mtodo test //envia i para o mtodo test test( i ); //exibe o valor de i no modificado System.out.println( i );

public static void test( int j ){ //muda o valor do argumento j j = 33; }

No exemplo dado, o mtodo test 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 test, 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 envio por valor. 4.3.2. Envio por referncia

Quando ocorre um envio 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. Mesmo que diferentes referncias sejam usadas nos mtodos, a localizao do dado para o qual ela aponta a mesma. Por exemplo:

Introduo Programao I

JEDITM

class TestPassByReference { public static void main(String[] args) { // criar um array de inteiros int []ages = {10, 11, 12}; // exibir os valores do array for (int i=0; i < ages.length; i++) { System.out.println( ages[i] ); } // chamar o mtodo test e enviar a // referncia para o array test( ages ); // exibir os valores do array for (int i=0; i < ages.length; i++) { System.out.println(ages[i]); }

} public static void test( int[] arr ){ // mudar os valores do array for (int i=0; i < arr.length; i++) { arr[i] = i + 50; } } }

Figura 2: Exemplo de Envio por referncia

Dicas de programao: 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 conseqncia, no se escreve um mtodo padro para fazer troca de valores (swap) entre objetos.

Introduo Programao I

10

JEDITM

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: // Converter a String 10 em um atributo do tipo inteiro int i = Integer.parseInt("10"); // Retornar uma String representando um inteiro sem o sinal da // base 16 String hexEquivalent = Integer.toHexString(10);

4.5. Escopo de um atributo


Alm do 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: public class ScopeExample { int i = 0; public static void main(String[] args) { int j = 0; { int k = 0; int m = 0; C int n = 0; D } } }

B C

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. Introduo Programao I 11

JEDITM

O O O O

escopo escopo escopo escopo

do do do do

atributo atributo atributo atributo

j k m n

B. C. D. E.

Dado dois mtodos: main e test teremos o seguinte exemplo: class TestPassByReference { public static void main(String[] args) { // criar um array de inteiros int []ages = {10, 11, 12}; //exibir os valores do array for (int i=0; i < ages.length; i++){ System.out.println( ages[i] ); } // chamar o mtodo test e enviar a referncia para o array test(ages); //exibe novamente os valores do array for (int i = 0; i < ages.length; i++) { System.out.println( ages[i] ); }

B A

E }

} public static void test(int[] arr) { // modificar os valores do array for (int i = 0; i < arr.length; i++) { arr[i] = i + 50; } }

Para o mtodo main, os escopos dos atributos so: ages[] - escopo A i em B - escopo B i em C escopo C E, no mtodo test, os escopos dos atributos so: arr[] - 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: { } int test = 10; int test = 20;

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: public class TestBlock { int test = 10; Introduo Programao I 12

JEDITM

public void test() { System.out.print(test); int test = 20; System.out.print(test); } public static void main(String[] args) { TestBlock testBlock = new TestBlock(); testBlock.test(); } } Quando a primeira instruo System.out.print for invocada, exibir o valor 10 contido na primeira declarao do atributo test. Na segunda instruo System.out.print, o valor 20 exibido, pois o valor do atributos test neste escopo. Dicas de programao: 1. Evite ter atributos declarados com o mesmo nome dentro de um mtodo para no causar confuso.

Introduo Programao I

13

JEDITM

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.

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: int numInt = 10; double numDouble = numInt; // cast implcito 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 forma: (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: double valDouble = 10.12; int valInt = (int)valDouble; //converte valDouble para o tipo int double x = 10.2; int y = 2; int result = (int)(x/y); //converte o resultado da operao para int Outro exemplo quando desejamos fazer um casting de um valor do tipo int para char. Um caractere pode ser usado como int porque para cada caractere 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: char valChar = 'A'; System.out.print((int)valChar); //casting explcito produzir 65

5.2. Casting de Objetos


Para objetos, a operao de casting tambm pode ser utilizada para fazer a converso para outras classes, com a seguinte restrio: a classe de origem e a classe de destino devem ser da mesma famlia, relacionadas por herana; uma classe deve ser subclasse da outra. Veremos mais em lies posteriores sobre herana.

Introduo Programao I

14

JEDITM

Analogamente converso de valores primitivos para um tipo maior, alguns objetos no necessitam ser convertidos explicitamente. Em conseqncia de uma subclasse conter todas as informaes da sua superclasse, pode-se usar um objeto da subclasse em qualquer lugar onde a superclasse esperada. Por exemplo, um mtodo que recebe dois argumentos, um deles do tipo Object e outro do tipo Window. Pode-se enviar um objeto de qualquer classe como argumento Object porque todas as classes Java so subclasses de Object. Para o argumento Window, possvel enviar apenas suas subclasses, tais como Dialog, FileDialog, Frame (ou quaisquer de subclasses de suas subclasses, indefinidamente). Isso vale para qualquer parte da classe, no apenas dentro da chamadas do mtodo. Para um objeto definido como uma classe Window, possvel atribuir objetos dessa classe ou qualquer uma de suas subclasses para esse objeto sem o casting.

Figura 3: Exemplo de Hierarquia de Classes

O contrrio tambm verdadeiro. Uma superclasse pode usada quando uma subclasse esperada. Entretanto, nesse caso, o casting necessrio porque as subclasses contm mais mtodos que suas superclasses, e isso acarreta em perda de preciso. Os objetos das superclasses podem no dispor de todo o comportamento necessrio para agir como um objeto da subclasse. Por exemplo, se uma operao faz a chamada a um mtodo de um objeto da classe Integer, usando um objeto da classe Number, ele no ter muitos dos mtodos que foram especificados na classe Integer. Erros ocorrero se voc tentar chamar mtodos que no existem no objeto de destino. Para usar objetos da superclasse onde uma subclasse esperada, necessrio fazer o casting explcito. Nenhuma informao ser perdida no casting, entretanto, ganhar todos os atributos e mtodos que a subclasse define. Para fazer o casting de um objeto para outro, utiliza-se a mesma operao utilizada com os tipos primitivos: Para fazer o casting: (nomeClasse)objeto onde: nomeClasse o nome da classe destino objeto a referncia para o objeto origem que se quer converter

Uma vez que casting cria uma referncia para o antigo objeto de nomeClasse; ele continua a existir depois do casting.

Introduo Programao I

15

JEDITM

Figura 4: Hierarquia de classes para a superclasse Employee

O exemplo a seguir realiza um casting de um objeto da classe VicePresident para um objeto da classe Employee. VicePresident uma subclasse de Employee com mais informaes, supondo que tenha sido definido que a classe VicePresident tem mais privilgios que um Employee. Employee emp = new Employee(); VicePresident veep = new VicePresident(); emp = veep; // casting no necessrio de baixo para cima veep = (VicePresident)emp; // necessita do casting explcito

5.3. Convertendo Tipos Primitivos para Objetos e Vice-Versa


No se pode fazer sob qualquer circunstncia um casting de um objeto para um tipo de dado primitivo, ou vice-versa. Tipos primitivos e objetos so muito diferentes em Java e no se pode fazer o casting automaticamente entre os dois ou intercambiar o seu uso. Como alternativa, o pacote java.lang oferece classes que fazem a correspondncia para cada tipo primitivo: Float, Boolean, Byte, dentre outros. Muitas dessas classes tm o mesmo nome dos tipos de dados primitivos, exceto pelo fato que o nome dessas classe comeam com letra maiscula (Short ao invs de short, Double ao invs de double, etc). H duas classes que possuem nomes que diferem do correspondente tipo de dado primitivo: Character usado para o tipo char e Integer usado para o tipo int. Estas classes so chamadas de Wrapper Class. Verses anteriores a 5.0 de Java tratam os tipos de dados e suas Wrapper Class de forma muito diferente e uma classe no ser compilada com sucesso se for utilizado uma quando deveria usar a outra. Por exemplo: Integer ten = 10; Integer two = 2; System.out.println(ten + two); Usando as classes que correspondem a cada um dos tipos primitivos, possvel criar objetos que armazenam este mesmo valor. Por exemplo: // A declarao seguinte cria um objeto de uma classe Integer // com o valor do tipo int 7801 (primitivo -> objeto) Integer dataCount = new Integer(7801); // A declarao seguinte converte um objeto Integer para um // tipo de dado primitivo int. O resultado o valor 7801 int newCount = dataCount.intValue(); // Uma converso comum de se fazer de String para um tipo // numrico (objeto -> primitivo) String pennsylvania = "65000"; int penn = Integer.parseInt(pennsylvania);

Introduo Programao I

16

JEDITM

Dicas de programao: 1. A classe Void representa vazio em Java. Deste modo, no existem motivos para ela ser usada na converso de valores primitivos e objetos. Ela um tratador para a palavra-chave void, que utilizada na assinatura de mtodos indicando que estes no retornam valor.

5.4. Comparando Objetos


Em lies prvias, aprendemos sobre operadores para comparar valores igualdade, negao, menor que, etc. Muitos desses operadores trabalham apenas com dados de tipo 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: String valor1 = new String; Integer dataCount = new Integer(7801); 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 caractere presente no contedo das Strings e retorna true se ambas strings tiverem o mesmo valor. O cdigo seguinte ilustra essa comparao, class EqualsTest { public static void main(String[] args) { String str1, str2; str1 = "Free the bound periodicals."; str2 = str1; System.out.println("String1: " + str1); System.out.println("String2: " + str2); System.out.println("Same object? " + (str1 == str2)); str2 = new String(str1); System.out.println("String1: " + str1); System.out.println("String2: " + str2); System.out.println("Same object? " + (str1 == str2)); System.out.println("Same value? " + str1.equals(str2));

} }

Introduo Programao I

17

JEDITM

A sada dessa classe a seguinte: String1: Free the bound String2: Free the bound Same object? true String1: Free the bound String2: Free the bound Same object? false Same value? true Vamos entender o processo envolvido. String str1, str2; str1 = "Free the bound periodicals."; str2 = str1; periodicals. periodicals. periodicals. periodicals.

Figura 5: Duas referncias apontando para o mesmo objeto

A primeira parte dessa classe declara dois atributos (str1 e str2) e atribui a literal "Free the bound periodicals." 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: str2 = new String(str1); Na segunda parte da classe, cria-se um novo objeto String com o mesmo valor de str1 e faz-se 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.

Figura 6: As referncias apontam agora para objetos diferentes

Dicas de programao: 1. Porque no se pode ter a mesma literal quando mudamos str2, a no ser quando utilizamos o new? Literais String so otimizadas em Java; se uma String criada utilizando uma literal e cria-se outra String com os mesmos caracteres,

Introduo Programao I

18

JEDITM

Java tem inteligncia suficiente para retornar apenas a posio em memria do primeiro objeto String criado. Ou seja, ambas 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.

5.5. 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-se 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: String name = key.getClass().getName(); 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: String ex1 = "Texas"; System.out.println(ex1 instanceof String); // retorna true String ex2; System.out.println(ex2 instanceof String); // retorna false

Introduo Programao I

19

JEDITM

6. Exerccios
6.1. Definindo termos
Em suas palavras, defina os seguintes termos: 1. 2. 3. 4. 5. 6. 7. 8. Classe Objeto Instanciao Atributo de objeto Mtodo de objeto Atributo de classe ou atributos estticas Construtor Mtodo de classe ou mtodos estticos

6.2. Java Scavenger Hunt


Pipoy um novato na linguagem de programao Java. Ele apenas ouviu que existem Java APIs (Application Programming Interface) prontas para serem usadas em suas classes e ele est ansioso para fazer uns testes com elas. O problema que Pipoy no tem uma cpia da documentao Java e ele tambm no tem acesso Internet, deste modo, no h como ele ver as APIs java. Sua tarefa ajudar Pipoy a procurar as APIs. Voc deve informar as classes s quais os mtodos pertencem e como o mtodo deve ser declarado com um exemplo de uso deste. Por exemplo, se Pipoy quer saber qual o mtodo que converte uma String para int, sua resposta deve ser: Classe: Integer Declarao do Mtodo: public static int parseInt( String value ) Exemplo de Uso: String strValue = "100"; int value = Integer.parseInt( strValue ); Tenha certeza de que o fragmento de cdigo que voc escreveu em seu exemplo de uso compila e que produza o resultado correto. Enfim, no deixe Pipoy confuso. (Dica: Todos os mtodos esto no package java.lang). Caso haja mais de um mtodo para atender tarefa, utilize apenas um. Agora vamos iniciar a busca! Aqui esto alguns mtodos que Pipoy necessita: 1. Procure pelo mtodo que verifica se uma String termina com um determinado sufixo. Por exemplo, se a String dada "Hello", o mtodo deve retornar true se o sufixo informado "lo", e false se o sufixo for "alp". 2. Procure pelo mtodo que determina a representao do caractere para um dgito e base especficos. Por exemplo, se o dgito informado 15 e a base 16, o mtodo retornar o caractere 'F', uma vez que 'F' a representao hexadecimal para o nmero 15 em base 10. 3. Procure por um mtodo que retorna a parte inteira de um valor double. Por exemplo, se a entrada for 3.13, o mtodo deve retornar o valor 3. 4. Procure por um mtodo que determina se um certo caractere um dgito. Por exemplo, se a entrada for '3', retornar o valor true. 5. Procure por um mtodo que interrompe a execuo da Java Virtual Machine corrente.

Introduo Programao I

20

JEDITM

Parceiros que tornaram JEDITM possvel

Instituto CTS Patrocinador do DFJUG. Sun Microsystems Fornecimento de servidor de dados para o armazenamento dos vdeo-aulas. Java Research and Development Center da Universidade das Filipinas Criador da Iniciativa JEDITM. DFJUG Detentor dos direitos do JEDITM nos pases de lngua portuguesa. Banco do Brasil Disponibilizao de seus telecentros para abrigar e difundir a Iniciativa JEDITM. Politec Suporte e apoio financeiro e logstico a todo o processo. Borland Apoio internacional para que possamos alcanar os outros pases de lngua portuguesa. Instituto Gaudium/CNBB Fornecimento da sua infra-estrutura de hardware de seus servidores para que os milhares de alunos possam acessar o material do curso simultaneamente.

Introduo Programao I

21

Вам также может понравиться