double
is a primitive type, while Double
is a class wrapper for double
.
Since double
is primitive, its default value will be 0
. On the other hand, Double
variables are objects, so their default value will be null
. This is noted in the JLS: Initial Values of Variables (emphasis mine):
Each class variable, instance variable, or array component is initialized with a default value when it is created(§15.9, §15.10):
For type byte, the default value is zero, that is, the value of (byte)0.
For type short, the default value is zero, that is, the value of (short)0.
For type int, the default value is zero, that is, 0.
For type long, the default value is zero, that is, 0L.
For type float, the default value is positive zero, that is, 0.0f.
For type double, the default value is positive zero, that is, 0.0d.
For type char, the default value is the null character, that is, '\u0000'.
For type boolean, the default value is false.
For all reference types (§4.3), the default value is null
This also applies for other primitives and their respective class wrappers:
int
and Integer
long
and Long
float
and Float
boolean
and Boolean