所有成员都要初始化:
1. Java尽力保证所有变量都能在使用前得到正确的初始化。若被定义成相对于一个方法的“局部”变量,这一保证就通过编译期的出错提示表现出来。
2. 基本类型的情况这是不同的,一个类的所有基本类型的数据成员都会保证获得一个初始值。即使作为局部变量,也是如此。
3. 类中定义一个对象的引用时,如果不将其初始化,则自动初始化为null。
指定初始化:
对某个变量赋初值,可以直接在定义的地方为其赋值,这和C++很不一样。
构造器初始化:
可以利用构造器来进行初始化,但构造器被调用前,自动初始化已经进行了。自动初始化的顺序与变量定义的顺序相同。
比如下面的代码:
class Counter {
int i;
Counter() { i = 7; }
// . . .
i先自动初始化为0,然后变为7。
静态变量的初始化在第一次创建一个对象或是第一次访问静态数据时进行。
显式的静态初始化:
可以将多个静态初始化语句组织成一个特殊的静态句子。
像下面的例子:
class Spoon {
static int i;
static {
i = 47;
}
// . . .
非静态实例初始化:
与显式的静态初始化的语句一样,只不过少了static关键字。
Mug c1;
Mug c2;
{
c1 = new Mug(1);
c2 = new Mug(2);
}
最后也是最重要的,初始化的顺序:
父静态->子静态->父非静->父构造方法->子非静->子构造方法
数组的初始化:
下面的代码可以看出与C++的不同之处。
int[] a1 = { 1, 2, 3, 4, 5 };
int[] a2;
a2 = a1;
Java中可以将一个数组赋值给另一个数组,其实质只是复制了一个引用。
在Java中,一旦下标越界,就会出现运行时错误(异常),而不会错误的访问其他的内存。
对于基本类型int[] a=new int[20];完成了对数组的初始化,所有元素被置为默认值0。
而对于非基本类型来说,实际只是创建了一个引用数组,还需要给每个引用创建新对象并赋值才算初始化完成。
如果忘记了创建对象,而引用了数组中的空引用,就会出现运行时异常。
也可以使用花括号括起来的列表来初始化对象数组,有下面两种形式:
Integer[] a = {
new Integer(1),
new Integer(2),
new Integer(3),
};
Integer[] b = new Integer[] {
new Integer(1),
new Integer(2),
new Integer(3),
};
初始化列表的最后一个逗号是可选的,第二种形式明显更加灵活。