初始化
- 在类中变量定义的顺序决定了它们初始化的顺序。即使变量定义散布在方法定义之间,它们仍会在任何方法(包括构造器)被调用之前得到初始化,如下:
输出结果:
- 静态变量初始化:
- 初始化的顺序先是静态对象(如果它们之前没有被初始化),然后是非静态对象。且静态对象只有当是第一次访问时才会被初始化,此后,再次创建访问静态对象不会再次被初始化。
- 同一个对象无论被创建了多少次,其中的静态数据都只占用一份存储区域,故static关键字不能应用于局部变量,只能作用于属性(字段、域)。
public class DataTest {
DataTest(int i){
System.out.println("DataTest("+i+")");
}
void f1(int dataTest){
System.out.println("f1("+dataTest+")");
}
static class House{
static DataTest test = new DataTest(1);
House(){
System.out.println("House()");
test2.f1(1);
}
void f2(int test){
System.out.println("f2("+test+")");
}
static DataTest test2 = new DataTest(2);
}
static class Cup{
DataTest test3 = new DataTest(3);
static DataTest test4 = new DataTest(4);
Cup(){
System.out.println("Cup()");
test4.f1(2);
}
void f3(int i){
System.out.println("f3("+i+")");
}
static DataTest test5 = new DataTest(5);
}
public static class Test{
public static void main(String[] args){
System.out.println("main creating new Cup()");
new Cup();
System.out.println("main creating new Cup()");
new Cup();
house.f2(1);
cup.f3(1);
}
static House house = new House();
static Cup cup = new Cup();
}
}
上述代码输出结果:
DataTest(1)
DataTest(2)
House()
f1(1)
DataTest(4)
DataTest(5)
DataTest(3)
Cup()
f1(2)
main creating new Cup()
DataTest(3)
Cup()
f1(2)
main creating new Cup()
DataTest(3)
Cup()
f1(2)
f2(1)
f3(1)
清理回收
- 对象可能不被垃圾回收。
- 垃圾回收不等同于析构。
- 垃圾回收只与内存有关。
JVM垃圾回收机制见之后博客。