Eu tenho as seguintes duas variáveis de objeto
Date a;
Date b=null;
Definitivamente, 'a' e 'b' não estão se referindo a nenhum objeto.
Agora, se eu chamar a seguinte declaração
System.out.println(a.toString());
Haverá um erro de tempo de compilação, enquanto que se eu chamar a seguinte instrução
System.out.println(b.toString());
Não haverá erro de tempo de compilação, mas haverá um erro de tempo de execução. Qual é o motivo disso e qual valor será realmente armazenado em 'b' para representar um valor nulo?
Respostas:
Isso ocorre porque o estado das variáveis locais é controlado dentro de seu escopo
O que não é o caso dos campos
Agora, por que é bom definir uma variável como nula e usá-la imediatamente? talvez esse seja um erro histórico que às vezes leva a erros horríveis
Agora, qual é a diferença semântica?
apenas declara a variável que pode conter uma referência que aponta para um objeto do tipo
Date
, no entantofaz exatamente o mesmo, mas a referência está apontando para null desta vez, null é como qualquer referência, ocupa um espaço de um ponteiro nativo, que é de 4 bytes em máquinas de 32 bits e 8 bytes em máquinas de 64 bits
fonte
Não há diferença para os campos de classe. Eles são
null
por padrão para objetos, 0 para valores numéricos efalse
para booleanos.Para variáveis declaradas nos métodos - Java requer que elas sejam inicializadas. Não inicializá-los causa um erro de tempo de compilação quando são acessados.
Qual o motivo? Os campos de classe podem ser modificados por qualquer método. Em qualquer ordem, o método é chamado. Todos os campos não privados podem ser modificados por outras classes e / ou classes que estendem essa classe. Portanto, não faz sentido notificar sobre uma variável não inicializada, pois ela pode ser atribuída em muitos, muitos lugares.
Variáveis dentro de métodos, no entanto, são locais e podem ser modificadas apenas dentro do próprio método. Portanto, é possível e racional apontar possíveis erros. E o compilador tenta fazer isso. Se souber que o campo não foi inicializado, ele mostrará um erro, porque nunca é isso que você deseja. Se não tiver certeza - será emitido um aviso para que você possa ter certeza.
fonte