Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida no Ex. 7 da Aula 1 - Herança, reescrita e polimorfismo

Boa noite. Tenho uma dúvida quanto a Polimorfismo com herança de construtor. Como faço pra utilizar um construtor em uma classe que está herdando outra classe? Fiz uma breve pesquisa, porém o único resultado positivo que encontrei foi de criar um novo construtor na classe herdada e referenciar como " super(-construtor-) " . Desde já agradeço as respostas.

Por exemplo:

class Usuario {
    protected String nome;
    public Usuario(String nome){
        this.nome = nome;
    }
    public void showInfo(){
        System.out.println("Logado como Usuario");
    }
}


class UsuarioGerente extends Usuario {

    public void showInfo(){
        System.out.println("Logado como Usuario");
    }
}

3 respostas

Albert, Bom dia !

Exatamente para utilizar o construtor da classe pai , utilizamos a palavra reservada super.

exemplo do seu código caso você queira utilizar o construtor da classe usuário na classe UsuarioGerente ficaria assim :

class UsuarioGerente extends Usuario {

    String nome;

    public UsuarioGerente(String nome) {

        super(nome);

    }

Espero ter ajudado , Bons estudos

solução!

Oi Albert, tudo bem? Fiz alguns pequenos ajustes no código, adicionando o void no metodo showInfo(). :)

O que você encontrou na sua pesquisa está correto. É tanto que seu código da forma como está não compila, pois:

A classe UsuarioGerente possui um construtor padrão implicito, vazio e sem argumentos. Quando herdamos de uma classe de outra, no momento da criação de um objeto, quando o construtor é chamado, faz sentido que precisemos também construir o que foi definido na superclasse. Portanto o construtor da superclasse também é chamado.

O super() é responsável por isso, e é a primeira instrução de um construtor mesmo que você não deixe explícito. Existem algumas regras quanto ao uso, mas vamos manter simples por enquanto.

Por padrão o super invoca o construtor sem argumentos da superclasse. Alguns exemplos:

class Usuario {
    Usuario() {
      System.out.println("Mae");
    }
}


class UsuarioGerente extends Usuario {
    UsuarioGerente() {
      super(); // chama construtor da superclasse
      System.out.println("Filha");
  }

  public static void main(String[] args) {
    new UsuarioGerente();
  }
}

O código anterior imprime: "Mae" e depois "Filha". O código a seguir tem o mesmo efeito, a chamada do super é feita mesmo que não declaremos:

class Usuario {
    Usuario() {
      System.out.println("Mae");
    }
}


class UsuarioGerente extends Usuario {
    UsuarioGerente() {
      System.out.println("Filha");
  }

  public static void main(String[] args) {
    new UsuarioGerente();
  }
}

O problema ocorre quando não temos construtor sem argumentos na superclasse. Aí a chamada ao super tem que ser explicita e temos que passar os argumentos que a superclasse necessita, ou o código nem mesmo compila:

class Usuario {
    Usuario(String nome) {
      System.out.println("Olá: " + nome);
    }
}


class UsuarioGerente extends Usuario {
    UsuarioGerente() {
      super("Lucas");
      System.out.println("Filha");
  }

  public static void main(String[] args) {
    new UsuarioGerente();
  }
}

Faz sentido?

Abraço.

Desde já agradeço a resposta, foi muito esclarecedora. ^^