Objeto no inicializado frente a objeto inicializado a NULL


93

Estoy trabajando en Java.

Normalmente configuro algunos objetos como tales:

public class Foo {
    private SomeObject someName;

    // do stuff

    public void someMethod() {
        if (this.someName != null) {
            // do some stuff
        }
    }
}

La pregunta es: someNameen este ejemplo, ¿se equipara a null, ya que puedo reliably for all objectsasumir que los objetos no inicializados de verificación nula serán precisos?

Respuestas:


115

Correcto, tanto los miembros estáticos como los miembros de instancia del tipo de referencia no inicializados explícitamente están configurados nullpor Java. La misma regla se aplica a los miembros de la matriz.

De la especificación del lenguaje Java , sección 4.12.5:

Valores iniciales de variables

Cada variable en un programa debe tener un valor antes de que se use su valor:

Cada variable de clase, variable de instancia o componente de matriz se inicializa con un valor predeterminado cuando se crea

[...] Para todos los tipos de referencia, el valor predeterminado es null.

Tenga en cuenta que la regla anterior excluye las variables locales: deben inicializarse explícitamente, de lo contrario, el programa no se compilará.


¿Cómo se aplica esto a, por ejemplo char,? Puedo hacerlo char test;pero nochar test = null;
xorinzor

1
@xorinzor No se puede asignar nulla charporque es un tipo primitivo. Además, no puede hacer char test;dentro de un método sin asignar testmás adelante. Puede hacerlo char test='a'si lo desea, o dejarlo como char test;en una declaración de miembro para obtener el valor predeterminado de '\0'.
dasblinkenlight

14

Si una Objectreferencia ha sido declarada pero no instanciada, su valor es null.


8
Solo como campo de instancia de una clase.
Sotirios Delimanolis

1
@SotiriosDelimanolis, ¿podrías darnos más detalles? Estoy tratando de aprender :)
SnakeDoc

5
@SnakeDoc Si ​​declaras un objeto en el cuerpo de un método, obtendrás un error de compilación si intentas usarlo sin inicializarlo primero.
Sotirios Delimanolis

9
Vale la pena ser preciso aquí: nunca declaras un objeto. Declaras una variable . No son lo mismo.
Jon Skeet

7
@SotiriosDelimanolis lamento traer una discusión realmente antigua, pero ¿tiene una referencia de por qué decidieron que debería causar un error de compilación, en lugar de simplemente hacer que se inicialice nullcomo un campo de instancia?
childofsoong

-1
namespace Design
     {
              class Program
              {

                static void Main(string[] args)
                {
                  Logger obj1;   // By Default, the value of obj1 is null
                  Logger obj2 = new Logger();  // By Default the value of obj2 is 
                                               // Design.Logger which is not null
                  Console.WriteLine(obj2); 
                  Console.Read();
                }
              }

     class Logger
           {
             public Logger()
              {
                 Console.writeline("Called");
              }   
            }
        }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.