Com relação ao programa anterior, é correto afirmar que:
01 class Prova{
02 public int a;
03
04 Prova(int _a){
05 a = _a;
06 }
07 public void acrescenta(int n){
08 a += n;
09 }
10 public void acrescenta(){
11 a++;
12 }
13 }
14 class SubProva extends Prova{
15 private int b;
16 SubProva(int umb, int uma){
17 super(uma);
18 b = umb;
19 }
20 public void acrescenta(int n){
21 b=b+n+2;
22 }
23 public static void main (String args[ ]) {
24 SubProva s = new SubProva(2,5);
25 Prova p = new Prova(2);
26 s.acrescenta(3);
27 p.acrescenta();
28 System.out.println(s.b+s.a);
29 System.out.println(p.a);
30 s.acrescenta();
31 System.out.println(" "+s.b+p.a+s.a) ;
32 }
33 }
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Vamos analisar a questão sobre o código Java fornecido. O gabarito correto é a alternativa C: "a linha 31, ao executar o programa, a saída será '736'".
Para entender por que esta é a alternativa correta, precisamos analisar o código e o comportamento dos métodos envolvidos. Começaremos pela classe Prova.
Classe Prova:
- Possui um atributo público int a.
- O construtor Prova(int _a) inicializa a com o valor passado.
- O método acrescenta(int n) adiciona n ao valor de a.
- O método acrescenta() incrementa a em 1.
Agora, vejamos a classe SubProva:
Classe SubProva:
- Estende Prova, ou seja, herda seus atributos e métodos.
- Possui um atributo privado int b.
- O construtor SubProva(int umb, int uma) chama o construtor da superclasse Prova(uma) e inicializa b com umb.
- O método acrescenta(int n) é sobrescrito para somar n + 2 ao valor de b.
Com isso em mente, vamos analisar a execução do método main:
1. Linha 24: Instancia um objeto SubProva s com b = 2 e a = 5.
2. Linha 25: Instancia um objeto Prova p com a = 2.
3. Linha 26: Chama s.acrescenta(3), atualizando b para 2 + 3 + 2 = 7.
4. Linha 27: Chama p.acrescenta(), incrementando a para 2 + 1 = 3.
5. Linha 28: Imprime s.b + s.a, que é 7 + 5 = 12.
6. Linha 29: Imprime p.a, que é 3.
7. Linha 30: Chama s.acrescenta(), incrementando a para 5 + 1 = 6.
8. Linha 31: Imprime " " + s.b + p.a + s.a, que resulta em " 7" + 3 + 6 = "736".
Vamos agora explicar por que as outras alternativas estão incorretas:
Alternativa A: A saída seria 8, mas a linha 31 imprime "736".
Alternativa B: A saída seria 16, mas a linha 31 imprime "736".
Alternativa D: A saída seria 10, mas a linha 31 imprime "736".
Alternativa E: Está incorreta porque, mesmo sendo private, o campo s.b pode ser acessado dentro da classe SubProva.
Espero que essa explicação tenha ajudado a entender melhor o funcionamento do código e a justificativa para a alternativa correta. Se precisar de mais esclarecimentos, estou à disposição!
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Essa questão é uma leve pegadinha, pois se fosse somente s.b+p.a+s.a, seria 16. Mas como possui o " "+s.b+p.a+s.a, acaba concatenando então se torna 736.
Galera, rodem o código em algum compilador online, por que não é a e)? o b é privado, dá erro na linha 28!
public class Prova{
public int a;
Prova(int _a){
a = _a;
}
public void acrescenta(int n){
a += n;
}
public void acrescenta(){
a++;
}
}
class SubProva extends Main{
private int b;
SubProva(int umb, int uma){
super(uma);
b = umb;
}
public void acrescenta(int n){
b=b+n+2;
}
public static void main(String[] args) {
SubProva s = new SubProva(2,5);
Prova p = new Prova(2);
s.acrescenta(3);
p.acrescenta();
System.out.println(s.b+s.a);
System.out.println(p.a);
s.acrescenta();
System.out.println(" "+s.b+p.a+s.a) ;
}
}
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo