【JAVA学习路-think in java】p95:静态数据的初始化顺序

package pkg;

//1st class
class Bowel{
	Bowel(int maker){//constructor
		System.out.println("Bowel:"+maker);//【3】【5】【11】【13】【15】【22】【29】【36】
	}
	void f1(int maker) {//function 1
		System.out.println("From Bowel f1:"+maker);//【8】【18】【25】
	}
}


//2nd class
class Table{
	static Bowel bowel1=new Bowel(1);/* 1st obj *///【2】
	Table(){//constructor
		System.out.println("Table:in constructor");//【6】
		bowel2.f1(2);// one Bowel object           //【7】
	}
	void f2(int maker) {//function 2
		System.out.println("From Table f2:"+maker);
	}
	static Bowel bowel2=new Bowel(2);//later defined  【4】
}


//3rd class
class Cupboard{
	Bowel bowel3=new Bowel(3);/*  3rd obj */ //【14】【21】【28】
	static Bowel bowel4=new Bowel(4);//【10】
	Cupboard(){
		System.out.println("Cupboard:in constructor!");//【16】【23】【30】
		bowel4.f1(4);//【17】【24】【31】
	}
	void f3(int maker) {
		System.out.println("From Cupboard f3:"+maker);//【34】
		System.out.println("From Cupboard f3:"+maker);//【34】
	}
	static Bowel bowel5=new Bowel(5);//【12】
}	


//=====================================================================//
/*   main class   */
public class p95{
	public static void main(String[] args){
		System.out.println("Creating new Cupboard in main");//【19】
		new Cupboard();//【20】
		
		System.out.println("Creating new Cupboard in main again");//【26】
		new Cupboard();//【27】
		
		table.f2(1);//【32】
		cupboard.f3(1);//【33】
		Bowel t=new Bowel(1937);//【35】
	}
	
	//variable
	static Table table=new Table();//【1】
	//System.output.println("Between table and Cupboard");// NOT Allowed here
	static Cupboard cupboard=new Cupboard();//【9】
	Bowel b=new Bowel(9527);// will NOT be execute
	
}

OUTPUT:

-----------------  go after  statement [1]  ----------------

3Bowel:1

5Bowel:2

6Table:in constructor

8From Bowel f1:2

-----------------  go after  statement [9]  ----------------

11Bowel:4

13Bowel:5

15Bowel:3

16Cupboard:in constructor!

18From Bowel f1:4

----------------  go to main function    -------------------

19Creating new Cupboard in main

22Bowel:3   //static variable initialized only ONCE

23Cupboard:in constructor!

25From Bowel f1:4

 

26Creating new Cupboard in main again

29Bowel:3

30Cupboard:in constructor!

31From Bowel f1:4

32From Table f2:1

34From Cupboard f3:1

【36】Bowel:1937
 

【测试】

       如果将main中的所有创建对象的语句、以及【1】、【9】语句都删除,则除了【19】【26】外,没有其他任何语句输出。由此能得出第5条结论。

 

【总结】(另外参考p158):

1、对于一个类(包括主类),如果存在创建static变量,则先创建static变量。对于包括static变量初始化的主类,初始化之后才会执行main中语句。

2、对于一个类,创建static变量后,再创建非static变量,然后调用构造器

3、static变量一旦创建后,不会再次创建。

4、主类中的main函数之外创建非static变量的语句不会被执行。

5、static变量初始化,仅仅在必要的时候才会进行。即,对于子类,仅仅在用其创建对象的时候,其static变量才会被初始化。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值