Orientação a Objetos - Parte ll
Resumo
Continuando sobre o assunto de Orientação a Objetos, falaremos sobre sobrecarga de métodos, polimorfismo, variáveis de referencias e os demais detalhes que você precisará saber para a prova SCJP 1.5.
Sobrecarga e Sobrescrita de método.
Método Sobrescrito são métodos declarados com mesmo nome em sua classe ou em suas subclasses, mas com algumas características:
- lista de argumentos iguais.
- mesmo tipo de retorno (isso inclui retorno covariantes).
- nível de acesso mais restritivo
- não pode sobrescrever método static e marcado com final
- não pode sobrescrever métodos private, ou seja, se ele não poder ser herdado, não pode ser subscrito.
- não pode pode lançar exceções checadas novas mais abrangentes.
- pode lançar qualquer exceção não-checadas, independente do método novo ou antigo declarar ou não a exceção.
Métodos Sobrecarregados são métodos que tem o mesmo nome, mas com argumentos diferentes, eles possuem estas características:
- lista de argumentos diferentes;
- podem alterar o tipo de retorno;
- podem alterar o modificador de acesso;
- declarar exceções verificadas novas ou mais abrangentes;
Não confunda métodos sobrescritos com sobrecarregados, com certeza eles testaram você para saber seus conhecimentos nisso.
Agora que você já sabe as regras para sobrescrita e sobrecarga de um método, iremos falar agora de Polimorfismo.
Variável de Referencia
A única maneira de acessar um objeto é usando uma variável de referência, um detalhe muito importante que você deve saber é que a variável de referência pode se referir a qualquer subtipo do objeto declarado.
Lembra daquela semântica que foi dito sobre herança? “É UM”. Então podemos tratar um objeto da classe filha como se fosse um objeto da classe pai.
Veja nesta Figura 01 de um código que já foi usado.
Figura 01.
De acordo com este código podemos dizer que:
EsporteRadical esp = new Skate( );
Este código é totalmente permitido, pois afinal de contas Skate é um EsporteRadical.
Mas se fizéssemos ao contrário? Se tentássemos passar um objeto da classe pai a uma variável da classe filho? Caso isso ocorra o compilador irá “gritar” a JVM irá lançar um Exception.
Para que o compilador não “grite” em nossos ouvidos é necessário fazer um downcasting, informando-o qual objeto está debaixo da árvore da herança, veja.
Skate sk8 = (Skate) esp;
Polimorfismo
A primeira coisa que deve vir a sua cabeça quando se trata de polimorfismo é herança, ela tem que estar bem definido para que você possa entender o conceito, ou seja, quando a classe B herda de uma classe A, todos os membros (varáveis de instância e métodos) públicos ou protegidos de A passa a fazer parte de B. Usando outra abordagem é dizer que polimorfismo é usado usar um tipo genérico de variáveis de referencia para apontar para tipos de objetos mais específicos.
Vamos ver na prática como tudo funciona, olhe na Figura 02.
Figura 2.
Veja que usamos alguns conceitos apresentados até agora, vimos herança, que é fundamental pra que haja o polimorfismo, onde as classes Filha01 e Filha02 herdou as variáveis de instancia e métodos públicos da sua classe pai. Houve o uso correto de herança de construtores, e houve o uso correto do uso de variáveis de instância, onde tratamos um objeto da classe filha como se fosse um objeto da classe pai, à partir daí iniciá-se o polimorfismo.
Interface
Para o exame você precisará saber como implementar o uso correto de uma Interface, mas primeiro você precisa saber o que é uma Interface.
Interface é um contrato, onde você estará concordando em fornecer implementações válidas de cada método definido na Interface e que qualquer pessoa que souber como são os métodos da interface poderá chama-los na instância de uma classe que a implemente.
Uma Interface não pode implementar nenhuma classe, somente pode estender outra interface, e uma classe não estende uma Interface, mas sim à implementa, e podendo implementar quantas Interfaces desejar.
A classe não abstrata que implementar uma Interface deve declarar todos seus métodos não declarados. Lembrem-se todos os métodos das Interfaces são implicitamente públicos, então quando declará-los você precisará indicar explicitamente.
Variáveis e métodos static.
O que você precisa saber é que variáveis e métodos marcados com static pertencem a classe, ou seja, você pode usá-los sem uma variável de instancia.
Você nunca poderá acessar um variável não static de um método static, preste muita atenção pois ele te testarão.
Outro ponto que você deve lembrar é que métodos static não podem ser sobrecarregados. Porem eles podem ser redefinidos.
Retorno Covariantes
A partir de Java 1.5 você tem a possibilidade de modificar o tipo de retorno de um método, porém existe uma regra para que isso possa acontecer.
- Você pode retornar null em um método que tenha como tipo de retorno a referencia a um objeto.
- Em método com tipo de retorno primitivo, você pode retornar qualquer valor ou variável que possa ser implicitamente convertido para o tipo de retorno declarado, e qualquer valor que possa ser explicitamente convertido.
- Você pode retornar um array.
- Você pode retornar um objeto que passa pela semântica “É UM”, ou seja, um objeto que possa ser implicitamente convertido para o tipo retornado.
- E algo fundamental que você precisa saber é que métodos declarado como void não deve retornar NADA.
Acoplamento e Coesão
A definição de acoplamento e coesão é subjetivo para a definição do exame, mas o que você terá que saber é que uma boa estrutura de projetos Orientados a Objetos exige um acoplamento fraco e uma alta coesão. Mas o que é isso?
Acoplamento é o grau que uma classe depende, interage com outra classe. E coesão refere a finalidade que a classe foi criada.
Então quanto mais uma classe não depender de outra, isso significa que ela tem o baixo acoplamento, e o maior a especialização dela, isso significa alta coesão, você estará seguindo os princípios da Orientação a Objetos.