Analise o código Java a seguir. public class Exemplo { ...

Próximas questões
Com base no mesmo assunto
Q914398 Programação

Analise o código Java a seguir.


public class Exemplo {

static class C {

static int a;

int b;

void metodo() {

System.out.println(String.format("%d %d" ,a, b ));

}

}

public static void main(String[] args) {

C myC1 = new C();

C myC2 = new C();

myC1.a=10;

myC2.b=20;

myC1.metodo();

myC2.metodo();

}

}


A execução desse código produz

Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Alternativa correta: C - as linhas “10 0” e “10 20”.

Para entender a questão, é importante ter conhecimento sobre variáveis estáticas e de instância em Java. A variável estática, declarada com a palavra-chave static, é uma variável de classe, o que significa que ela tem uma única cópia compartilhada entre todas as instâncias da classe. Por outro lado, uma variável de instância é específica para cada objeto e cada objeto terá sua própria cópia dessa variável.

Na classe interna C, a variável a é estática e a variável b é de instância. Quando o método metodo() é chamado, ele imprime os valores de ambas as variáveis.

Ao analisar o código fornecido, temos:

  • O objeto myC1 é criado e a variável estática a é definida como 10. Isso afeta todos os objetos da classe C, pois a é compartilhada entre eles.
  • O objeto myC2 é criado e a variável de instância b é definida como 20. Isso afeta apenas o objeto myC2, pois b é específica para cada instância.
  • O método metodo() é chamado em myC1, e como o valor de a é 10 (definido anteriormente) e b ainda não foi definido em myC1, ele imprime "10 0" porque o valor padrão para variáveis de instância numéricas é 0.
  • Quando metodo() é chamado em myC2, a variável estática a ainda é 10, pois foi definida através de myC1, e a variável de instância b é 20, como definido para myC2. Portanto, ele imprime "10 20".

Portanto, a sequência de impressões correta ao executar o código será "10 0" seguido por "10 20", o que justifica a corretude da Alternativa C.

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

A palavra chave static indica que o campo declarado pertence à classe. Portanto, qualquer modificação que ele sofra, surte efeito em todos os objetos da classe. Dessa forma, quando o código myC1.a=10; é executado, o valor de a na classe (e consequentemente para todos os seus objetos) passa a ser 10. Note que o mesmo não ocorre com o b.

 

OBS Importante: O próprio Java recomenda que os campos estáticos não sejam acessados através de referências de objetos (da forma que é feito na questão), pois não torna claro que as variáveis são de classe.

 

Alternativa Correta: Letra C

 

Fonte: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

Não esquecendo que podem haver classes internas como static, porém não classes externas.

 

O que pode ser estático:

Métodos;

Atributos; e

Classes aninhadas.

Pelo motivo da variável "a" ser "static",toda a classe C vai enxergar o valor 10 atribuído a ela, tanto C1 quanto C2, porque ambos pertencem à classe C. Por isso o valor de a permanece 10, tanto na linha 0 10, quanto na linha 10 20.

A variável "b" fica 0 na 1a.linha porque como ela não é static somente myC2 tem valor 20 para ela, então na 2a.linha será 10 20, somente quando chamo o metodo a partir de C2 aparece seu valor 20.

Só um pequeno detalhe:

 

Sempre que instanciar uma classe e tiver tipo primitivo, como o int, seu valor será "0", se for objeto Integer, seu valor será null.

 

Lembrando também que o que é static fica dispinível para todas as instâncias e não apenas a uma.

 

Go @ahead!!!

 

STATIC- Um objeto é uma instância de uma classe. nem sempre é desejável que objeto seja instanciado, pois a instanciação é o momento mais custoso em desempenho e memória.

logo, variaveis static sao inicializadas 1 vez e seu valor é fixo. por isso que static int a é sempre 10. se uma variavel de uma classe static nao for inicializada, seu valor inicial sera 0. quando for inicializada, seu valor sera o declarado. int b esta dentro de classe static e por isso é 0 a princpio. entao se tornou 20 em myC.b = 20;

uma classe static e variavel static sempre terao o mesmo valor. myC1.a recebeu 10.e este sera sempre seu valor para var a. se fizer myC2, myC3, myCn etc o system.out.printl de myC2, myC3, myCn etc sera sempre 10, mesmo sem declarar valor algum para a em myC2, myC3, myCn etc.

se outro valor for declarado para myC1.a (ou myC2, myC3 myCn etc) em compile time, o valor que predomina é o ultimo declarado. se firzer isso, por exemplo:

C myC1 = new C();

C myC2 = new C();

C myC3 = new C();

C myC4 = new C();

myC1.a=10;

myC1.a=666;

myC1.a = 777;

myC2.a=56452;

myC3.a=14;

myC3.a = 88;

myC1.a = 187;

o valor exibido para variavel static a em

myC1.metodo();

myC2.metodo();

myC3.metodo();

myC4.metodo();

sera sempre 187.

para var b, que nao foi declarada como static, ela tera o valor atual. myC2.b=20; sgnifica que sempre que myC2.b for executado, exibe 20. em myC1.b, sem valor algum, o valor padrao é 0. porque a classe é static, mas a var b nao é.

Static variables are initialized only once , at the start of the execution. These variables will be initialized first, before the initialization of any instance variables. A single copy to be shared by all instances of the class. A static variable can be accessed directly by the class name and doesn't need any object.

A static variable is initialized to 0 if no initial value is specified, and it retains the value across function calls.

https://stackoverflow.com/questions/8704423/when-are-static-variables-initialized

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo