关于静态数据的初始化顺序问题
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树