Questão nº 34
Questão de Tecnologia da Informação · CESGRANRIO CAIXA 1/2021/NM (nº 34)
As classes Java a seguir pertencem ao pacote default.
```java
class A1 {
protected int va1=1,va2=2;
public A1(int x) {
va1+=x;
va2=x;
}
}
class A2 extends A1 {
protected int vb1=10;
}
class A3 extends A2 {
protected int vc1=0;
public A3(int y) {
vc1=(va1+va2)y;
}
}
public class Main {
public static void main(String[] args) {
A3 o=new A3(2);
System.out.println(o.vc1);
}
}
```
Qual construtor poderá ser inserido na classe A2, sem que um erro de compilação seja gerado?
- A```java
public A2() {
vb1=va1+va2;
}
``` - B```java
public A2(int z) {
super(z);
vb1=va1+va2;
}
``` - C```java
public A2() {
vb1=va1+va2;
super(vb1);
}
``` - D```java
public A2() {
super(0);
vb1=va1+va2;
}
``` (alternativa correta) - E```java
public A2() {
super(vb1);
}
```
Resposta comentada
Gabarito Alternativa D
Conceito-chave: Em Java, todo construtor de uma subclasse deve chamar, direta ou indiretamente, um construtor da superclasse. Se você não escrever essa chamada, o compilador insere automaticamente super() (sem argumentos). Como A1 só tem um construtor que exige um int, a classe A2 precisa chamar super(int) explicitamente — e essa chamada deve ser a primeira instrução do construtor.
- (A) Incorreta: Não chama
super(int); o compilador tentaria inserirsuper()que não existe emA1, gerando erro. - (B) Incorreta: A chamada
super(z)está correta, mas o construtorpublic A2(int z)não é usado porA3(que chamasuper()implicitamente), eA3não tem como chamar esse construtor comint— logo,A3falha ao compilar. - (C) Incorreta: A chamada
super(vb1)está depois devb1=..., violando a regra de quesuper()deve ser a primeira instrução; além disso,vb1ainda não foi inicializado. - (D) Correta:
super(0)é a primeira instrução e chama o construtor deA1com argumentoint; depois,vb1é atribuído normalmente. Isso permite queA3compile, poisA2agora tem um construtor sem parâmetros. - (E) Incorreta:
super(vb1)usavb1antes de ser inicializado (valor padrão0), mas o erro fatal é quesuper()deve ser a primeira instrução — aqui está, mas o argumentovb1não é válido porque o campo ainda não foi definido no contexto da superclasse; além disso,A2não teria construtor sem parâmetros, quebrandoA3.
Fonte: CESGRANRIO CAIXA 1/2021/NM Técnico Bancário Novo - Tecnologia da Informação. Reproduzida para fins de estudo.