• Nenhum resultado encontrado

75Todos os direitos reservados a 3Way Networks

No documento Linguagem Java COMPLETA (páginas 75-77)

Linguagem de Programação Java

Seja um Profissional Aprendendo com Profissionais

www.3way.com.br 66

qualquer uma de suas subclasses. Por exemplo: String ex1 = "Polimorfismo";

System.out.println(ex1 instanceof String);//retorna true String ex2;

System.out.println(ex2 instanceof String);//retorna false,referencia null

7.4.3 Casting de Referências de Objetos

No item 7.4.1, usamos os recursos de polimorfismo para referenciar qualquer objeto como Object, isso nos permitiu criar coleções heterogêneas. Podemos até passar argumentos genéricos para métodos, um método que recebe uma referência a Object como argumento, isto é, qualquer objeto criado em Java. Todas as vezes que provocamos uma mudança no tipo da referência de subclasse para o da superclasse dizemos que houve up-casting. Veja exemplo,

public class Database { private Object[] dados; private int posicao = 0;

public Database(int tamanho) { dados = new Object[tamanho]; }

public void insere(Object object) { this.dados[this.posicao] = object; this.posicao++;

}

public Object retornaObjeto(int indice) { return this.dados[indice];

} }

Listagem 7.7 – Paramêtros Genéricos public class DatabaseGenerico {

public static void main(String[] args) { //uma instancia de calendar

java.util.Calendar data_base = java.util.Calendar.getInstance(); //configura data de contratacao do funcionario

data_base.set(2005, 6, 10); //instancia de Gerente

Gerente funcionario = new Gerente("Hide Otta",1999.99,

data_base.getTime(),"Effe Ciente"); //invoca método da heranca

funcionario.bonusSalario(2); //invoca método da instancia funcionario.bonusLucro(10000.00); //Cria um objeto Database

Database dados = new Database(10); //Armazena um Gerente no Database

dados.insere(funcionario);//ok, up-casting para object //Armazena uma String no Database

//atribuindo valor a variável referência Carro carro1 = new Carro();

carro1.ano = "2001"; carro1.modelo= "fusca"; carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização //criando novo alias

Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância

Cada objeto criado deverá ter sua própria instância de variáveis (atributos) definidas pela classe. Os métodos definem o comportamento de um objeto. Isto é importante, pois denota que um método pertence a cada objeto da classe. Porém não devemos confundir isto com a implementação do método, que é compartilhada por todas as instâncias da classe.

2.3.1 Invocação de Métodos

Objetos se comunicam pela troca de mensagens, isto significa que um objeto pode ter que mostrar um comportamento particular invocando uma operação apropriada que foi definida no objeto. Em Java, isto é feito pela

chamada de um método em um objeto usando o operador binário "." (ponto),

devendo especificar a mensagem completa: o objeto que é o recebedor da mensagem, o método a ser invocado e os argumentos para o método (se houver). O método invocado no recebedor pode também enviar informações de volta ao objeto chamador através de um valor de retorno. O método chamado deve ser um que esteja definido pelo objeto.

Os valores das variáveis em um objeto constituem

o seu estado. Dois objetos distintos têm

o mesmo estado se suas variáveis membro têm os

mesmos valores.

// Como resgatar o Objeto ?

Gerente o_funcionario = dados.retornaObjeto(0); //(1) //erro compilacao

//imprime estado desta instancia de Gerente

System.out.println("Nome funcionario: " + o_funcionario.nome); System.out.println("Cargo: " + o_funcionario.cargo);

System.out.println("Secretariado por : "+ o_funcionario.secretaria); System.out.println("Salario base: " + String.format(

"%,.2f", o_funcionario.salario));

System.out.println("Salario + Comissao: " + String.format("%,.2f", (o_funcionario.salario + o_funcionario.bonus))); }

}

Listagem 7.8 – Todo objeto é Object

Se tentarmos recuperar a referência armazenada como em (1 – linha 24),

Gerente o_funcionario = dados.retornaObjeto(0); //(1)qual o tipo da classe ?

teremos um erro de compilação, informando que os tipos são incompatíveis.

Nós temos certeza de que esse Object é uma referência a um objeto da classe Gerente, já que fomos nós que o adicionamos ao objeto Database, a classe que guarda nossa coleção heterogênea de objetos. Mas o compilador Java não sabe se o que vai ser retornado pelo método será realmente um objeto da classe Gerente.

Então retornaremos a referência Object polimórfica a uma variável do tipo Object, Object o_funcionario = dados.retornaObjeto(0); //ok

Mas agora não é possível utilizarmos a referência para fazermos acesso aos membros do o objetoGerente:

System.out.println("Nome funcionario: "+ o_funcionario.nome); //erro

Mas por que? A referência teve uma amnésia?

A resposta para o dilema é que, o compilador decidirá o que você pode referenciar usando como base o tipo da referência e não o tipo do objeto para o qual ela aponta. Deste modo,é legal fazermos:

System.out.println("funcionario: " + o_funcionario.toString()); //ok

Pois o método toString() é um método definido na classe Object.

Seu objeto Gerente não mudou, ele continua o mesmo, o que mudou foi o tipo da referência. Então para voltarmos a ter acesso aos membros do objeto devemos forçar a conversão do tipo da referência para o tipo do objeto real. Se tiver certeza de que o tipo do objeto é um Gerente, então proceda como abaixo:

Gerente o_funcionario = (Gerente) dados.retornaObjeto(0); //ok //imprime estado desta instancia de Gerente

System.out.println("Nome funcionario: " + o_funcionario.nome);//ok

Se você não sabe ao certo qual o tipo do objeto real, teste-o antes com instanceof, senão uma exceção do tipo ClassCastException seria lançada (uma o quê? Calma chegaremos lá). Neste exemplo o objeto armazenado no índicie 1 do array é do tipo String.

Gerente o_funcionario;

if( dados.retornaObjeto(1) instanceof Gerente){

o_funcionario = (Gerente) dados.retornaObjeto(0); //ok //imprime estado desta instancia de Gerente

System.out.println("Nome funcionario: " + o_funcionario.nome); } //ok

Linguagem de Programação Java

Seja um Profissional Aprendendo com Profissionais

www.3way.com.br 12

//atribuindo valor a variável referência Carro carro1 = new Carro();

carro1.ano = "2001"; carro1.modelo= "fusca"; carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização //criando novo alias

Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância

Cada objeto criado deverá ter sua própria instância de variáveis (atributos) definidas pela classe. Os métodos definem o comportamento de um objeto. Isto é importante, pois denota que um método pertence a cada objeto da classe. Porém não devemos confundir isto com a implementação do método, que é compartilhada por todas as instâncias da classe.

2.3.1 Invocação de Métodos

Objetos se comunicam pela troca de mensagens, isto significa que um objeto pode ter que mostrar um comportamento particular invocando uma operação apropriada que foi definida no objeto. Em Java, isto é feito pela

chamada de um método em um objeto usando o operador binário "." (ponto),

devendo especificar a mensagem completa: o objeto que é o recebedor da mensagem, o método a ser invocado e os argumentos para o método (se houver). O método invocado no recebedor pode também enviar informações de volta ao objeto chamador através de um valor de retorno. O método chamado deve ser um que esteja definido pelo objeto.

Os valores das variáveis em um objeto constituem

o seu estado. Dois objetos distintos têm

o mesmo estado se suas variáveis membro têm os

mesmos valores.

77

No documento Linguagem Java COMPLETA (páginas 75-77)

Documentos relacionados