java编程思想笔记(五): 初始化与清理

成员初始化

默认、指定初始化

类的成员如果没有指定会默认初始化,基本类型初始化为默认值,引用初始化为null。也可以通过定义显示初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class InitialValues {
boolean bool = true;
boolean bool1; // 默认为 false
char ch = 'x';
char ch1; // 默认初始化为 空
byte b = 47;
short s = 0xff;
int i = 999;
long lng = 1;
float f = 3.14f;
double d = 3.14159;
String a; // 默认初始化为null
} ///:~

初始化块

可以通过{}初始化块初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Initial{
int a = 1;
double b;
Initial(){}
{
System.out.println("执行初始化块");
a = 2;
b = 3.5;
}
public static void main(String[] args){
Initial v = new Initial();
System.out.println("a: " + a);
}
}/* output:
执行初始化块
a: 2
*/

静态数据初始化

静态数据的初始化与非静态数据类似,static初始化块需要用static修饰。下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class InitialValues3 {
int a = 3;
double b;
InitialValues3(){
System.out.println("InitialValues3() 构造器");
}
{
System.out.println("执行非静态初始化块");
a = 1;
b = 3.5;
}

static {
System.out.println("执行静态初始化块");
c = 100;
}
static int c = 10;

public static void main(String[] args){
System.out.println("c: " + InitialValues3.c);
InitialValues3 v1 = new InitialValues3();
System.out.println("a: " + v1.a);
InitialValues3 v2 = new InitialValues3();
System.out.println("a: " + v2.a);

}
}/*output:
执行静态初始化块
c: 100
执行非静态初始化块
InitialValues3() 构造器
a: 1
执行非静态初始化块
InitialValues3() 构造器
a: 1
*/

在通过InitialValues3.c 访问静态变量c时,会先初始化c,此时并没有创建InitialValues3的对象实例。静态变量初始化一次后,不需要再调用。

构造器初始化

构造器初始化在成员初始化之后。

对象创建过程

综上,假设有一个Dog类,对象创建的过程如下:

  1. 构造器实际上是静态方法,当首次创建Dog对象,或者Dog类的静态方法、域首次访问时,java解释器会查找类路径,定位Dog.class文件。
  2. 加载Dog.class文件(创建Class对象), 将Dog类的静态域初始化(静态存储区中),所以静态初始化只在类加载时初始化一次。
  3. 用new Dog()创建对象时,根据类内域的声明首先在堆上分配足够的存储空间。
  4. 将存储区域清零。
  5. 按顺序执行各种定义处的初始化。
  6. 执行构造器