码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-02-20 00:35:14      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

//代码如下,摘自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()对象);

           3.所有的事物通过static联系到了一起...

 

以上总结是个人理解及书上的解释,若有错误请指正、各位大神多多包涵!本人Java小白,愿与大家多交流学习。

 

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

标签:

原文地址:http://www.cnblogs.com/leonpard34/p/5202269.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!