[OCPJP6] 014 – Orientação a objetos

Iniciando com sobrecarga

Diferentemente da sobrescrita, na sobrecarga o compilador olha para a referência da variável e não a sua instância. Como assim? Referência ou instância?

No post [009] comentei sobre variáveis primitivas e de referência e deixei para descrever um pouco mais sobre herança e polimorfismo mais pra frente, e no post [012] o assunto polimorfismo apareceu como uma das coisas mais belas na orientação a objetos e agora vamos entender o que é referência e instância antes de começar com sobrecarga 🙂

// Lembra disso?
SerVivo cachorro = new Cachorro();

No exemplo acima SerVivo é a referência e Cachorro é a instância da variável.

Agora que estamos entendidos o que você acha que acontecerá no código abaixo?

package certificacao;
public class MainSobrecarga {
    public static void main(String[] args) {
        MainSobrecarga ei = new MainSobrecarga();
        Homem duvida = new Menino();
        ei.mostraMinha(duvida);
    }
    public void mostraMinha(Homem h) {
        System.out.println("homem"); }
    public void mostraMinha(Menino m) {
        System.out.println("menino"); }
}

homem ou menino?

homem é a resposta correta! O compilador vai interpretar a referência da variável e utilizar o método mostraMinha(Homem) 🙂

Mais e mais…

  • Sobrecarga de construtores (em breve)
  • E mais… Para o próximo tema “Atribuições”

Comentem, estendam o assunto… Compartilhem =)

[OCPJP6] 012 – Orientação a objetos

Polimorfismo

Para iniciar a sessão de orientação a objetos, uma das coisas mais belas na orientação a objetos, o polimorfismo.

É importante termos conhecimento do que é herança em orientação a objetos. Resumidamente herança é a forma de compartilhar atributos e métodos de uma classe base (generalização) para suas classes derivadas (especializações).

O polimorfismo é uma forma de “assinar” algo de modo geral (generalização), ou seja, sem se preocupar com as especialidades de cada especialização. Confuso? Vamos ver em código 🙂

Em um exemplo simples… tudo começa assim…

-Object
    '- SerVivo
        '- Animal
            '- Cachorro
            '- Lagarto
        '- Humano
            '- Homem
            '- Mulher

SerVivo é a classe base (generalização) e os demais são as derivadas (especializações).

package certificacao;
public abstract class SerVivo {
    public abstract String locomover();
}
package certificacao;
public abstract class Animal extends SerVivo { }
package certificacao;
public class Cachorro extends Animal {
    @Override
    public String locomover() { return "pulando"; }
}
package certificacao;
public class Lagarto extends Animal {
    @Override
    public String locomover() { return "se arrastando"; }
}
package certificacao;
public abstract class Humano extends SerVivo {
    @Override
    public String locomover() { return "caminhando"; }
}
package certificacao;
public class Homem extends Humano { }
package certificacao;
public class Mulher extends Humano { }

Executando

package certificacao;
import java.util.ArrayList;
import java.util.List;

public class PolimorfismoMain {
    public static void main(String[] args) {
        List<SerVivo> seresVivos = criaSeresVivos();
        // POLIMORFISMO: Para este código,
        // Não importa o que o método locomover faz em cada especialização
        // =D
        for (SerVivo serVivo : seresVivos) {
            System.out.println(serVivo.getClass().getName()
                + " | " + serVivo.locomover());
        }
    }
    public static List<SerVivo> criaSeresVivos() {
        List<SerVivo> seresVivos = new ArrayList<SerVivo>();
        // cachorro
        SerVivo cachorro = new Cachorro();
        seresVivos.add(cachorro);
        // lagarto
        SerVivo lagarto = new Lagarto();
        seresVivos.add(lagarto);
        // mulher
        SerVivo mulher = new Mulher();
        seresVivos.add(mulher);
        // homem
        SerVivo homem = new Homem();
        seresVivos.add(homem);
        return seresVivos;
    }
}

Console

certificacao.Cachorro | pulando
certificacao.Lagarto | se arrastando
certificacao.Mulher | caminhando
certificacao.Homem | caminhando

Em código, você deve pensar que não precisa se preocupar como o homem ou o cachorro vão se locomover, deixe que a especialização faça seu papel em execução =). O polimorfismo simplifica a implementação de uma funcionalidade de execução (Serviço) 😉

Em breve outras características de herança em Java: sobrescrita e sobrecarga.

Comentem, estendam o assunto… Compartilhem =)