Considere o seguinte código em Java:
class Animal {
protected String nome;
public Animal(String nome) {
this.nome = nome;
}
public String emitirSom() {
return "Som genérico";
}
}
class Cachorro extends Animal {
public Cachorro(String nome) {
super(nome);
}
@Override
public String emitirSom() {
return "Latido";
}
}
Com base nos princípios da Programação Orientada a Objetos e no mecanismo de herança, analise as afirmativas a seguir:
I. A classe Cachorro herda o atributo nome da classe Animal e pode acessá-lo diretamente por ele ter sido declarado como protected.
II. A anotação @Override garante, em tempo de compilação, que o método emitirSom() da subclasse esteja sobrescrevendo corretamente um método da superclasse.
III. Caso o construtor da classe Cachorro não chamasse explicitamente super(nome), o código ainda compilariam normalmente, pois o construtor da superclasse é automaticamente herdado.
IV. A classe Cachorro especializa o comportamento da superclasse ao redefinir o método emitirSom(), caracterizando polimorfismo por sobrescrita.
Assinale a alternativa CORRETA: