您的位置:首页 > 编程语言 > Java开发

关于静态数据的初始化顺序问题

2016-02-20 12:23 555 查看
//代码如下,摘自java编程思想:

class Bowl {
Bowl(int maker) {
System.out.println("Bowl(" + maker + ")");
}
void f1(int maker) {
System.out.println("f1(" + maker + ")");
}
}

class Table {
static Bowl bowl1 = new Bowl(1);
Table() {
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int maker) {
System.out.println("f2(" + maker + ")");
}
static Bowl bowl2 = new Bowl(2);
}

class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard()");
bowl4.f1(2);
}
void f3(int maker) {
System.out.println("f3(" + maker + ")");
}
static Bowl bowl5 = new Bowl(5);
}

public class StaticInitialization {
public static void main(String[] args) {
System.out.println("Creating new Cupboard() in main");
new Cupboard();
System.out.println("Creating new Cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}

*output:*

Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)


要了解静态存储区域是何时初始化的。人人都知道一个程序是从main()方法开始的,但是如果直接着手main方法开始进入程序,那么得出的output就不是正确的了。这里涉及到类加载的问题。

首先得知道初始化的顺序:1.先静态对象 2.非静态对象 。

在Table类和Cupboard类里面加入了Bowl类型的静态成员变量,而且只有在第一个Table对象被创建的时候,它们才会被初始化,并且只能被初始化一次。

从output观察:要想执行main方法,必须要加载StaticInitialization类,然后静态域table 、cupboard被初始化,即它们对应的类被加载,并且Table类和Cupboard类里包含静态的Bowl对象,所以Bowl类也被加载,即在main()方法开始之前这几个类都被加载了。所以,输出结果的顺序就明白了吧。

需要注意的地方:

1.先静态对象,后非静态对象;

2.静态对象只能被初始化一次(output里面的Bowl(1)、2、4、5只出现一次,而Bowl(3)出现了两次,因为new了两个Cupboard()对象);

以上总结是个人理解及书上的解释,若有错误请指正、各位大神多多包涵!本人Java小白,愿与大家多交流学习。(第一次用Markdown..)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java