java.lang.ref.cleaner包

finalize()//该方法已过时,有风险,慎用

1.对象不可能被垃圾回收

2.垃圾回收并不等于"析构"

只有当垃圾回收发生时finalize()才得到调用,否则对象就会一直保存下来,知道程序结束,将资源交还系统

3.垃圾回收只与内存又关,垃圾回收和终结都不保证会一定发生  //可以使用system.gc() 提醒 虚拟机回收

System.runFinalization(); //强制调用已经失去引用的对象的finalize方法

可以使对象引用指向null强制对象失去引用

//: object/TerminationCondition.java
/**@version 1.0
* @author fei long
*/
package object; class Book {
boolean checkedOut = false;
Book(boolean checkOut)
{
checkedOut = checkOut;
}
void checkIn()
{
checkedOut =false;
}
protected void finalize()
{
if(checkedOut)
{
System.out.println("Error: checked out");
}
}
}
public class TerminationCondition{
public static void main(String[] args)
{
Book novel = new Book(true);
novel.checkIn();
new Book(true);
System.gc(); //提醒虚拟机回收
System.runFinalization();//强制调用已经失去引用的对象的finalize方法 
}
}/* output
Error: checked out
*///~

继承和清理: 通过组合和继承方法来创建新类时,永远不必担心对象的清理为你,子类通常留给垃圾回收器进行处理,如果遇到清理的问题,那么必须为新类创建dispose()方法,并且由于继承的缘故,如果我们有其它作为垃圾回收一部分的特殊清理动作,就必须在导出类中覆盖dispose方法,当覆盖被继承类的dispose()方法时,务必调用基类版本的dispose()方法,否则基类的清理动作就不会发生,

//: polymorphism/Forg.java
// cleanup an inheritance
package object; import static net.mindview.util.Print.*; class Characteristic{
private String s;
Characteristic(String s)
{
this.s = s;
print("Creating Characteristic " + s);
}
protected void dispose()
{
print("disposing characteristic " + s);
}
}
class Description{
private String s;
Description(String s)
{
this.s = s;
print("Creating Description " + s);
}
protected void dispose()
{
print("disposing description" + s);
}
}
class LivingCreature{
private Characteristic p =
new Characteristic("is alive");
private Description t =
new Description("Basic living creature");
LivingCreature()
{
print("livingcreature");
}
protected void dispose()
{
print("livingCreature dispose");
t.dispose();
p.dispose();
}
}
class Animal extends LivingCreature{
private Characteristic p =
new Characteristic("has heart");
private Description t =
new Description("animal not vegetalbe");
Animal(){print("Animal()");}
protected void dispose()
{
print("Animal dispose");
t.dispose();
p.dispose();
super.dispose();
}
}
class Amphibian extends Animal
{
private Characteristic p =
new Characteristic("can live in water");
private Description t =
new Description("Both water an land");
Amphibian()
{
print("Amphibian()");
}
protected void dispose()
{
print("Amphibian dispose");
t.dispose();
p.dispose();
super.dispose();
}
}
public class Frog extends Amphibian{
private Characteristic p = new Characteristic("Croaks");
private Description t = new Description("Eats bugs");
public Frog()
{
print("Forg()");
t.dispose();
p.dispose();
super.dispose();
}
public static void main(String[] args)
{
Frog frog = new Frog();
print("bye!");
frog.dispose();
}
}/* output: 消费的顺序和初始化的顺序相反
Creating Characteristic is alive
Creating Description Basic living creature
livingcreature
Creating Characteristic has heart
Creating Description animal not vegetalbe
Animal()
Creating Characteristic can live in water
Creating Description Both water an land
Amphibian()
Creating Characteristic Croaks
Creating Description Eats bugs
Forg()
disposing descriptionEats bugs
disposing characteristic Croaks
Amphibian dispose
disposing descriptionBoth water an land
disposing characteristic can live in water
Animal dispose
disposing descriptionanimal not vegetalbe
disposing characteristic has heart
livingCreature dispose
disposing descriptionBasic living creature
disposing characteristic is alive
bye!
Amphibian dispose
disposing descriptionBoth water an land
disposing characteristic can live in water
Animal dispose
disposing descriptionanimal not vegetalbe
disposing characteristic has heart
livingCreature dispose
disposing descriptionBasic living creature
disposing characteristic is alive
*///~

三,当一个成员对象存在于其它一个或多个对象共享的情况时,也许就必须使用引用计数来跟踪仍旧访问着共享对象的对象数量了.

//: polymorphism/ReferenceCounting.java
// Cleaning up shared member objects
package object;
import static net.mindview.util.Print.*; class Shared{
private int refcount =0;
private static long counter = 0; //记录该类总共的对象个数
private final long id = counter++; //final 表示不希望再对象生命周期内ID的值被改变
public Shared()
{
print("Creating " + this);
}
public void addRef(){refcount++;} //记录同一个对象被引用的次数
public void dispose()
{
if(--refcount == 0) //当被引用数只有一个时执行清理
print("Disposing " + this);
}
public String toString(){return "Share " + id;}
}
class Composting{
private Shared shared;
private static long counter = 0;
private final long id = counter++;
public Composting(Shared shared)
{
print("Creating " + this);
this.shared= shared;
this.shared .addRef();
}
protected void dispose()
{
print("disposing " + this);
shared.dispose();
}
public String toString(){return "Composing " + id;}
}
public class ReferenceCounting{
public static void main(String[] args)
{
Shared shared = new Shared();
Composting[] composting = { new Composting(shared),
new Composting(shared),new Composting(shared),
new Composting(shared),new Composting(shared),
};
for(Composting c : composting)
c.dispose();
}
}/* output:
Creating Share 0
Creating Composing 0
Creating Composing 1
Creating Composing 2
Creating Composing 3
Creating Composing 4
disposing Composing 0
disposing Composing 1
disposing Composing 2
disposing Composing 3
disposing Composing 4
Disposing Share 0
*///:~

最新文章

  1. hsql数据库使用详解(入门)及快速使用
  2. 命令行选项解析函数(C语言):getopt()和getopt_long()
  3. 20步打造最安全的NGINX WEB服务器
  4. 数据库中间件mycat简单入门
  5. Unity3D脚本中文系列教程(十二)
  6. eclipse.ini配置eclipse的启动参数
  7. 剑指offer_数组中的逆序对
  8. 基于C#的Appium自动化测试框架(Ⅰ)
  9. eclipse 更改官方配色
  10. 我的Python之旅第四天
  11. js中call和apply的作用和用法
  12. docker-mysql-cron-backup不能执行任务
  13. [Hibernate] 通过 properties 类和 hql 语句进行动态查询
  14. python 3以上版本使用pickle.load读取文件报UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6
  15. C#模拟HTTP请求Post JSON
  16. 网站nginx负载下因程序错误导致多节点重复处理请求的解决过程
  17. linux下C获取系统时间的方法
  18. 搭建局域网SVN代码服务器
  19. HttpPost导包遇到的问题
  20. Struts2页面开发中常用标签使用说明

热门文章

  1. package.json版本号
  2. promise用法详解
  3. python---网络之邮件发送
  4. Hive记录-配置客户端可视化管理工具远程连接
  5. python -- 进程线程协程专题
  6. centos7 redmine安装过程
  7. Postfix 邮件服务 - PostfixAdmin
  8. JavaScript之不规则Table转化为可定点索引td节点的网格矩阵【插件】
  9. Flask最强攻略 - 跟DragonFire学Flask - 第八篇 实例化Flask的参数 及 对app的配置
  10. 初识java和C的不同