web-dev-qa-db-fra.com

Valeurs par défaut et initialisation dans Java

Selon mon référence , les types primitifs ont des valeurs par défaut et les objets sont nuls. J'ai testé un morceau de code.

public class Main {
    public static void main(String[] args) {
        int a;
        System.out.println(a);
    }
}

La ligne System.out.println(a); sera une erreur pointant sur la variable a qui indique variable a might not have been initialized alors que dans la référence donnée, integer aura 0 par défaut. Cependant, avec le code donné ci-dessous, il imprimera réellement 0.

public class Main {
    static int a;
    public static void main(String[] args) {
        System.out.println(a);
    }
}

Qu'est-ce qui pourrait mal tourner avec le premier code? Est-ce que la classe exemple variable se comporte-t-elle différemment des variables locales?

68
Michael Ardan

Dans le premier exemple de code, a est une variable locale de la méthode main. Les variables locales de la méthode doivent être initialisées avant de les utiliser.

Dans le deuxième exemple de code, a est une variable de membre de classe et sera par conséquent initialisée à la valeur par défaut.

63
Juned Ahsan

Lisez plus attentivement votre référence :

Valeurs par défaut

Il n'est pas toujours nécessaire d'attribuer une valeur lorsqu'un champ est déclaré. Les champs déclarés mais non initialisés seront définis par défaut par le compilateur. En règle générale, cette valeur par défaut sera zéro ou null, en fonction du type de données. Cependant, s’appuyer sur de telles valeurs par défaut est généralement considéré comme un mauvais style de programmation.

Le tableau suivant récapitule les valeurs par défaut pour les types de données ci-dessus.

. . .

Les variables locales sont légèrement différentes; le compilateur n'affecte jamais une valeur par défaut à une variable locale non initialisée. Si vous ne pouvez pas initialiser votre variable locale où elle est déclarée, assurez-vous de lui attribuer une valeur avant d'essayer de l'utiliser. L'accès à une variable locale non initialisée entraînera une erreur lors de la compilation.

59
Paolo

Ce sont les principaux facteurs impliqués:

  1. variable membre (OK par défaut)
  2. variable statique (OK par défaut)
  3. variable membre final (non initialisée, doit être définie sur le constructeur)
  4. variable statique finale (non initialisée, doit être définie sur un bloc statique {})
  5. variable locale (non initialisée)

Remarque 1: vous devez initialiser les variables de membre final sur CHAQUE constructeur implémenté!

Remarque 2: vous devez initialiser les variables de membre final à l'intérieur du bloc du constructeur lui-même, sans appeler une autre méthode qui les initialise. Par exemple, ceci n'est PAS valide:

private final int memberVar;

public Foo() {
    //invalid initialization of a final member
    init();
}

private void init() {
    memberVar = 10;
}

Remarque 3: les tableaux sont des objets en Java, même s'ils stockent des primitives.

Remarque 4: lorsque vous initialisez un tableau, tous ses éléments sont définis par défaut, qu'ils soient membres ou qu'ils soient locaux.

Je joins un exemple de code présentant les cas susmentionnés:

public class Foo {
    //static and member variables are initialized to default values

    //primitives
    private int a; //default 0
    private static int b; //default 0

    //objects
    private Object c; //default NULL
    private static Object d; //default NULL

    //arrays (Note: they are objects too, even if they store primitives)
    private int[] e; //default NULL
    private static int[] f; //default NULL

    //what if declared as final?

    //primitives
    private final int g; //not initialized, MUST set in constructor
    private final static int h; //not initialized, MUST set in a static {}

    //objects
    private final Object i; //not initialized, MUST set in constructor
    private final static Object j; //not initialized, MUST set in a static {}

    //arrays
    private final int[] k; //not initialized, MUST set in constructor
    private final static int[] l; //not initialized, MUST set in a static {}

    //initialize final statics
    static {
        h = 5;
        j = new Object();
        l = new int[5]; //elements of l are initialized to 0
    }

    //initialize final member variables
    public Foo() {
        g = 10;
        i = new Object();
        k = new int[10]; //elements of k are initialized to 0
    }

    //A second example constructor
    //you have to initialize final member variables to every constructor!
    public Foo(boolean aBoolean) {
        g = 15;
        i = new Object();
        k = new int[15]; //elements of k are initialized to 0
    }

    public static void main(String[] args) {
        //local variables are not initialized
        int m; //not initialized
        Object n; //not initialized
        int[] o; //not initialized

        //we must initialize them before usage
        m = 20;
        n = new Object();
        o = new int[20]; //elements of o are initialized to 0
    }
}
14
Kostas Chalkias

Il y a quelques points à garder à l'esprit lors de la déclaration de valeurs de type primitif.

Elles sont:

  1. Les valeurs déclarées dans une méthode ne recevront pas de valeur par défaut.
  2. Les valeurs déclarées en tant que variable instancielle ou variable statique se verront attribuer des valeurs par défaut qui sont 0.

Donc dans votre code:

public class Main {
    int instanceVariable;
    static int staticVariable;
    public static void main(String[] args) {
        Main mainInstance = new Main() 
        int localVariable;
        int localVariableTwo = 2;
        System.out.println(mainInstance.instanceVariable);
        System.out.println(staticVariable);
       // System.out.println(localVariable); //will throw compilation error
        System.out.println(localVariableTwo);

    }
}
6
Pritam Banerjee

oui, la variable d'instance sera initialisée à la valeur par défaut, pour la variable locale, vous devez l'initialiser avant de l'utiliser

public class Main {
      int instaceVariable; // Instance variable will be initalized to default value
    public static void main(String[] args) {
        int localVariable = 0; // Local Variable Need to initalize before use
    }
}
2
upog

Les variables locales ne reçoivent pas les valeurs par défaut. Leurs valeurs initiales sont indéfinies sans assigner des valeurs par certains moyens. Avant de pouvoir utiliser des variables locales, elles doivent être initialisées.

Il y a une grande différence lorsque vous déclarez une variable au niveau de la classe (en tant que membre, par exemple, en tant que champ) et au niveau de la méthode.

Si vous déclarez un champ au niveau de la classe, ils obtiennent les valeurs par défaut en fonction de leur type. Si vous déclarez une variable au niveau de la méthode ou sous la forme d'un bloc (aucun code à l'intérieur de {}), n'obtenez aucune valeur et restez indéfinie jusqu'à l'obtention d'une valeur de départ, c'est-à-dire une valeur qui lui est affectée.

1
Ani

Toutes les variables membres doivent être chargées dans le tas, elles doivent donc être initialisées avec les valeurs par défaut lors de la création d'une instance de classe. Dans le cas de variables locales, elles ne sont pas chargées dans la pile, elles sont stockées dans la pile avant d'être utilisées avant Java 7. Nous devons donc les initialiser explicitement.

0
newuser

Dans Java, l'initialisation par défaut ne s'applique qu'à la variable d'instance du membre de la classe, elle ne s'applique pas aux variables locales.

0
ramesh