日期:2011-03-22 16:17:00 来源:本站整理
确保切确的解除java对象[Java编程]
本文“确保切确的解除java对象[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Java不具有象C++的“破坏器”那样的概念.在C++中,一旦破坏(排除)一个对象,就会自动调用破坏器办法.之所以将其省略,大约是由于在Java中只需简单地忘掉对象,不需强行破坏它们.垃圾汇集器会在必要的时刻自动回收内存.
垃圾汇集器大大都时刻都能很好地工作,但在某些情形下,我们的类大概在自己的存在期间采纳一些行动,而这些行动要求必须举行明确的排除工作.正如第4章已经指出的那样,我们并不知道垃圾汇集器什么时刻才会显身,大概说不知它什么时刻会调用.所以一旦但愿为一个类排除什么东西,必须写一个分外的办法,明确、专门地来做这件事情.同时,还要让客户程序员知道他们必须调用这个办法.而在全部这一切的背面,就如第9章(违例掌握)要具体注释的那样,必须将这样的排除代码置于一个finally从句中,从而防备任何大概呈现的违例事件.
下面介绍的是一个计算机帮助计划系统的例子,它能在屏幕上描绘图形:
这个系统中的全部东西都属于某种Shape(多少形状).Shape本身是一种Object(对象),因为它是从根类明确担当的.每个类都重新定义了Shape的cleanup()办法,同时还要用super调用那个办法的底子类版本.固然对象存在期间调用的全部办法都可负责做一些要求排除的工作,但关于特定的Shape类——Circle(圆)、Triangle(三角形)以及Line(直线),它们都拥有自己的构建器,能完成“作图”(draw)任务.每个类都有它们自己的cleanup()办法,用于将非内存的东西恢复回对象存在之前的气象.//: CADSystem.java // Ensuring proper cleanup import java.util.*; class Shape { Shape(int i) { System.out.println("Shape constructor"); } void cleanup() { System.out.println("Shape cleanup"); } } class Circle extends Shape { Circle(int i) { super(i); System.out.println("Drawing a Circle"); } void cleanup() { System.out.println("Erasing a Circle"); super.cleanup(); } } class Triangle extends Shape { Triangle(int i) { super(i); System.out.println("Drawing a Triangle"); } void cleanup() { System.out.println("Erasing a Triangle"); super.cleanup(); } } class Line extends Shape { private int start, end; Line(int start, int end) { super(start); this.start = start; this.end = end; System.out.println("Drawing a Line: " + start + ", " + end); } void cleanup() { System.out.println("Erasing a Line: " + start + ", " + end); super.cleanup(); } } public class CADSystem extends Shape { private Circle c; private Triangle t; private Line[] lines = new Line[10]; CADSystem(int i) { super(i + 1); for(int j = 0; j < 10; j++) lines[j] = new Line(j, j*j); c = new Circle(1); t = new Triangle(1); System.out.println("Combined constructor"); } void cleanup() { System.out.println("CADSystem.cleanup()"); t.cleanup(); c.cleanup(); for(int i = 0; i < lines.length; i++) lines[i].cleanup(); super.cleanup(); } public static void main(String[] args) { CADSystem x = new CADSystem(47); try { // Code and exception handling... } finally { x.cleanup(); } } } ///:~
在main()中,可看到两个新关键字:try和finally.我们要到第9章才会向大家正式举荐它们.此中,try关键字指出背面跟随的块(由花括号定界)是一个“鉴戒区”.也就是说,它会遭到分外的报酬.此中一种报酬就是:该鉴戒区背面跟随的finally从句的代码必定会得以履行——不管try块到底存不存在(通过违例掌握技术,try块可有多种不平常的利用).在这里,finally从句的意思是“老是为x调用cleanup(),无论会发生什么事情”.这些关键字将在第9章举行全面、完好的注释.
在自己的排除办法中,必须注意对底子类以及成员对象排除办法的调用次序——假如一个子对象要以另一个为底子.普通,应采纳与C++编译器对它的“破坏器”采纳的一样的情势:首先完成与类有关的全部特别工作(大概要求底子类元素仍旧可见),然后调用底子类排除办法,就象这儿演示的那样.
很多情形下,排除大概并非个问题;只需让垃圾汇集器尽它的职责便可.但一旦必须由自己明确排除,就必须分外谨严,并要求全面的考虑.
1. 垃圾汇集的次序
不能期望自己能切当知道什么时刻会开始垃圾汇集.垃圾汇集器大概永久不会得到调用.即便得到调用,它也大概以自己乐意的任何次序回收对象.除此以外,Java 1.0实现的垃圾汇集器机制普通不会调用finalize()办法.除内存的回收以外,其他任何东西都最好不要依靠垃圾汇集器举行回收.若想明确地排除什么,请制作自己的排除办法,并且不要依靠finalize().但是正如从前指出的那样,可逼迫Java1.1调用全部收尾模块(Finalizer).
以上是“确保切确的解除java对象[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:java名字的躲藏
- ·下一篇文章:合成与承当的结合
- ·中查找“确保切确的解除java对象”更多相关内容
- ·中查找“确保切确的解除java对象”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论