Considere o seguinte trecho de código em Java: public class Veiculo { private String marca; private String modelo; public Veiculo(String marca, String modelo) { this.marca = marca; this.modelo = modelo; } public void exibirDetalhes() { System.out.println("Marca: " + marca + ", Modelo: " + modelo); } } public class Carro extends Veiculo { private int ano; public Carro(String marca, String modelo, int ano) { super(marca, modelo); this.ano = ano; } @Override public void exibirDetalhes() { super.exibirDetalhes(); System.out.println("Ano: " + ano); } } Com base no código, analise as afirmativas a seguir. I. A classe Carro herda os atributos marca e modelo da classe Veiculo. II. O método exibirDetalhes na classe Carro sobrescreve o método da classe Veiculo. III. Os atributos marca e modelo podem ser acessados diretamente na classe Carro. IV. A palavra-chave super é usada para chamar o construtor da classe pai. Está correto o que se afirma apenas em
- A)I e III.
Errada, porque o item III está incorreto: os atributos marca e modelo existem na herança, mas não podem ser acessados diretamente em Carro por serem private.
- B)II e IV.
Certa, porque o método exibirDetalhes é sobrescrito em Carro e a palavra-chave super é usada para chamar o construtor da classe pai.
- C)I, II e IV.
Errada, porque o item I pode até gerar dúvida na linguagem da prova, mas o item II e o IV estão corretos e o conjunto indicado não corresponde ao gabarito.
- D)I, III e IV.
Errada, porque o item III está incorreto: private impede acesso direto aos atributos da superclasse pela subclasse.
Gabarito: B
Quando uma classe herda outra em Java, ela recebe a estrutura da classe pai, mas isso não significa acesso livre a tudo. No caso, Carro estende Veiculo, então faz sentido dizer que existe herança entre elas. Só que os atributos marca e modelo foram declarados como private na classe Veiculo, então eles não podem ser acessados diretamente dentro de Carro. Para usar esses dados, a subclasse depende de métodos da própria classe pai, ou de outros mecanismos de acesso que a linguagem permita. O item II está correto porque o método exibirDetalhes em Carro usa exatamente a mesma assinatura do método da classe Veiculo e, por isso, o sobrescreve. O @Override é o sinalzinho clássico de que a intenção é essa mesmo: polimorfismo na veia, sem mistério. A subclasse chama super.exibirDetalhes() para reaproveitar o comportamento da classe pai e depois acrescenta a informação do ano. O item IV também está certo: a palavra-chave super é usada para acessar membros da superclasse, inclusive para chamar o construtor do pai com super(marca, modelo). Isso é importante porque o objeto Carro precisa ser inicializado como um Veiculo antes de completar sua própria construção. Assim, o gabarito B está correto porque apenas II e IV estão verdadeiras. O item I até parece plausível, mas costuma confundir quem acha que herdar atributo é o mesmo que poder acessá-lo diretamente. E o item III erra justamente por ignorar o private, que fecha a porta para acesso direto pela subclasse.