Ditto en Bill K. agrego:
El compilador de Java puede proteger de lastimarse a sí mismo al no establecer una variable antes de usarla dentro de una función. Por lo tanto, explícitamente NO establece un valor predeterminado, como lo describe Bill K.
Pero cuando se trata de variables de clase, sería muy difícil para el compilador hacer esto por usted. Una variable de clase podría ser establecida por cualquier función en la clase. Sería muy difícil para el compilador determinar todas las órdenes posibles en las que se podrían llamar las funciones. Por lo menos, tendría que analizar todas las clases en el sistema que llaman a cualquier función en esta clase. Bien podría tener que examinar los contenidos de cualquier archivo de datos o base de datos y de alguna manera predecir qué entradas harán los usuarios. En el mejor de los casos, la tarea sería extremadamente compleja, en el peor imposible. Entonces, para las variables de clase, tiene sentido proporcionar un valor predeterminado confiable. Ese valor predeterminado es, básicamente, llenar el campo con bits de cero, por lo que obtienes nulo para referencias, cero para enteros, falso para booleanos, etc.
Como dice Bill, definitivamente NO debes tener el hábito de automáticamente inicializando variables cuando las declaras. Solo inicialice las variables en el momento de la declaración si esto realmente tiene sentido en el contexto de su programa. Por ejemplo, si el 99% del tiempo desea que x sea 42, pero dentro de alguna condición IF, puede descubrir que este es un caso especial y x debería ser 666, entonces está bien, comience con "int x = 42;" y dentro del IF anula esto. Pero en el caso más normal, donde se calcula el valor según las condiciones, no se inicialice en un número arbitrario. Simplemente llénelo con el valor calculado.Entonces, si comete un error de lógica y no puede establecer un valor bajo una combinación de condiciones, el compilador puede decirle que ha cometido un error en lugar del usuario.
PS He visto una gran cantidad de programas de hoja de metal que dicen cosas como:
HashMap myMap=new HashMap();
myMap=getBunchOfData();
Por qué crear un objeto para inicializar la variable cuando se sabe que se va rápidamente a lanzar este objeto fuera una milésima de segundo más tarde? Eso es solo una pérdida de tiempo.
Editar
Para tomar un ejemplo trivial, supongamos que escribió esto:
int foo;
if (bar<0)
foo=1;
else if (bar>0)
foo=2;
processSomething(foo);
Esto generará un error en tiempo de compilación, porque el compilador dará cuenta de que cuando la barra == 0, nunca pones foo, pero luego tratas de usarlo.
Pero si inicializar foo a un valor ficticio, como
int foo=0;
if (bar<0)
foo=1;
else if (bar>0)
foo=2;
processSomething(foo);
A continuación, el compilador ver que no importa cuál es el valor de la barra, foo se establece en algo, por lo que no va a producir un error. Si lo que realmente quieres es que foo sea 0 cuando la barra es 0, entonces está bien. Pero si lo que realmente sucedió es que quisiste decir que una de las pruebas es < = o> = o si quisiste incluir una última cosa para cuando bar == 0, entonces has engañado al compilador para que no detecte tu error. Y, por cierto, así es como creo que una construcción así es un pobre estilo de codificación: el compilador no solo no está seguro de lo que pretendía, sino que tampoco puede hacerlo un programador de mantenimiento en el futuro.
¿Por qué se tomó esta decisión? ¿Por qué no simplemente los inicias en 'null' como variables de clase? –
Quizás para un mejor código/legibilidad? –
Hay muchas preguntas de stackoverflow sobre por qué las variables locales no tienen valores predeterminados. p.ej. http://stackoverflow.com/questions/415687/why-are-local-variables-not-initialized-in-java –