Analise o código Java a seguir. public class Exemplo { ...
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
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