Objet non initialisé vs objet initialisé à NULL

93

Je travaille en Java.

Je configure généralement certains objets en tant que tels:

public class Foo {
    private SomeObject someName;

    // do stuff

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

La question est la suivante: est- someNamece que dans cet exemple équivaut à null, comme dans je peux reliably for all objectssupposer que les objets non initialisés de vérification de null seront précis?

SnakeDoc
la source

Réponses:

115

Correct, les membres statiques et d'instance de type référence non explicitement initialisés sont définis nullpar Java. La même règle s'applique aux membres du groupe.

À partir de la spécification du langage Java , section 4.12.5:

Valeurs initiales des variables

Chaque variable d'un programme doit avoir une valeur avant que sa valeur ne soit utilisée:

Chaque variable de classe, variable d'instance ou composant de tableau est initialisé avec une valeur par défaut lors de sa création

[...] Pour tous les types de référence, la valeur par défaut est null.

Notez que la règle ci-dessus exclut les variables locales: elles doivent être initialisées explicitement, sinon le programme ne compilera pas.

dasblinkenlight
la source
comment cela s'applique-t-il, par exemple char,? Je peux faire char test;mais paschar test = null;
xorinzor
1
@xorinzor Vous ne pouvez pas attribuer nullà charparce qu'il est un type primitif. Vous ne pouvez pas non plus faire à l' char test;intérieur d'une méthode sans l'affecter testplus tard. Vous pouvez le faire char test='a'si vous le souhaitez ou le laisser comme char test;dans une déclaration de membre pour obtenir la valeur par défaut de '\0'.
dasblinkenlight
14

Si une Objectréférence a été déclarée mais non instanciée, sa valeur est null.

Jared Nielsen
la source
8
Uniquement en tant que champ d'instance d'une classe.
Sotirios Delimanolis
1
@SotiriosDelimanolis pouvez-vous élaborer s'il vous plaît?
J'essaye d'
5
@SnakeDoc Si ​​vous déclarez un objet dans un corps de méthode, vous obtiendrez une erreur de compilation si vous essayez de l'utiliser sans l'initialiser au préalable.
Sotirios Delimanolis
9
Cela vaut la peine d'être précis ici - vous ne déclarez jamais un objet. Vous déclarez une variable . Ce n'est pas la même chose.
Jon Skeet
7
@SotiriosDelimanolis désolé d'évoquer une discussion très ancienne, mais avez-vous une référence sur la raison pour laquelle ils ont décidé que cela devrait provoquer une erreur de compilation, plutôt que de simplement l'initialiser pour nullaimer un champ d'instance?
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");
              }   
            }
        }
Alexander Zaldostanov
la source