terça-feira, 6 de abril de 2010

[Java] Definir herança, polimorfismo, sobrecarga, sobrescrita e invocação de método virtual (parte 1/3)


Herança

É comum em programação orientada a objetos a criação de um modelo para alguma coisa (por exemplo um Animal), e depois precisar de um modelo especializado do original. Por exemplo, pode ser necessária a modelagem de um Peixe ou de um Cavalo que seriam um tipo de Animal, porém com algumas características a mais ou diferenciadas.

Considere o exemplo abaixo.
public class Animal {

public String habitoAlimentar = "";
public String reproducao = "";
public double pesoMedio = 0.0;

public Animal(){}

public Animal(String habitoAlimentar, String reproducao,
double pesoMedio){
...
}

public String detalhaAnimal(){
...
}
}

public class Cavalo {

public String habitoAlimentar = "";
public String reproducao = "";
public double pesoMedio = 0.0;

public String raca = "";
public String corPelagem = "";

public Cavalo(){}

public Cavalo(String habitoAlimentar, String reproducao,
double pesoMedio, String raca, String corPelagem){
...
}

public String detalhaAnimal(){
...
}

}
Percebe-se pelo exemplo que houve a duplicação de variáveis entre as classes Animal e Cavalo. Além disso pode também existir vários métodos que sejam válidos para ambos. Para evitar esse tipo de repetições desnecessárias é recomendada a criação de subclasses daquelas já existentes (utilização de herança).

Em linguagens orientadas a objeto o mecanismo da herança permite ao programador definir uma classe com termos de uma classe anteriormente definida. Em java é utilizada a palavra-chave extends para este propósito como mostra o exemplo abaixo.
public class Cavalo extends Animal {
private String raca = "";
private String corPelagem = "";
}
Descrevendo a classe Cavalo como "é um" Animal não é apenas um modo conveniente de descrever a relação entre as duas classes faz com que o programador se lembre que Cavalo tem todos os membros, tanto atributos como métodos, da classe pai Animal. Isso também significa que se uma operação é válida para Animal então ela também é válida para Cavalo. Assim se a classe pai Animal possui o método detalhaAnimal a classe Cavalo também a possui.

Veja abaixo como seria o diagrama de classe para as classes Animal e Cavalo usando herança.



Sintaxe para uma classe que herda outra:
[modificador] class [nomeDaClasse] extends [nomeDaClassePai]{
[declarações]
}
Vale lembrar que uma herança em Java os contrutores não são herdados, assim se uma classe pai não houver um construtor padrão (sem parâmetros) a classe filha deve implementar uma chamada ao construtor da classe pai com os parâmetros necessários para o contrutor da classe pai. Exemplo: Se a classe pai possui apenas um construtor na forma pai(int x){} a classe filha deve obrigatoriamente implementar um construtor da seguinte forma: filha(int n){ super(n) }

Herança Simples


A linguagem de programação Java permite que uma classe extenda apenas a uma outra classe. A esta restrição damos o nome de Herança simples. Apesar de possiur a restrição de herança simples, java pode realizar tarefa semelhante a herança múltipla com a utilização de interfaces da seguinte forma:
  • Uma classe implementando várias interfaces
  • Uma interface extendendo várias interfaces
Interfaces

Interfaces são conjuntos de métodos vazios (não implementados) e constantes. As interfaces não possuem atributos e interfaces são, de forma simplificada, como roteiros a serem seguidos pelas classes que a implementam. Quando uma classe implementa certa interface ela deve implementar cada um dos seus métodos.

Um comentário:

  1. Olá carina boa noite!!!

    Estou passando aqui para agradecer pela ajuda fornecida, pois estava meio perdido sem material consistente para estudar...e dizer tb que está sendo uma Luz nessa caminhada...agredeço de coração tudo isso que vc tem postado aqui e espero mais post futuros, lhe desejo tb muita sorte nesse concurso e saiba que serás retribuida desse favor...pq nada que é feito pro bem não é recompensado....

    bjos..
    muito obrigado!!!!

    ResponderExcluir