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?
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.
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.
Ce sont les principaux facteurs impliqués:
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
}
}
Il y a quelques points à garder à l'esprit lors de la déclaration de valeurs de type primitif.
Elles sont:
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);
}
}
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
}
}
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.
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.
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.