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.