- 函数中的成员是必须要初始化的 否则会编译出错。
void f() {
int i;
i++; // 编译出错
}
2.类中的成员变量可以不初始化,会自动给出一个初始化值。
3.构造函数初始化
public class Counter {
int i;
Counter() { i = 7; }
}
i会被初始化2次,第一次被初始化为0,第二次为7.
4.初始化的顺序
成员变量的初始化在任何方法(即使是构造函数)调用之前。
class Window {
Window(int marker) {
print("Window(" + marker + ")");
}
}
class House {
Window w1 = new Window(1); // Before constructor
House() {
// Show that we’re in the constructor:
print("House()");
w3 = new Window(33); // Reinitialize w3
}
Window w2 = new Window(2); // After constructor
void f() {
print("f()");
}
Window w3 = new Window(3); // At end
}
public class OrderOfInitialization {
public static void main(String[] args) {
House h = new House();
h.f(); // Shows that construction is done
}
}
/* Output:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
在上例中W3被初始化2次。一次在构造函数前,(第一次的初始化会被gc回收)
W3如此初始化的坏处:
(1) 效率不高
(2) 如果有覆盖的构造函数没有初始化W3,就会出现初始化与default初始化不一致的问题。
5. 静态数据初始化
不论有多少个对象被创造,static变量都存储在一个静态存储区域.static不能作为局部变量的关键字
6.显示的静态数据初始化
public class Spoon {
static int i;
static {
i = 47;
}
}
7.非静态实例初始化
{
mug1 = new Mug(1);
mug2 = new Mug(2);
print("mug1 & mug2 initialized");
}
代码结构与static就差一个static关键字,称之为匿名内部类初始化,其在构造函数之前初始化.
8.数组初始化
编译器不允许你告诉他这个数组多大.为了给数组创建一个存储空间,一定要初始化一个表达式为一个数组.
int[] a1={1,2,3};
int[] a2;
a2=a1;
该程序a1和a2指向同一个对象,不论谁改动,都会影响另一个。