Rafael Braga
Manipulando Referncias
De maneira geral, o tratamento dado em Java para converses de tipo para referncias a objetos anlogo ao que acontece nas converses de tipos primitivos. Converses de tipo (classe) para referncias a objetos podem ocorrer:
implicitamente, em atribuies e passagem de parmetros, ou atravs de casting explcito.
Converses de tipos mais especficos para tipos mais gerais (upcasting) so permitidas. O contrrio, converses de tipos mais gerais para tipos mais especficos (downcasting) exigem casting explcito. Isto vale para a hierarquia completa de herana, incluindo classes e interfaces.
2
Manipulando Referncias
Regras de Converso para Operaes com Variveis de Referncia
1. Operao de Atribuio: TipoDeOrigem origRef; TipoDeDestino destRef = origRef; 2. Operao de Passagem de Parmetro: TipoDeOrigem origRef; enviarParam( origRef ); ... void enviarParam( TipoDeDestino destRef ) { ... }
3
Passagem de Parmetros
Como j foi visto em sees anteriores, a passagem de parmetros de tipos primitivos em Java feita por valor, ou seja, uma cpia do valor original feita. Isso significa que modificaes no parmetro formal no so refletidas no parmetro real. Para arrays, uma cpia da referncia para o array passada.
Para objetos, uma cpia da referncia ao objeto passada, e no uma cpia do objeto.
outroDia
referncias
objeto
umaData
9
umaData
0x1402bc84
dia = 22; mes = 0; ano = 0;
11
Manipulando Referncias
Casting de Referncias
Object
Estundante
EstudanteMonitor
12
Manipulando Referncias
Exemplos
public class Programa { EstudanteMonitor em = new EstudanteMonitor(); // situao 1 Estudante e = em; // situao 2 Origem Turma t = new Turma(); t.matricular( em ); Destino } public class Turma { ... public void matricular( Estudante e ) {...} ... }
13
Operador instanceof
O operador binrio instanceof tem a seguinte sintaxe:
variavelDeReferencia instanceof TipoDeDestino
O operador instanceof retorna true se o objeto denotado pela variavelDeReferencia, em tempo de execuo
uma instncia da classe TipoDeDestino ou uma instncia de uma subclasse dela.
Operador instanceof
Em tempo de compilao, porm, verificado se o tipo da variavelDeReferencia e o TipoDeDestino esto no mesmo ramo da hierarquia de classes. Do contrrio, acontecer um erro de compilao.
A B
c
C E
C c c c c c c
Casting de Referncias
Para fazer casting (converso) da variavelDeReferencia do TipoDeOrigem para o TipoDeDestino, usa-se a seguinte sintaxe:
( TipoDeDestino ) variavelDeReferencia
Casting de Referncias
Quando usar o casting:
public class Turma { ... public Estudante obterEstudante(int mat) {...} } ... EstudanteMonitor em; em = new EstudanteMonitor(111, Pedro, M); Turma t = new Turma() t.matricular( em ); EstudanteMonitor em2 = t.obterEstudante( 111 ); ERRO DE COMPILAO, pois o mtodo obterEstudante() retorna um Estudante e no um EstudanteMonitor.
17
Casting de Referncias
Soluo casting:
public class Turma { ... public Estudante obterEstudante(int mat) {...} } ... EstudanteMonitor em; em = new EstudanteMonitor(111, Pedro, M); Turma t = new Turma() t.matricular( em ); EstudanteMonitor em2 = ((EstudanteMonitor)t.obterEstudante( 111 )); necessrio dizer ao compilador que o mtodo obterEstudante() vai retornar em tempo de execuo, nesse caso, um objeto da subclasse EstudanteMonitor.
18
Casting de Referncias
Quando usar o casting:
... EstudanteMonitor em = new EstudanteMonitor(); Turma t = new Turma() t.matricular( em );
19
Casting de Referncias
Soluo casting:
... EstudanteMonitor em = new EstudanteMonitor(); Turma t = new Turma() t.matricular( em );
20
Casting de Referncias
Object
Upcasting
Downcasting
Estudante
Casting implcito
EstudanteMonitor
21
Casting e instanceof
Escrevendo cdigo seguro: combinando Casting e instanceof
... EstudanteMonitor em = new EstudanteMonitor(); Turma t = new Turma() t.matricular( em ); Estudante e = t.obterEstudante( 111 ); if ( e instanceof EstudanteMonitor ) { ( (EstudanteMonitor) e ).tirarDuvidas(); } ...
22
Casting e instanceof
Tanto o casting quanto o operador instanceof requerem verificao:
em tempo de compilao, que avalia somente as referncias, e em tempo de execuo, que avalia o objeto propriamente dito.
24
Qual objeto uma referncia realmente denotar em tempo de execuo nem sempre se pode determinar em tempo de compilao. Polimorfismo a capacidade de uma referncia denotar diferentes objetos na hierarquia de herana em diferentes momentos durante a execuo. Tal referncia uma referncia de supertipo. Quando um mtodo invocado usando uma referncia, a definio do mtodo que ser realmente executada determinada:
pela classe denotada pela referncia em tempo de execuo, e pela assinatura do mtodo.
Polimorfismo
26
Polimorfismo
Entendendo o Polimorfismo...
(1) (2) (3) (4) (5) EstudanteMonitor em = new EstudanteMonitor(); Estudante e = em; e.atribuirNota(1, 7.5); e = new EstudanteEstagiario(); e.atribuirNota(1, 8.5);
e (2) Estudante
(4)
(1)
em EstudanteMonitor EstudanteEstagiario
27
Polimorfismo
Usando o Polimorfismo...
public class Turma { ... public Estudante obterEstudante(int mat) {...} public void matricular (Estudante e) {...} } ... EstudanteMonitor em; em = new EstudanteMonitor(111, Pedro, M); Turma t = new Turma() t.matricular( em ); EstudanteMonitor em2 = ((EstudanteMonitor)t.obterEstudante( 111 ));
28
Ligao Dinmica
Numa hierarquia de herana de classes, dois mtodos podem ter o mesmo nome e tipo: Definio e redefinio, qual usar? O cdigo escolhido dinamicamente (em tempo de execuo), no estaticamente (em tempo de compilao). Escolha feita com base na classe do objeto associado varivel destino do mtodo. O mecanismo de ligao dinmica (dynamic binding) responsvel por associar uma solicitao (de um mtodo) a um objeto em tempo de execuo.
29
Ligao Dinmica
Observando o emprego do Polimorfismo e da Ligao Dinmica
public class Programa { public static void main( String args[] ) { Estudante e = new Estudante(Pedro); e.exibir(); // executa o exibir() de Estudante e = new EstudanteMonitor(Maria); e.exibir(); // executa o exibir() redefinido em // EstudanteMonitor e = new EstudanteEstagiario(Fernanda); e.exibir(); // executa o exibir() redefinido em // EstudanteEstagiario } }
30
Questionrio
1. O que upcasting e downcasting? 2. Em que situao ou situaes necessrio fazer casting explicto? 3. Em que situao ou situaes no necessrio fazer casting explicto? 4. Quando o operador instanceof retorna verdadeiro? 5. Que validao feita em tempo de compilao quando se usa o operador instanceof? 6. Que validao feita em tempo de execuo quando se usa o operador instanceof? 7. Qual a relao do casting com o operador instanceof? 8. Por que converses usando casting so ditas inseguras? 9. O que polimorfismo? 10. Na herana de classes, quando h redefinio de mtodos, o que se pode dizer sobre a execuo do mtodo? 11. Explique o mecanismo de ligao dinmica.
31
Prtica de Laboratrio
1. Implementar o programa do slide 27 para testar o emprego do casting. 2. Implementar o programa do slide 33 para testar o emprego do polimorfismo e da ligao dinmica. 3. Criar uma classe chamada Apresentador que possui um nico mtodo chamado apresentar(Estudante e), que recebe como argumento um Estudante e exibe seus dados, ou seja, chama o mtodo exibir do objeto passado. 4. Codifique um programa para criar um apresentador e trs estudantes (comum, monitor e estagirio) e pass-los ao apresentador para exibir seus dados. Observe o emprego do polimorfismo e da ligao dinmica.
32