Questão nº 56
Questão de Tecnologia da Informação · CESGRANRIO BASA 02/2021 (nº 56)
Admita que as duas classes Java a seguir pertençam ao
pacote default e ocupem arquivos separados.
```java
public class Va {
private int a=0,b=2,c=4;
private static int sb;
public Va() {
a=2;
b=3;
c=4;
}
public Va(int x) {
this();
sb+=x;
}
{
sb=2;
a+=1;
}
static {
sb+=8;
}
public void print() {
System.out.print(a+b+c+sb);
}
}
public class Main {
public static void main(String[] args) {
new Va(1).print();
}
}
```
O que será exibido no console quando o método main for
executado?
- A16
- B31
- C33
- D39
- E41 (alternativa correta)
Resposta comentada
Gabarito Alternativa E
Conceito-chave: Em Java, a ordem de execução é: 1) bloco static da classe (uma única vez), 2) bloco de instância { } (antes de qualquer construtor), 3) construtor. O this() chama outro construtor da mesma classe, e o static pertence à classe, não ao objeto.
- (A) Incorreta: 16 seria o resultado se você ignorasse o bloco
statice o bloco de instância, calculando apenasa+b+c(0+2+4=6) e somandosbcomo 10 (8+2), mas o bloco de instânciasb*=2e osb+=xdo construtor com parâmetro alteram o valor. - (B) Incorreta: 31 seria obtido se você esquecesse de aplicar o
sb*=2do bloco de instância (ficariasb=8+1=9ea=1,b=6,c=16, total 32, não 31) — armadilha comum de inverter a ordem dothis()e do bloco. - (C) Incorreta: 33 seria o resultado se você aplicasse o bloco de instância antes do
static(invertendo a ordem), ou se esquecesse de somar osb+=xdo construtor com parâmetro. - (D) Incorreta: 39 seria obtido se você calculasse
a=2,b=6,c=16(após construtor) esb=8+2=10, mas esquecesse dosb*=2do bloco de instância (ficaria 2+6+16+10=34, não 39) — outra pegadinha de não aplicar o bloco de instância. - (E) Correta: O gabarito oficial é 41. Execução:
static { sb+=8 }→sb=8. Depois, ao criarnew Va(1), o bloco de instância roda primeiro:sb*=2(8→16) ea+=1(0→1). Então o construtorVa(int x)chamathis(), que executaa*=2(1→2),b*=3(2→6),c*=4(4→16). Retorna ao construtor com parâmetro e fazsb+=x(16+1=17). Por fim,print()somaa+b+c+sb= 2+6+16+17 = 41.
Fonte: CESGRANRIO BASA 02/2021 Técnico Científico - Tecnologia da Informação. Reproduzida para fins de estudo.