在Java中,初始化的顺序是先静态对象(如果他们尚未因前面的对象创建过程而被初始化),而后是“非静态”对象。
在程序中,bowl3是非静态对象,所以在输出的时候是先打印了Bowl(4)和Bowl(5),后打印了Bowl(3).
源程序:
/**************************************************************
* 版 本 号:v1.0
* 程序来源:《Thinking in Java》 page:186(中文95-96页)
* 题目描述:静态数据的初始化
* 问题分析:初始化的顺序是先静态对象(如果他们尚未因前面的对象创建过程而被初始化),而后是
* “非静态”对象。在程序中,bowl3是非静态对象,所以在输出的时候是先打印了Bowl(4)和Bowl(5),
* 后打印了Bowl(3).
* 输入描述:无
* 程序输出:Bow(1)
* Bow(2)
* Table()
* f1(1)
* Bow(4)
* Bow(5)
* Bow(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)
*完成日期: 2016年 07月 19日
***************************************************************/
class Bowl{
Bowl(int marker){
System.out.println("Bowl(" + marker + ")");
}
void f1(int marker){
System.out.println("f1(" + marker + ")");
}
}
class Table{
static Bowl bowl1 = new Bowl(1);
Table(){
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int marker){
System.out.println("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard{
Bowl bowl3 = new Bowl(3); //注意,bowl3是非静态的对象
/*初始化顺序是先静态对象,而后“非静态”对象。所以输出的时候先打印Bowl(4)和Bowl(5)
后打印Bowl(3)*/
static Bowl bowl4 = new Bowl(4);
Cupboard(){
System.out.println("Cupboard()");
bowl4.f1(2);
}
void f3(int marker){
System.out.println("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class example_186{
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);
}
/*这两个是静态的,所以先声明Table类,Table类中,Bowl类的bowl1对象又先被定义,所以先打印输出Bowl(1)和Bowl(2),
然后打印Table类的构造函数和方法。*/
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
程序输出结果:
![]()