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
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 ?
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.
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