2012-04-23
121-131/913
Java编程思想第四版——第十五天
5.5.3 终结条件
通常不能指望finalize(),必须创建其他的“清理”方法,并明确的调用它们。
finalize()另一个用法,不依赖于每次都要对finalize()进行调用,这就是对象终结条件的验证。
5.5.4 垃圾回收器如何工作
垃圾回收器提高对象的创建速度有明显的效果。Java从堆分配空间的速度,可以和其他语言从堆栈上分配空间的速度相媲美。
C++的堆——院子,每个对象负责管理自己的地盘,对象被销毁,地盘被重用。
Java虚拟机,堆的实现,像一个传送带,每分配一个新对象,就往前移动一格。这意味着对象存储空间的分配速度非常快。Java的“堆指针”只是简单的移动到尚未分配的区域,效率比得上C++在堆栈上分配空间的效率。在实际过程中在簿记工作方面还有少量额外开销,但比不上查找可用空间开销大。
Java的堆不完全像传送带那样工作,垃圾回收器一面回收空间,一面使堆中的对象紧凑排列。堆指针可以很容易移动到更靠近传送带的开始处,尽量避免了页面错误。通过垃圾回收器堆对象重新排列,实现一种高速的、有无限空间可供分配的堆模型。
引用计数是一种简单但是速度很慢的垃圾回收技术,通常用来说明垃圾收集的工作方式,但从未被应用于任何一种java虚拟机实现中。
更快的模式中,不是基于引用计数计数,依据思想:堆任何“活”的对象,一定能最终追溯到其存活在堆栈活静态存储区之中的引用。
Java虚拟机采用一种自适应的垃圾回收技术,如何处理找到的存活对象,取决于不同的java虚拟机实现。一种:停止-复制(stop-and-copy),空间连续,需要多个空间进行复制转移,适合垃圾多的情况,必须暂停程序,另一种:标记-清扫(mark-and-sweep),空间不连续,不会发生复制,适合垃圾少的情况,必须暂停程序。
自适应技术:自适应的、分代的、停止-复制、标记-清扫式垃圾回收器。
Java虚拟机中有许多附加技术用以提升速度,尤其是与加载器操作有关的,被称为“即时”(Just-In-Time,JIT)编译器的技术。把程序全部或部分翻译成本地机器码(这本来是java虚拟机的工作),程序运行速度因此得以提升。Java HotSpot技术采用惰性评估(lazy cvaluation),即时编译器只在必要的时候才编译代码。从不会被执行的代码不会被JIT所编译。Java HotSpot,代码每次被执行的时候都会做一些优化,执行次数越多,速度越快。
5.6 成员初始化
Java尽力保证,所有变量在使用前都能得到恰当的初始化,对于方法的局部变量,java以编译时错误的形式来贯彻这种保证。
未初始化的局部变量有可能是程序员的疏忽,如果采用默认值可能掩盖这种失误,因此强制程序员提供一个初始值,可能帮助找出程序里的缺陷。
类的数据成员(即字段)是基本类型,每个基本类型数据成员保证都会有一个初始值。
在类中定义一个对象引用时,如果不初始化,此引用会获得一个特殊值null。
5.6.1 指定初始化
直接的:在定义类成员变量的地方为其赋值。(C++中不能这样做)
非基本类型的对象也可以用同样的方法初始化。不初始化就使用,会报空指针的运行时错误。
编译器会恰当的对“向前引用”发出警告。
5.7 构造器初始化
可以用构造器进行初始化,运行时刻,可以调用方法或执行某些动作来确定初值,这为编程带来了更大的灵活性。但要记牢:无法阻止自动初始化的进行,它将在构造器被调用之前发生。
编译器不会强制一定要在构造器的某个地方或在使用它们之前对元素进行初始化,因为初始化早已得到了保证。
5.7.1 初始化顺序
在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。
5.7.2 静态数据的初始化
无论创建多少个对象,静态数据都只占用一份存储区域。Static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值,如果它是一个对象引用,那么它的默认初始化值就是null。
如果想在定义处进行初始化,采取的方法与非静态数据没什么不同。
静态初始化只有在必要时刻才会进行,如果不创建对象,也不经过类直接引用,那么静态数据永远都不会被创建。只有第一个类对象被创建(或第一次访问静态数据)的时候,它们才会被初始化。此后,静态对象不会再次被初始化。
初始化的顺序是先静态对象(如果他们尚未因前面的对象创建过程而被初始化),而后是“非静态”对象。要执行main()(静态方法),必须加载StaticInitialization类,然后其静态域被初始化。
对象的创建过程,假设有个名为Dog的类:
1. 即使没有显示的使用static关键字,构造器实际上也是静态方法。首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,java解释器必须查找类路径,以定位Dog.class文件。
2. 然后载入Dog.class(这将创建一个Class对象),有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
3. 当用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。
4. 这块存储空间会被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值(对数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null。
5. 执行所有出现于字段定义处的初始化动作。
6. 执行构造器。这可能牵涉很多动作,尤其是涉及继承的时候。
5.7.3 显示的静态初始化
Java允许将多个静态初始化动作组织成一个特殊的“静态子句”(有时也叫做“静态块”)。
例如:
public class Spoon{
static int i;
static{
i = 47;
}
}
尽管上面的代码看起来像个方法,但它实际只是一段跟在static关键字后面的代码。与其他静态初始化动作一样,这段代码仅执行一次:当首次生成这个类的一个对象时,或者首次访问属于那个类的静态数据成员时(即便从未生成过那个类的对象)。
5.7.4 非静态实例初始化
Java中也有被称为实例初始化的类似语法,用来初始化每一个对象的非静态变量。
实例初始化子句:
{
mug1 = new Mug(1);
mug2 = new Mug(2);
print(“mug1 & mug2 initialized”);
}
看起来和静态初始化子句一模一样,只不过少了static关键字。这种语法对于支持“匿名内部类”的初始化是必须的,但是它也使得可以保证无论调用了哪个显示构造器,某些操作都会发生。实例初始化子句是在构造器之前执行的。
121-131/913
Java编程思想第四版——第十五天
5.5.3 终结条件
通常不能指望finalize(),必须创建其他的“清理”方法,并明确的调用它们。
finalize()另一个用法,不依赖于每次都要对finalize()进行调用,这就是对象终结条件的验证。
5.5.4 垃圾回收器如何工作
垃圾回收器提高对象的创建速度有明显的效果。Java从堆分配空间的速度,可以和其他语言从堆栈上分配空间的速度相媲美。
C++的堆——院子,每个对象负责管理自己的地盘,对象被销毁,地盘被重用。
Java虚拟机,堆的实现,像一个传送带,每分配一个新对象,就往前移动一格。这意味着对象存储空间的分配速度非常快。Java的“堆指针”只是简单的移动到尚未分配的区域,效率比得上C++在堆栈上分配空间的效率。在实际过程中在簿记工作方面还有少量额外开销,但比不上查找可用空间开销大。
Java的堆不完全像传送带那样工作,垃圾回收器一面回收空间,一面使堆中的对象紧凑排列。堆指针可以很容易移动到更靠近传送带的开始处,尽量避免了页面错误。通过垃圾回收器堆对象重新排列,实现一种高速的、有无限空间可供分配的堆模型。
引用计数是一种简单但是速度很慢的垃圾回收技术,通常用来说明垃圾收集的工作方式,但从未被应用于任何一种java虚拟机实现中。
更快的模式中,不是基于引用计数计数,依据思想:堆任何“活”的对象,一定能最终追溯到其存活在堆栈活静态存储区之中的引用。
Java虚拟机采用一种自适应的垃圾回收技术,如何处理找到的存活对象,取决于不同的java虚拟机实现。一种:停止-复制(stop-and-copy),空间连续,需要多个空间进行复制转移,适合垃圾多的情况,必须暂停程序,另一种:标记-清扫(mark-and-sweep),空间不连续,不会发生复制,适合垃圾少的情况,必须暂停程序。
自适应技术:自适应的、分代的、停止-复制、标记-清扫式垃圾回收器。
Java虚拟机中有许多附加技术用以提升速度,尤其是与加载器操作有关的,被称为“即时”(Just-In-Time,JIT)编译器的技术。把程序全部或部分翻译成本地机器码(这本来是java虚拟机的工作),程序运行速度因此得以提升。Java HotSpot技术采用惰性评估(lazy cvaluation),即时编译器只在必要的时候才编译代码。从不会被执行的代码不会被JIT所编译。Java HotSpot,代码每次被执行的时候都会做一些优化,执行次数越多,速度越快。
5.6 成员初始化
Java尽力保证,所有变量在使用前都能得到恰当的初始化,对于方法的局部变量,java以编译时错误的形式来贯彻这种保证。
未初始化的局部变量有可能是程序员的疏忽,如果采用默认值可能掩盖这种失误,因此强制程序员提供一个初始值,可能帮助找出程序里的缺陷。
类的数据成员(即字段)是基本类型,每个基本类型数据成员保证都会有一个初始值。
在类中定义一个对象引用时,如果不初始化,此引用会获得一个特殊值null。
5.6.1 指定初始化
直接的:在定义类成员变量的地方为其赋值。(C++中不能这样做)
非基本类型的对象也可以用同样的方法初始化。不初始化就使用,会报空指针的运行时错误。
编译器会恰当的对“向前引用”发出警告。
5.7 构造器初始化
可以用构造器进行初始化,运行时刻,可以调用方法或执行某些动作来确定初值,这为编程带来了更大的灵活性。但要记牢:无法阻止自动初始化的进行,它将在构造器被调用之前发生。
编译器不会强制一定要在构造器的某个地方或在使用它们之前对元素进行初始化,因为初始化早已得到了保证。
5.7.1 初始化顺序
在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。
5.7.2 静态数据的初始化
无论创建多少个对象,静态数据都只占用一份存储区域。Static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值,如果它是一个对象引用,那么它的默认初始化值就是null。
如果想在定义处进行初始化,采取的方法与非静态数据没什么不同。
静态初始化只有在必要时刻才会进行,如果不创建对象,也不经过类直接引用,那么静态数据永远都不会被创建。只有第一个类对象被创建(或第一次访问静态数据)的时候,它们才会被初始化。此后,静态对象不会再次被初始化。
初始化的顺序是先静态对象(如果他们尚未因前面的对象创建过程而被初始化),而后是“非静态”对象。要执行main()(静态方法),必须加载StaticInitialization类,然后其静态域被初始化。
对象的创建过程,假设有个名为Dog的类:
1. 即使没有显示的使用static关键字,构造器实际上也是静态方法。首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,java解释器必须查找类路径,以定位Dog.class文件。
2. 然后载入Dog.class(这将创建一个Class对象),有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
3. 当用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。
4. 这块存储空间会被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值(对数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null。
5. 执行所有出现于字段定义处的初始化动作。
6. 执行构造器。这可能牵涉很多动作,尤其是涉及继承的时候。
5.7.3 显示的静态初始化
Java允许将多个静态初始化动作组织成一个特殊的“静态子句”(有时也叫做“静态块”)。
例如:
public class Spoon{
static int i;
static{
i = 47;
}
}
尽管上面的代码看起来像个方法,但它实际只是一段跟在static关键字后面的代码。与其他静态初始化动作一样,这段代码仅执行一次:当首次生成这个类的一个对象时,或者首次访问属于那个类的静态数据成员时(即便从未生成过那个类的对象)。
5.7.4 非静态实例初始化
Java中也有被称为实例初始化的类似语法,用来初始化每一个对象的非静态变量。
实例初始化子句:
{
mug1 = new Mug(1);
mug2 = new Mug(2);
print(“mug1 & mug2 initialized”);
}
看起来和静态初始化子句一模一样,只不过少了static关键字。这种语法对于支持“匿名内部类”的初始化是必须的,但是它也使得可以保证无论调用了哪个显示构造器,某些操作都会发生。实例初始化子句是在构造器之前执行的。
发表评论
-
Java编程思想第四版——第二十一天
2012-05-04 12:56 5772012-05-04 163-170/913 Java编 ... -
Java编程思想第四版——第二十天
2012-05-03 13:45 7022012-05-03 158-163/913 Java编程思 ... -
Java编程思想第四版——第十九天
2012-05-02 11:08 8152012-05-02 149-158/913 Java编程思 ... -
Java编程思想第四版——第十八天
2012-04-27 13:12 10022012-04-27 142-149/913 Java编 ... -
Java编程思想第四版——第十七天
2012-04-25 11:18 7422012-04-25 138-142/913 Java编程思 ... -
Java编程思想第四版——第十六天
2012-04-24 13:50 7502012-04-24 131-138/913 Java编 ... -
Java编程思想第四版——第十四天
2012-04-19 11:28 6252012-04-19 118-121/913 Java编程思 ... -
Java编程思想第四版——第十三天
2012-04-18 12:08 6652012-04-18 108-118/913 Java编 ... -
Java编程思想第四版——第十二天
2012-04-09 10:58 7342012-04-09 102-108/913 Java编 ... -
Java编程思想第四版——第十一天
2012-04-05 12:21 8192012-04-05 Java编程思想第四版——第十一天 ... -
Java编程思想第四版——第十天
2012-03-31 12:03 5582012-03-31 97-102/913 Java编程思想 ... -
Java编程思想第四版——第九天
2012-03-30 14:59 6512012-03-30 80-97/913 Java编程思想第 ... -
Java编程思想第四版——第八天
2012-03-29 12:09 4822012-03-29 76-80/913 3.6 自动递增和 ... -
Java编程思想第四版——第七天
2012-03-28 12:24 6562012-03-28 70-76/913 昨天找 ... -
Java编程思想第四版——第六天
2012-03-27 13:02 5272012-03-27 66-70/913 最近两 ... -
Java编程思想第四版——第五天
2012-03-23 15:09 9422012-03-23 60-66/913 2.5 方法、参数 ... -
Java编程思想第四版——第四天
2012-03-22 12:41 5882012-03-22 54-60/913 第二章 ... -
Java编程思想第四版——第三天
2012-03-21 12:40 5682012-03-21 47-54/913 1.12 并 ... -
Java编程思想第四版——第二天
2012-03-20 13:54 728今天本来以为进度可以 ... -
Java编程思想第四版——第一天
2012-03-19 15:57 784Java已经丢手一年了 ...
相关推荐
### 第十五届蓝桥杯Java A组参赛总结 #### 知识点一:比赛规则与流程 - **考试流程**:参赛者需首先下载题目,使用官方提供的解压密码解压试题包。整个考试时长为4小时。 - **提交方式**: - 在考试过程中,参赛...
- **第四章:树** —— 深入讨论了树的各种类型(如二叉树、平衡树等)及其操作,如遍历、插入和删除。 - **第五章:散列** —— 介绍了散列表的工作原理、散列函数的设计以及处理冲突的方法。 - **第六章:优先队列...
第15章“异常捕获和枚举类型.ppt”涵盖了错误处理和异常处理机制,以及枚举类型,这是编写健壮、可维护代码的重要部分。枚举类型在Java中提供了一种安全的方式来表示固定集合的值。 第1-4章的“JAVA入门.ppt”则是...
5. **网络通信编程**:第十五章讲解了如何利用Java实现网络通信,这对开发网络应用至关重要。 6. **面向对象设计原则与设计模式**:第十六章提供了面向对象设计的原则和常用的设计模式,帮助开发者更好地组织代码和...
`weiciyuan-0.50.zip`可能是项目的某个版本,版本号`0.50`表示这可能是项目的第五十个迭代版本,意味着项目经过了一定程度的迭代和改进。 通过研究这个项目,开发者可以学习到如何使用Android SDK构建一个完整的...
3. **第十一章至第十三章——JNI技术规范**:这部分内容作为技术规范,为开发者提供了详细的指引,既可以作为参考手册,也适用于那些需要自行实现JNI标准的高级用户。 #### 四、JNI的角色与限制 - **角色**:JNI...
2. **加权图**:第十四章重点讨论了加权图的特性以及基于加权图的最短路径算法,如迪杰斯特拉算法、弗洛伊德算法等。 #### 六、综合运用 1. **何时使用何种数据结构**:最后一部分总结了在不同情况下选择合适的...
【第15章 JDBC】 一、引言 1.1 如何操作数据库 在传统的数据库操作中,我们通常使用客户端工具,如MySQL Workbench或SQL Server Management Studio,手动建立连接,输入用户名和密码,编写SQL语句,然后执行并查看...
Java 编程思想. 2005 年 3 月第 1 版. 机械工业出版社. [3] James Keogh 著.潘颖 王磊译.J2ME 开发大全. 2004 年 2 月第 1 版. 清华大学出版社. [4] Ian Sommerville 著. 程成等译. 软件工程. 2003 年 1 月第 1 ...
《JSP源代码详解(CH09~CH15)——构建网上购物系统》 JSP(JavaServer Pages)是一种动态网页技术,它允许开发者在HTML页面中嵌入Java代码,实现服务器端的动态处理。本资料包包含了从CH09到CH15的JSP源代码,这些...
根据提供的文件信息,我们可以归纳出该书《数据结构与算法分析_java语言描述》的主要知识点及其相关内容。本书由Mark Allen Weiss撰写,是计算机科学领域内学习数据结构与算法的经典教材之一。接下来,我们将按照各...
阅读本书唯一的前提条件,是具备对Java编程或类似面向对象语言(比如说C#)的基本理解,不需要拥有为移动设备开发软件的经验。实际上,如果你确实有这方面的经验,反倒应该忘记它们。Android是如此与众不同,因此...
- **第15章:XML**(751页)讲解了如何使用C#处理XML文档。 #### 16. Web服务 (Web Services) - **第16章:Web服务**(753页)介绍了如何使用C#开发和消费Web服务。 #### 附录 - **附录A:Java程序员的C#**(755页...
5.8 版本 6:第四次优化:缓存(Caching) 5.9 从故事中学到的 第6章 集成测试框架:脆弱之美 6.1. 三个类搞定一个验收测试框架 6.2. 框架设计的挑战 6.3. 开放式框架 6.4. 一个HTML解析器可以简单到什么程度? 6.5. ...
**第十天:创建视图和索引** - **使用视图**:介绍了视图的概念及其用途。 - **列的重命名**:教授了如何更改视图中列的名称。 - **SQL对视图的处理过程**:解释了SQL引擎如何处理包含视图的查询请求。 以上内容...