学习java静态数据初始化.docx

上传人:罗晋 文档编号:11036911 上传时间:2021-06-19 格式:DOCX 页数:11 大小:23.77KB
返回 下载 相关 举报
学习java静态数据初始化.docx_第1页
第1页 / 共11页
学习java静态数据初始化.docx_第2页
第2页 / 共11页
学习java静态数据初始化.docx_第3页
第3页 / 共11页
学习java静态数据初始化.docx_第4页
第4页 / 共11页
学习java静态数据初始化.docx_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《学习java静态数据初始化.docx》由会员分享,可在线阅读,更多相关《学习java静态数据初始化.docx(11页珍藏版)》请在三一文库上搜索。

1、Static数据的初始化 ( 注意结合代码调试理解 ) :package ;class Bowl Bowl()Bowl(9);Bowl(int marker) Bowl( + marker + );static Bowl b6 = new Bowl(6);static Bowl b9 = new Bowl();void f(int marker) f( + marker + );class Table static Bowl b1 = new Bowl(1);Table() Table();b2.f(1);1void f2(int marker) f2( + marker + );static

2、 Bowl b2 = new Bowl(2);class Cupboard Bowl b3 = new Bowl(3);Bowl b10 = new Bowl();static Bowl b4 = new Bowl(4);Cupboard() Cupboard();b4.f(2);void f3(int marker) f3( + marker + );static Bowl b5 = new Bowl(5);public class StaticInitialization /static Bowl b7 = newBowl(7);/-(1)2public static void main(

3、String args) Creating new Cupboard() in main);new Cupboard();Creating new Cupboard() in main);new Cupboard();/t2.f2(1);/-(2)/t3.f3(1);/-(3)/static Bowl b8 = new Bowl(8);/-(4)/static Table t2 = new Table();/-(5)/static Cupboard t3 = new Cupboard();/-(6) /:调试以上代码,总结出以下结论:一、初始化的过程:总体来说顺序为: static 初始化 -

4、 非 static 初始化 - 执行构造函数;二、代码分析一:对现有代码执行结果如下:Creating new Cupboard() in mainBowl(6)3Bowl(9)Bowl(4)Bowl(5)Bowl(3)Bowl(9)Cupboard()f(2)Creating new Cupboard() in mainBowl(3)Bowl(9)Cupboard()f(2)执行过程:1、java 解释器寻找 public class类,加载StaticInitialization类;2 、寻找 StaticInitialization类中的 static定义代码段;这里因为 (1) 、(4

5、) 、(5) 、(6) 均加了注释,所以 StaticInitialization中没有 static需要初始化 ;3、进入 main 函数中执行代码输出 Creating newCupboard() in main;4、继续执行 new Cupboard();,注意初始化的顺序是static初始化 - 非 static初始化 - 执行构造函数; 所以加载类4Cupboard后,首先寻找Cupboard类中的 static代码段;发现 static段是:static Bowl b4 = new Bowl(4); static Bowlb5 = new Bowl(5);同时发现有 非 stati

6、c段是:Bowl b3 = new Bowl(3);Bowl b10= new Bowl();按顺序先执行: static Bowl b4 = new Bowl(4);初始化,因为定义的是 Bowl 类的实例,所以先 加载 Bowl 类,进入 Bowl 类发现又有 static 代码段 static Bowl b6 = new Bowl(6);static Bowl b9 = new Bowl();然而我们知道初始化 staticBowl b4 = new Bowl(4);需要调用 Bowl的构造函数,但调用构造函数之前必须将该类需要初始化的部分先进行初始化,所以执行到这里就要先进行Bowl

7、类中的 static代码段的初始化,之后才能调用构造函数 Bowl(int marker)为 static Bowl b4 = new Bowl(4);进行初始化。 于是 b6,b9分别调用构造函数Bowl(intmarker),Bowl(),输出 Bowl(6),Bowl(9),完了之后, b4 调用构造函数 Bowl (int marker)输出 Bowl(4),b4 初始化结束,返回 Cupboard类继续执行 ,初始化 b5, 输出 Bowl(5), 此时Cupboard类中 static部分初始化完,接下来对非 static部分初始化,即对 b3 和 b10初始化, 一样的方法,加载

8、Bowl 类,发现static字段在上面已经初始化, 所以这里直接调用Bowl 类的构造函数,输出 Bowl(3),Bowl(9)。至此 Cupboard类中需要初始化的部分已经初始化完了, 所以放心大胆的 调用 Cupboard类的构造5函数,为 main 函数中代码完成new Cupboard();的实现,输出Cupboard(),f(2)。程序执行返回到main函数,输出:Creatingnew Cupboard() in main,代码 new Cupboard();又一次出现,这里实际上是想演示static只会初始化一次 ,而非 static只要创建了对象或调用了成员、成员函数,会进

9、行第二次初始化 ,于是可以看到输出结果并没有再输出 Bowl(6)、Bowl(9)、Bowl(4)、Bowl(5),而是输出:Bowl(3)、Bowl(9)、Cupboard()、f(2)。5 、取消注释( 1 )、( 4 ),发现结果如下:Bowl(6)Bowl(9)Bowl(7)Bowl(8)Creating new Cupboard() in mainBowl(4)Bowl(5)Bowl(3)Bowl(9)Cupboard()f(2)Creating new Cupboard() in mainBowl(3)Bowl(9)6Cupboard()f(2)可以看出输出了Bowl(7)、Bow

10、l(8),这说明在 main()函数执行之前,程序要先对 StaticInitialization进行检查,如果有 static部分,则先初始化。6 、再取消注释( 2 )、( 5 )输出结果为:Bowl(6)Bowl(9)Bowl(7)Bowl(8)Bowl(1)Bowl(2)Table()f(1)Creating new Cupboard() in mainBowl(4)Bowl(5)Bowl(3)Bowl(9)Cupboard()f(2)Creating new Cupboard() in main7Bowl(3)Bowl(9)Cupboard()f(2)f2(1)在前面的基础上又输出了

11、Bowl(1) 、Bowl(2)、Table() 、f(1) 。然而我们看到当没有代码static Table t2 = new Table();的时候 Table 类中的 static部分没有被初始化,这说明什么?static 初始化只有在必要的时候才会进行。只有在创建了第一个 Table 对象之后才会进行初始化。总结如下: 初始化顺序为:加载public StaticInitialization类- 初始化 static-加载类 Cupboard-初始化 static-加载类Bowl-初始化 static-执行 Bowl类构造函数 - 初始化Cupboard类非 static-调用 Bowl类构造函数执行 - 调用Cupboard类构造函数执行 - 返回 StaticInitialization类.8

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1