2012-04-19
118-121/913
Java编程思想第四版——第十四天
5.4.1 在构造器中调用构造器
为一个类写了多个构造器,有时想在一个构造器中调用另一个构造器,以避免重复代码,可用this关键字做到这一点。
通常写this的时候,都是指这个对象或者当前对象,而且它本身表示对当前对象的引用。在构造器中,如果为this添加了参数列表,就有了不同的含义,这将产生对符合此参数列表的某个构造器的明确调用,这样,调用其他构造器就有了直接的途径。
可以用this调用一个构造器,但不能调用两个。且必须将构造器调用置于最起始处,否则编译器会保错。this.s = s,this.s代表数据成员,s代表参数s。
除了构造器之外,编译器禁止在其他任何方法中调用构造器。
5.4.2 static的含义
Static方法是没有this的方法。在static方法的内部不能调用非静态方法,反过来倒是可以的,而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这正是static方法的主要用途。类似于全局方法,java中禁止使用全局方法,但在类中置入static方法就可以访问其他static方法和static域。
使用static方法时,由于不存在this,所以不是通过“向对象发送消息”的方式来完成的。如果在代码中出现了大量的static方法,就该重新考虑自己的设计了。
5.5 清理:终结处理和垃圾回收
垃圾回收的特殊情况:某些对象(并非使用new)获得了一块“特殊”的内存区域,而垃圾回收器值知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存。为了应对这种情况,java允许在类中定义一个名为finalize()的方法。
finalize()工作原理:垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存,使用finalize(),就能在垃圾回收时刻做一些重要的清理工作。
编程陷阱:可能把finalize()当作C++中的析构函数(C++中销毁对象必须用到这个函数)。区分:在C++中,对象一定会被销毁(如果程序中没有缺陷的话),而java中的对象却并非总是被垃圾回收,即:1.对象可能不被垃圾回收。2.垃圾回收并不等于“析构”。
Java没有提供“析构函数”或相似的概念,要做类似的清理工作,必须自己动手创建一个执行清理工作的普通方法。
垃圾回收本身也有开销,如果不使用,就不用支付这部分开销。
5.5.1 finalize()的用途何在
不能将finalize()作为通用的清理方法。
3.垃圾回收只与内存有关。
使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾回收有关的任何行为来说(尤其是finalize()方法),它们也必须同内存及其回收有关。
无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这将对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。
Java中一切皆为对象,那么这种特殊情况是怎么回事?
之所以要有finalize(),是由于在分配内存时可能采用了类似C语言中的做法,而非java中的通常做法。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在java中调用非java代码的方式。本地方法目前只支持C和C++,但他们可以调用其他语言写的代码,所以实际上可以调用任何代码。在非java代码中,也许会调用C的malloc()函数系列来分配存储空间,而且除非调用了free()函数,否则存储空间将得不到释放,从而造成内存泄漏。free()是C和C++中的函数,所以需要在finalize()中用本地方法调用它。
所以不要过多的使用finalize(),它不是进行普通的清理工作的合适场所。
5.5.2 你必须实施清理
Java不允许创建局部对象,必须使用new创建对象。没有用于释放对象的delete,因为垃圾回收器会帮助释放存储空间。
垃圾回收器不能完全代替析构函数,也不能直接调用finalize()。
无论是垃圾回收还是终结,都不保证一定会发生,如果java虚拟机(JVM)并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。
118-121/913
Java编程思想第四版——第十四天
5.4.1 在构造器中调用构造器
为一个类写了多个构造器,有时想在一个构造器中调用另一个构造器,以避免重复代码,可用this关键字做到这一点。
通常写this的时候,都是指这个对象或者当前对象,而且它本身表示对当前对象的引用。在构造器中,如果为this添加了参数列表,就有了不同的含义,这将产生对符合此参数列表的某个构造器的明确调用,这样,调用其他构造器就有了直接的途径。
可以用this调用一个构造器,但不能调用两个。且必须将构造器调用置于最起始处,否则编译器会保错。this.s = s,this.s代表数据成员,s代表参数s。
除了构造器之外,编译器禁止在其他任何方法中调用构造器。
5.4.2 static的含义
Static方法是没有this的方法。在static方法的内部不能调用非静态方法,反过来倒是可以的,而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这正是static方法的主要用途。类似于全局方法,java中禁止使用全局方法,但在类中置入static方法就可以访问其他static方法和static域。
使用static方法时,由于不存在this,所以不是通过“向对象发送消息”的方式来完成的。如果在代码中出现了大量的static方法,就该重新考虑自己的设计了。
5.5 清理:终结处理和垃圾回收
垃圾回收的特殊情况:某些对象(并非使用new)获得了一块“特殊”的内存区域,而垃圾回收器值知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存。为了应对这种情况,java允许在类中定义一个名为finalize()的方法。
finalize()工作原理:垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存,使用finalize(),就能在垃圾回收时刻做一些重要的清理工作。
编程陷阱:可能把finalize()当作C++中的析构函数(C++中销毁对象必须用到这个函数)。区分:在C++中,对象一定会被销毁(如果程序中没有缺陷的话),而java中的对象却并非总是被垃圾回收,即:1.对象可能不被垃圾回收。2.垃圾回收并不等于“析构”。
Java没有提供“析构函数”或相似的概念,要做类似的清理工作,必须自己动手创建一个执行清理工作的普通方法。
垃圾回收本身也有开销,如果不使用,就不用支付这部分开销。
5.5.1 finalize()的用途何在
不能将finalize()作为通用的清理方法。
3.垃圾回收只与内存有关。
使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾回收有关的任何行为来说(尤其是finalize()方法),它们也必须同内存及其回收有关。
无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这将对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。
Java中一切皆为对象,那么这种特殊情况是怎么回事?
之所以要有finalize(),是由于在分配内存时可能采用了类似C语言中的做法,而非java中的通常做法。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在java中调用非java代码的方式。本地方法目前只支持C和C++,但他们可以调用其他语言写的代码,所以实际上可以调用任何代码。在非java代码中,也许会调用C的malloc()函数系列来分配存储空间,而且除非调用了free()函数,否则存储空间将得不到释放,从而造成内存泄漏。free()是C和C++中的函数,所以需要在finalize()中用本地方法调用它。
所以不要过多的使用finalize(),它不是进行普通的清理工作的合适场所。
5.5.2 你必须实施清理
Java不允许创建局部对象,必须使用new创建对象。没有用于释放对象的delete,因为垃圾回收器会帮助释放存储空间。
垃圾回收器不能完全代替析构函数,也不能直接调用finalize()。
无论是垃圾回收还是终结,都不保证一定会发生,如果java虚拟机(JVM)并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。
发表评论
-
Java编程思想第四版——第二十一天
2012-05-04 12:56 5762012-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 10012012-04-27 142-149/913 Java编 ... -
Java编程思想第四版——第十七天
2012-04-25 11:18 7412012-04-25 138-142/913 Java编程思 ... -
Java编程思想第四版——第十六天
2012-04-24 13:50 7492012-04-24 131-138/913 Java编 ... -
Java编程思想第四版——第十五天
2012-04-23 17:14 7532012-04-23 121-131/913 Java编程思 ... -
Java编程思想第四版——第十三天
2012-04-18 12:08 6652012-04-18 108-118/913 Java编 ... -
Java编程思想第四版——第十二天
2012-04-09 10:58 7332012-04-09 102-108/913 Java编 ... -
Java编程思想第四版——第十一天
2012-04-05 12:21 8182012-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已经丢手一年了 ...
相关推荐
- **第四章:树** —— 深入讨论了树的各种类型(如二叉树、平衡树等)及其操作,如遍历、插入和删除。 - **第五章:散列** —— 介绍了散列表的工作原理、散列函数的设计以及处理冲突的方法。 - **第六章:优先队列...
4. **多线程编程**:第十四章介绍了Java中的多线程编程,使读者能够编写并发程序以提高应用程序的效率和响应速度。 5. **网络通信编程**:第十五章讲解了如何利用Java实现网络通信,这对开发网络应用至关重要。 6....
《Java面向对象程序设计(第2版)》是一本深入探讨Java编程的教材,尤其注重面向对象编程思想的讲解。本书通过丰富的实例代码,帮助读者理解并掌握Java语言的核心概念和面向对象编程的关键要素。在提供的压缩包文件...
《安卓Android源码——四次元新浪微博客户端项目》 这个项目是针对安卓平台的一个开源实现,旨在解析并展示了新浪微博客户端的源代码。源码分析对于开发者来说是宝贵的资源,能够帮助我们深入理解移动应用的开发...
### 第十五届蓝桥杯Java A组参赛总结 #### 知识点一:比赛规则与流程 - **考试流程**:参赛者需首先下载题目,使用官方提供的解压密码解压试题包。整个考试时长为4小时。 - **提交方式**: - 在考试过程中,参赛...
3. **第十一章至第十三章——JNI技术规范**:这部分内容作为技术规范,为开发者提供了详细的指引,既可以作为参考手册,也适用于那些需要自行实现JNI标准的高级用户。 #### 四、JNI的角色与限制 - **角色**:JNI...
2. **加权图**:第十四章重点讨论了加权图的特性以及基于加权图的最短路径算法,如迪杰斯特拉算法、弗洛伊德算法等。 #### 六、综合运用 1. **何时使用何种数据结构**:最后一部分总结了在不同情况下选择合适的...
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是如此与众不同,因此...
- **第14章:多线程编程**(713页)探讨了多线程编程的基础知识和C#中的实现方法。 #### 15. XML - **第15章:XML**(751页)讲解了如何使用C#处理XML文档。 #### 16. Web服务 (Web Services) - **第16章:Web服务...
5.8 版本 6:第四次优化:缓存(Caching) 5.9 从故事中学到的 第6章 集成测试框架:脆弱之美 6.1. 三个类搞定一个验收测试框架 6.2. 框架设计的挑战 6.3. 开放式框架 6.4. 一个HTML解析器可以简单到什么程度? 6.5. ...
**第十天:创建视图和索引** - **使用视图**:介绍了视图的概念及其用途。 - **列的重命名**:教授了如何更改视图中列的名称。 - **SQL对视图的处理过程**:解释了SQL引擎如何处理包含视图的查询请求。 以上内容...