Default values and initialization in Java
Solution 1
In the first code sample, a
is a main
method local variable. Method local variables need to be initialized before using them.
In the second code sample, a
is class member variable, hence it will be initialized to the default value.
Solution 2
Read your reference more carefully:
Default Values
It's not always necessary to assign a value when a field is declared. Fields that are declared but not initialized will be set to a reasonable default by the compiler. Generally speaking, this default will be zero or null, depending on the data type. Relying on such default values, however, is generally considered bad programming style.
The following chart summarizes the default values for the above data types.
. . .
Local variables are slightly different; the compiler never assigns a default value to an uninitialized local variable. If you cannot initialize your local variable where it is declared, make sure to assign it a value before you attempt to use it. Accessing an uninitialized local variable will result in a compile-time error.
Solution 3
These are the main factors involved:
- member variable (default OK)
- static variable (default OK)
- final member variable (not initialized, must set on constructor)
- final static variable (not initialized, must set on a static block {})
- local variable (not initialized)
Note 1: you must initialize final member variables on every implemented constructor!
Note 2: you must initialize final member variables inside the block of the constructor itself, not calling another method that initializes them. For instance, this is not valid:
private final int memberVar;
public Foo() {
// Invalid initialization of a final member
init();
}
private void init() {
memberVar = 10;
}
Note 3: arrays are Objects in Java, even if they store primitives.
Note 4: when you initialize an array, all of its items are set to default, independently of being a member or a local array.
I am attaching a code example, presenting the aforementioned cases:
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 the 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 use
m = 20;
n = new Object();
o = new int[20]; // Elements of o are initialized to 0
}
}
Solution 4
There are a few things to keep in mind while declaring primitive type values.
They are:
- Values declared inside a method will not be assigned a default value.
- Values declared as instance variables or a static variable will have default values assigned which is 0.
So in your 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 a compilation error
System.out.println(localVariableTwo);
}
}
Solution 5
Yes, an instance variable will be initialized to a default value. For a local variable, you need to initialize before use:
public class Main {
int instaceVariable; // An instance variable will be initialized to the default value
public static void main(String[] args) {
int localVariable = 0; // A local variable needs to be initialized before use
}
}
![Michael 'Maik' Ardan](https://i.stack.imgur.com/2o5nv.png?s=256&g=1)
Comments
-
Michael 'Maik' Ardan almost 2 years
Based on my reference, primitive types have default values and Objects are null. I tested a piece of code.
public class Main { public static void main(String[] args) { int a; System.out.println(a); } }
The line
System.out.println(a);
will be an error pointing at the variablea
that saysvariable a might not have been initialized
whereas in the given reference,integer
will have0
as a default value. However, with the given code below, it will actually print0
.public class Main { static int a; public static void main(String[] args) { System.out.println(a); } }
What could possibly go wrong with the first code? Do class variables behave different from local variables?
-
Yahya Uddin almost 9 yearsI read this too, but what about arrays. arrays used in a local context are given a default value but there is no mention of it in the docs.
-
gcbound over 8 yearsThere's a good explanation of arrays in local context as the accepted answer here: stackoverflow.com/questions/13511702/int-array-initialization
-
Androidcoder over 3 yearsI notice method local array variables do not give the 'variable a might not have been initialized' when used. Are method variables declared as arrays initialized to a default while standalone variables are not?
-
Peter Mortensen over 3 yearsWhat is the default value in this case? Null of some sort?
-
Juned Ahsan over 3 years@PeterMortensen Primitives don't use null as the default value. They use a legit value for the primitive as default such as 0 for int. Full details can be found here : docs.oracle.com/javase/tutorial/java/nutsandbolts/…