实例初始化

java面向对象程序设计提供一种机制，在实例化每个对象的时候对该对象的成员进行初始化处理。这种初始化是通过构造器（构造函数）来实现。一个新对象的初始化（new 操作）的最终步骤是去调用一个叫做构造函数的方法。 构造函数是由下面两个规则所确认的：

方法名称必须与类名称完全相匹配。

对于方法，不要声明返回类型。

1. public class Xyz {

2. // member variables go there

3. public Xyz() {

4. // set up the object.

5. }

6. public Xyz(int x) {

7. // set up the object with a parameter

8. }

9. }

10. public class Xyz {

11. // member variables

12. public Xyz() { // No-arg constructor

13. // set up the object.

14. }

15. public Xyz(int x) { //int-arg constructor

16. // set up the object using the parameter x.

17. }

18. }

## 初始化顺序

在一个类里，初始化的顺序是由变量在类内的定义顺序决定的。即使变量定义大量遍布于方法定义的中间，那些变量仍会在调用任何方法之前得到初始化而且在构建器调用之前。初始化实例变量后，再调用构造函数初始化实例对象。

同时由于所有静态变量和静态块只初始化一次。就是在类加载的时候初始化。所以类成员要先于实例成员初始化。

例如：

1. //: InitializationOrder.java

2. class test1 {

3. test1(int marker) {

4. System.out.println("test(" + marker + ")");

5. }

6. }

7.

8. class test2 {

9. public static int i = 1;

10. test1 t1 = new test1(1); // 这个在构造函数前

11. test2() {

12. // 构造函数里面输出

13. System.out.println("test2()");

14. t3 = new Tag(33); // 重新初始化t3句柄

15. }

16. test1 t2 = new test1 (2); // 构造函数后

17. void f() {

18. System.out.println("f()");

19. }

20. test1 t3 = new test1 (3);

21. static{

22. System.out.println("test2.i = " + i );

23. i = 7;

24. }

25.

26. }

27.

28. public class InitializationOrder {

29. public static void main(String[] args) {

30. test2 t = new test2();

31. t.f(); // 指示构造完毕

32. }

33. }

在test2中，test1对象的定义故意到处散布，以证明它们全都会在构建器进入或者发生其他任何事情之前得到初始化。除此之外，t3在构建器内部得到了重新初始化。它的输入结果如下：

test2.i = 1

test1 (1)

test1 (2)

test1 (3)

test2()

test2(33)

f()

我们可以在类中定义的时候，还使用static初始化程序和实例初始化程序来为类和实例成员提供初始化数值：

class BedAndBreakfast {

static final int MAX_CAPACITY = 10;

static int i = 1;

static {

i = 47;

}

boolean full = false;

}

这个对于原始数据类型是没有问题的。有时候，它可以用在创建数组和对象。但是这个初始化表单有它的限制，如下：

1) 初始化程序只可以执行用赋值语句表达的初始化 。

2) 初始化程序不能调用任何的包含异常错误的方法。

3) 如果初始化程序调用一个包含异常错误的方法，它不能进行错误恢复。

如果你有一些初始化要完成，可能有些不能在初始化程序实现，因为出现了上面的限制之一，这时你不得不将初始化代码随意放置了。为了初始化类成员，在static初始化块中放置初始化代码。为了初始化实例成员，就要在构造函数中放置初始化代码了。