Economia de nomes - Polimorfismo
Pesquisas Acadêmicas: Economia de nomes - Polimorfismo. Pesquise 862.000+ trabalhos acadêmicosPor: james9819 • 31/10/2013 • Pesquisas Acadêmicas • 2.075 Palavras (9 Páginas) • 454 Visualizações
HERANÇA E HIERARQUIA DE CLASSES ver. 15.10.09
Nos exemplos abaixo, consideramos inicialmente as classes:
class Ponto {
int x,y; // coordenadas do ponto
}
class Figura {
Ponto centro; // atributo herdado pelas subclasses
// método concreto herdado pelas subclasses
public Ponto getCentro() {
return centro;
}
}
class Quadrado extends Figura{
public double lado;
public Quadrado(double lado){
this.lado = lado;
}
public double area(){
return lado*lado;
}
}
class Circulo extends Figura{
public double raio;
public Circulo (double raio){
this.raio = raio;
}
public double area() {
return Math.PI * raio * raio;
}
}
1. Economia de nomes - Polimorfismo
Em Java, e outras linguagens OO, o mesmo nome pode ser aplicado a funções diferentes. Por exemplo, podemos ter duas classes, Quadrado e Circulo. Para calcular a area de cada figura dessas, podemos implementar um método de nome area() em cada classe, mas com implementações diferentes. Na classe Quadrado, o método area() retorna o valor de lado*lado, e na classe Circulo, o método area() retorna o valor de pi*raio*raio.
Em programas escritos em C, por comparação, não podem existir, no mesmo programa, funções diferentes com nomes iguais. Em C teríamos que inventar nomes diferentes, digamos, areaQuad() e areaCirc(). Além de poluir o ambiente com muito mais nomes, obriga a usar nomes artificiais, diferentes do uso comum.
Essa propriedade é chamada de "Polimorfismo" (muitas formas), indicando que podemos ter muitas formas de implementar métodos com o mesmo nome.
2. Compilação e "ligação tardia" de métodos em Java:
Quando o compilador Java encontra, em algum método de alguma classe, uma chamada de método como:
x.area();
ele verifica primeiro se existe algum método com essa assinatura na classe correspondente ao tipo de x, ou em alguma superclasse dela. Se não existir, o programa não compilará.
Se existir, o programa compila, mas o compilador não liga o código compilado a nenhum código específico. Somente em tempo de execução é que a ligação será feita. O método que será executado vai depender da classe do objeto que x estiver referenciando no momento da execução do comando. Isso torna a linguagem menos eficiente, mas mais flexível.
3. Referências, tipos e variáveis:
Uma referência é o valor do endereço de um objeto construído na memória.
Toda referência em Java tem um tipo associado.
Por exemplo, a expressão:
new Data(29,8,2007);
constrói uma instância de Data, e retorna uma referência do tipo Data.
Uma referência pode ser, opcionalmente, armazenada em uma variável, usando o operador de atribuição =. Essa variável deve ser, obrigatoriamente, declarada com um tipo compatível com o tipo da referência, como em:
Data d1; // declara uma variável do tipo Data
d1 = new Data(29,8,2007); // a referência retornada será armazenada na variável d1
Para ser compatível, a referência deve ser do tipo da variável, ou de uma subclasse, direta ou indireta, do tipo da variável.
Se fizermos:
d1 = new Data(29,8, 2007).amanha();
dois objetos serão criados na memória, mas somente a referência do segundo objeto será armazenada na variável d1.
Note que o mensagem amanha() é enviada diretamente através da referência retornada pelo construtor da Data.
Tipos só têm utilidade em tempo de compilação. A maior utilidade é permitir ao compilador verificar a consistência do código, e se o programa corre algum risco de abortar por não encontrar um método apropriado em tempo de execução.
Uma variável do tipo de uma classe pode também receber uma referência para um objeto que seja de uma subclasse (direta ou indireta) dessa classe:
Ex:
...