`
凌紫冥
  • 浏览: 24527 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java编程思想第四版——第十四天

    博客分类:
  • Java
阅读更多
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)并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics