AULA Mais Herança Curso: Informática (Subseqüente) Disciplina: Programação Orientada a Objetos Prof. Abrahão Lopes
Conversão de Tipos (casting) Num exemplo anterior vimos que é possível colocar um objeto de uma subclasse em uma variável de superclasse: Item coisa = new CD(...); E dissemos que o inverso não é permitido: CD coisa = new Item(...); // ERRO!
Conversão de Tipos (casting) Porém se observarmos bem, em um objeto de um subtipo existe um objeto do tipo da superclasse e portanto há “espaço” para realizarmos tal operação. Mas o compilador não aceitará uma atribuição direta, é preciso usarmos o seguinte artifício: CD ATRIBUTO1; ATRIBUTO2; METODO1( ); METODO2( ); Obj Item CD coisa = (CD) new Item(...);
Conversão de Tipos (casting) Essa operação é chamada conversão de tipo. Ao colocarmos o parênteses (operador de conversão de tipo) com o tipo de dado de destino, o compilador fará os ajustes necessários para que a informação seja entendida como o subtipo indicado e não retorna erro. Entretanto, esse tipo de conversão deve ser evitado. Em geral, um programa bem estruturado não requer conversão de tipos.
Conversão de Tipos (casting) Obs.: Esse tipo de conversão só funciona entre uma superclasse e uma subclasse. Não é possível converter duas subclasses entre si. Neste exemplo dá pra fazer conversão de veículo em carro ou veículo em bicicleta, porém bicicleta em carro ou carro em bicicleta não dá!
Autoboxing e classes empacotadoras Quando falamos sobre vetores, comentamos que os ArrayLists só podem ser usados para tipos objetos e que tipos primitivos como int, float, double,... não poderiam ser usados em listas dinâmicas. Java resolve esse problema através das Classes Empacotadoras, ou seja, classes que foram criadas a fim de transformar tipos primitivos em tipos objetos.
Autoboxing e classes empacotadoras Para cada tipo primitivo existe uma classe empacotadora: Tipo PrimitivoClasse Empacotadora byteByte shortShort intInteger longLong floatFloat doubleDouble charCharacter Boolean
Autoboxing e classes empacotadoras Inclusive já usamos algumas dessas classes ao converter valores digitados pelo usuário, como em: int x = Integer.parseInt(“100”); Autoboxing é uma operação executada automaticamente pelo Java quando usamos um valor do tipo primitivo onde seria necessário um tipo objeto (ou vice-versa, unboxing).
Autoboxing e classes empacotadoras Exemplo: private ArrayList lista;... public void adicionar(int valor){ lista.add(valor); } O método add( ) requer um OBJETO, então Java converte o int para Integer automaticamente.
Polimorfismo e Sobrescrita Quando escrevemos a classe Item e o método imprimir( ) pertencente a ela, conseguimos exibir todos os dados contidos em suas variáveis. Porém, quando esse método é herdado por uma subclasse, temos um problema...
Polimorfismo e Sobrescrita Onde está o nome do cantor? Onde está o nome do diretor? Onde está a plataforma? Onde está a quantidade de jogadores?
Polimorfismo e Sobrescrita Isso acontece por que apesar das subclasse saber tudo sobre a superclasse, a super classe não sabe nada sobre suas subclasses. A primeira idéia para resolver o problema é mover o método imprimir para as subclasses:
Polimorfismo e Sobrescrita Mas aqui vamos esbarrar em dois problemas: O método imprimir( ) não vai encontrar as informações da superclasse; A classe Catalogador não vai encontrar o método imprimir( ). ?
Polimorfismo e Sobrescrita Para resolver o problema usaremos um modelo em que há um método imprimir( ) na superclasse e métodos com mesmo nome nas subclasses.
Polimorfismo e Sobrescrita Nas subclasses iremos sobrescrever os comandos do método da superclasse. Quando chamamos o método imprimir( ) a versão da subclasse será executada primeiro. CDDVD
Polimorfismo e Sobrescrita Observe que adicionamos apenas uma instrução para imprimir o atributo da subclasse (cantor / diretor). As demais informações serão impressas a partir da chamada do método da superclasse através do comando super.imprimir( ); Completando o código das demais classes, a saída ficaria assim:
Polimorfismo e Sobrescrita Olha aí o cantor! Olha aí o diretor! Olha aí plataforma! Olha aí a quantidade de jogadores!
Polimorfismo e Sobrescrita O polimorfismo acontece quando uma mesma chamada de método, em momentos diferentes, invoca métodos diferentes.
Exercício Complete a implementação do sistema de catalogação com métodos imprimir( ) em cada subclasse que sobrescrevem o método da superclasse e exibem todos os atributos do objeto.
Referências BARNES. KOLLING. Programação orientada a objetos com Java. Uma introdução prática usando o BlueJ. 4ed. Pearson, SIERRA, Kathy. BATES, Bert. Use a Cabeça! Java. 2ed. Alta Books, 2007.