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 6002012-05-04 163-170/913 Java编 ... -
Java编程思想第四版——第二十天
2012-05-03 13:45 7302012-05-03 158-163/913 Java编程思 ... -
Java编程思想第四版——第十九天
2012-05-02 11:08 8432012-05-02 149-158/913 Java编程思 ... -
Java编程思想第四版——第十八天
2012-04-27 13:12 10242012-04-27 142-149/913 Java编 ... -
Java编程思想第四版——第十七天
2012-04-25 11:18 7582012-04-25 138-142/913 Java编程思 ... -
Java编程思想第四版——第十六天
2012-04-24 13:50 7592012-04-24 131-138/913 Java编 ... -
Java编程思想第四版——第十五天
2012-04-23 17:14 7772012-04-23 121-131/913 Java编程思 ... -
Java编程思想第四版——第十三天
2012-04-18 12:08 6772012-04-18 108-118/913 Java编 ... -
Java编程思想第四版——第十二天
2012-04-09 10:58 7582012-04-09 102-108/913 Java编 ... -
Java编程思想第四版——第十一天
2012-04-05 12:21 8382012-04-05 Java编程思想第四版——第十一天 ... -
Java编程思想第四版——第十天
2012-03-31 12:03 5792012-03-31 97-102/913 Java编程思想 ... -
Java编程思想第四版——第九天
2012-03-30 14:59 7152012-03-30 80-97/913 Java编程思想第 ... -
Java编程思想第四版——第八天
2012-03-29 12:09 5032012-03-29 76-80/913 3.6 自动递增和 ... -
Java编程思想第四版——第七天
2012-03-28 12:24 6712012-03-28 70-76/913 昨天找 ... -
Java编程思想第四版——第六天
2012-03-27 13:02 5412012-03-27 66-70/913 最近两 ... -
Java编程思想第四版——第五天
2012-03-23 15:09 9582012-03-23 60-66/913 2.5 方法、参数 ... -
Java编程思想第四版——第四天
2012-03-22 12:41 6032012-03-22 54-60/913 第二章 ... -
Java编程思想第四版——第三天
2012-03-21 12:40 5922012-03-21 47-54/913 1.12 并 ... -
Java编程思想第四版——第二天
2012-03-20 13:54 746今天本来以为进度可以 ... -
Java编程思想第四版——第一天
2012-03-19 15:57 807Java已经丢手一年了 ...
相关推荐
### 第十五届蓝桥杯Java A组参赛总结 #### 知识点一:比赛规则与流程 - **考试流程**:参赛者需首先下载题目,使用官方提供的解压密码解压试题包。整个考试时长为4小时。 - **提交方式**: - 在考试过程中,参赛...
《Java面向对象程序设计(第2版)》是一本深入探讨Java编程的教材,尤其注重面向对象编程思想的讲解。本书通过丰富的实例代码,帮助读者理解并掌握Java语言的核心概念和面向对象编程的关键要素。在提供的压缩包文件...
《安卓Android源码——四次元新浪微博客户端项目》 这个项目是针对安卓平台的一个开源实现,旨在解析并展示了新浪微博客户端的源代码。源码分析对于开发者来说是宝贵的资源,能够帮助我们深入理解移动应用的开发...
3. **第十一章至第十三章——JNI技术规范**:这部分内容作为技术规范,为开发者提供了详细的指引,既可以作为参考手册,也适用于那些需要自行实现JNI标准的高级用户。 #### 四、JNI的角色与限制 - **角色**:JNI...
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编程或类似面向对象语言(比如说C#)的基本理解,不需要拥有为移动设备开发软件的经验。实际上,如果你确实有这方面的经验,反倒应该忘记它们。Android是如此与众不同,因此...
5.8 版本 6:第四次优化:缓存(Caching) 5.9 从故事中学到的 第6章 集成测试框架:脆弱之美 6.1. 三个类搞定一个验收测试框架 6.2. 框架设计的挑战 6.3. 开放式框架 6.4. 一个HTML解析器可以简单到什么程度? 6.5. ...
**第十天:创建视图和索引** - **使用视图**:介绍了视图的概念及其用途。 - **列的重命名**:教授了如何更改视图中列的名称。 - **SQL对视图的处理过程**:解释了SQL引擎如何处理包含视图的查询请求。 以上内容...
第十四章 继 承 .155 14.1 C#的继承机制.155 <<page 3>> page begin==================== 14.2 多 态 性 .159 14.3 抽象与密封 .163 14.4 继承中关于属性的一些问题.169 14.5 小 结 .172 第四部分 ...
##### 第十四章 继承 - **继承机制**:子类可以继承父类的属性和方法。 - **多态性**:同一接口在不同类中可能有不同的实现。 - **抽象与密封**:抽象类和密封类的特点和用途。 **14.5 小结** 继承是面向对象编程...
#### 第十四章:继承 - **14.1 C#的继承机制** - 如何在一个类的基础上创建新的类。 - **14.2 多态性** - 子类可以覆盖父类的方法。 - 多态允许使用基类类型的指针或引用调用派生类的方法。 - **14.3 抽象与密封...
##### 第十四章:继承 - **14.1 C#的继承机制** - 继承允许子类继承父类的特性和行为。 - **14.2 多态性** - 多态性允许子类重写或扩展父类的方法。 - **14.3 抽象与密封** - 抽象类不能被实例化,只能作为其他...