Escolar Documentos
Profissional Documentos
Cultura Documentos
JAVA
C a pit u lo 8
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.
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.
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.
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:
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
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();
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.
Usando os mtodos:
Exemplo:
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.
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.
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:
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.
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);
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:
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,
14
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:
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.
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:
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.
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: