[OCPJP6] 016 – Orientação a objetos

Sobrecarga de construtores

Como vimos anteriormente o grande propósito de um construtor é instanciar uma classe, e indo além podemos definir contratos para instanciar uma determinada classe, ou seja, definir atributos obrigatórios e/ou padrões.

Por exemplo, uma classe Quadrado(int lado) define que toda instância de Quadrado obrigatoriamente deve atribuir um valor “lado”.

Legal né… E se eu quisesse oferecer a possibilidade de instanciar um Quadrado com lados fracionários? Quadrado(double lado)

package certificacao;
public class Quadrado {
    double lado;
    public Quadrado(int l) { this.lado = l; }
    public Quadrado(double l) { this.lado = l; }
}

E se houvesse uma herança (generalização -> especialização)? Até onde poderiamos ir? 😛

  • O construtor mais específico irá ser chamado
  • Se houver ambiguidade não irá compilar
package certificacao;
public class Pessoa {
    public Pessoa() { System.out.println("()"); }
    public Pessoa(Object param1) { System.out.println("(Object)"); }
    // Lembre-se: String é uma especialização de Object
    public Pessoa(String param1) { System.out.println("(String)"); }
}

– E se eu fizesse: new Pessoa(null); o que aconteceria?

Se você respondeu: (String) você acertou, porque String é a classe mais específica entre Object e String 😉

 – E seu ao invés de Pessoa(Object param1) eu tivesse Pessoa(Integer param1) o que aconteceria?

new Pessoa(null); não compilaria, porque o compilador não saberia o que fazer, já que Integer e String são ambíguos a null. Para funcionar seria necessário um cast new Pessoa((String)null);. Veremos mais sobre cast em breve.

Comentem, estendam o assunto… Compartilhem =)

Anúncios

[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 =)