Duvida

Alguem poderia me explicar porque a resposta é 0 na questão abaixo ?
Não deveria retornar 5 ou então dizer que y não foi inicializada ?

O que acontecerá quando compilar e executar o seguinte programa:

Public class MyClass{

private static int x = getValue();

private static int y = 5;

private static int getValue(){

return y;

}

public static void main(String[] args){

System.out.println(x);

}

}

A) Erro de compilação devido a restrição de acesso de variáveis private de MyClass.

B) Erro de compilação devido a forma como a referencia é enviada pelo metodo getValue();

C) imprime 0

D) Erro de compilação devido ao envio de referencia de um atributo static y

E) Imprime 1

Afinal tudo bem 5 é static é o defaul seria 0, entretanto o getValue é chamado antes da declaração do y como statico.
Por acaso o java priomeiro le as declarações antes de iniciar o programa ?

[quote=rogeriosantos77]Afinal tudo bem 5 é static é o defaul seria 0, entretanto o getValue é chamado antes da declaração do y como statico.
Por acaso o java priomeiro le as declarações antes de iniciar o programa ?[/quote]

Ele lê primeiro os blocos estáticos da aplicação.
Por isso ele leu primeiro o getValue e retornou o valor de 0

eu tenho maior duvida nesse codigo… achei que nao compilava… mais o resultado é 0? nao conseguir entender… o pq… tb. aff q confusao…

Mas se ele lê primeiro os blocos estáticos, a declaração das variáeis como estáticas deveriam ser feitas primeiro, logo a variável “y” deveria receber de cara o valor 5.

Olhem a explicação do livro de certificação :

“Repare que a declaração da variável X é valida. A primeira instrução a ser chamada será “x=getValue;”. Mas note que getValue() irá retornar 0, porque y = 5 não fora chamada antes de “x = getValue();”. Se “y = 5;” tivesse sido chamado antes da declaração de x, 5 seria retornado. Portando 0 (valor-padrao de inteiros) será impresso na ida padrão”.

eu penso assim : 0 é padrão de int somente quando ela é static, então se eu tento usar a variavel antes da declaração, deveria ocorrer erro.
Ja que a declaração e a inicialização ocorrem juntas a maquina virtual não deveria visualizar o 5 ja de inicio ?
Como a maquina virtual trata isso ?

A ordem que precisa entender pra essa questão é:

Quando a classe é carregada, primeiro as variáveis recebem o valor padrão. Em seguida, as inicializações explícitas (como y = 5) e os blocos estáticos na ordem que aparecem.

Quando a classe foi carregada, x recebeu 0 e y recebeu 0. Em seguida, está na hora de fazer as inicializações, então x recebe getValue() (note que y ainda é zero nesse momento), que retornará o valor de y (zero). Em seguida, y recebe 5 e, finalmente, o main exibe o valor de x (zero).

Se vc trocar a ordem da inicialização, colocar y = 5 antes de x = getValue(); verá que o resultado será 5 (pois primeiro o y foi inicializado e depois o x).

[quote=rogeriosantos77]Mas se ele lê primeiro os blocos estáticos, a declaração das variáeis como estáticas deveriam ser feitas primeiro, logo a variável “y” deveria receber de cara o valor 5.

Olhem a explicação do livro de certificação :

“Repare que a declaração da variável X é valida. A primeira instrução a ser chamada será “x=getValue;”. Mas note que getValue() irá retornar 0, porque y = 5 não fora chamada antes de “x = getValue();”. Se “y = 5;” tivesse sido chamado antes da declaração de x, 5 seria retornado. Portando 0 (valor-padrao de inteiros) será impresso na ida padrão”.

eu penso assim : 0 é padrão de int somente quando ela é static, então se eu tento usar a variavel antes da declaração, deveria ocorrer erro.
Ja que a declaração e a inicialização ocorrem juntas a maquina virtual não deveria visualizar o 5 ja de inicio ?
Como a maquina virtual trata isso ?
[/quote]

primeiro: 0 é padrão de qualquer variavel de instancia inteira ou long ou short … seja static ou não.

a verdade é que y é antes de rodar qualquer código da classe, y já existe como variável de classe e foi atribuida com o valor default 0. Como getValue() foi chamado antes de atribuir 5 a y, atribuiu 0 que é o valor padrão.

não compilaria se fossem variáveis locais

primeiro: 0 é padrão de qualquer variavel de instancia inteira ou long ou short … seja static ou não.

então se o padrão é 0, porque que quando ela não é static e vc não inicializa o Java retorna erro ?

Isto compila

		  static int i;
		  public static void main(String[] args){
			  System.out.println(i);
		  }

Isto não compila

		  public static void main(String[] args){

int i;
System.out.println(i);
}

[quote=rogeriosantos77]

primeiro: 0 é padrão de qualquer variavel de instancia inteira ou long ou short … seja static ou não.

então se o padrão é 0, porque que quando ela não é static e vc não inicializa o Java retorna erro ?

Isto compila

		  static int i;
		  public static void main(String[] args){
			  System.out.println(i);
		  }

Isto não compila

		  public static void main(String[] args){

int i;
System.out.println(i);
}[/quote]

simplesmente porque você está confundindo variavel de instancia com variável local…

o que não compila no seu código é uma variável local… e não de instância… se quiser uma de instância, apenas retire os modificadores static e no Main crie uma nova instância da classe… verá que o resultado é o mesmo

Valeu gente,
Agora faz sentido. caiu a ficha

heheh entendi… boa… questao mesmo… maior fumo essa viu :smiley:

Poderia criar um bloco static, e dentro dele declarar a variáveis e atribuir seus respectivos valores.

static
{
int x,y;
x=1;
y=5;
}