如何在JAVA中实现“析构函数”!!(急,高分)

dongshaojie 2004-05-06 07:13:27
例如:有3个JFrame ,分别是 A,B,C。
A 中 构造出 B,B 中构造出 C 。
在A中实现一个“析构函数”,执行时可以把 B 和 C 上所有的资源都释放掉!

注意:B,C上可能还有其他的构件,例如一些按钮,线程等。。。
这些东西也要一起释放!!

问题:这个“析构函数”要如何实现,最好能是其他JFrame通用的!
...全文
664 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dream_lover 2004-09-15
  • 打赏
  • 举报
回复
mark
binny 2004-05-07
  • 打赏
  • 举报
回复
唉~~~
fqyugu 2004-05-07
  • 打赏
  • 举报
回复
mark,我也不懂
廖雪峰 2004-05-07
  • 打赏
  • 举报
回复
你的设计有问题:干嘛要在A中构造B,B中构造C?使用MVC模式让Controller控制Frame的生命周期
Wolf0403 2004-05-07
  • 打赏
  • 举报
回复
非内存的资源只能在 try..finally{这里} 被回收。这是所有 GC 语言的局限
marvy 2004-05-07
  • 打赏
  • 举报
回复
做自己该做的事,其余的交给JVM执行就可以了。

同意 JavaVsNet(JavaVsNet) 。
紫黑蓝白 2004-05-07
  • 打赏
  • 举报
回复
dispose();这个方法我知道,也试过了!
它释放的资源不完全,例如线程,端口,COM 口 等。。。这些资源它都无法释放!
-------------------------------------------------------------------------

去。。。!
JAVA的垃圾回收机制是带点随机的,,,你只能用system.gc()来“建议”它做垃圾收集,
至于它想什么时候收集,收集什么,这不是你能定置的!

当不再有任何一个其它的对象对某对象A的引用时,A就会被列到“黑名单”里,随时恭候被回收。

你最好再仔细查查是不是哪里还隐含了什么对象对某对象B的引用,导致B不能被回收。


随便,如果你是用runtime.exec什么的来启动进程的,还可以用此函数的返回值process来kiil线程。
ai92 2004-05-07
  • 打赏
  • 举报
回复
没考虑那么深过
我认为JVM提供的内存回收机制因该就能满足一般的需求吧
不然这个东西只能给Java带来骂名~~~~~
BigBangBug 2004-05-07
  • 打赏
  • 举报
回复
所谓终结器也只不过是能马上告诉jvm“这个类我不用了”而已,如果不说,jvm就会用自己的一套算法来计算你那些类不用。所以归根到底,你不需要的类,jvm都会回收,只是迟早问题。
BigBangBug 2004-05-07
  • 打赏
  • 举报
回复
如果就你题目所说的情况,根本就不需要自己搞什么析构函数,只要将b=null,c=null,之后就不用理了,不要用C++那套思维来编写java程序。要知道java就是设计为不用,也不能让用户自己随便释放内存,我们所能做的就是告诉jvm“这个类,我不用了“,仅此而已。
ai92 2004-05-07
  • 打赏
  • 举报
回复
Wolf0403(完美废人)(灌水是我无言的抗议)

哈哈,废人也来啦~~~~~~~~~~~
dongshaojie 2004-05-06
  • 打赏
  • 举报
回复
dispose();这个方法我知道,也试过了!
它释放的资源不完全,例如线程,端口,COM 口 等。。。这些资源它都无法释放!

我现在主要是已经有写好的几个程序!他们单独运行都是可以的!
现在我要做一个类似“菜单”的程序把他们关联起来!并可以互相切换,所以必须当关闭其中一个程序的时候释放他所占用的资源!!
overawe 2004-05-06
  • 打赏
  • 举报
回复
我觉的自己写个自己调用不就行了 记得和构造顺序一致就好了...
marvy 2004-05-06
  • 打赏
  • 举报
回复
:~)

楼主可以查看一下JFrame继承Window而来的dispose()方法。

只需在A中调用B和C的dispose()方法,就可以实现将B与C中的所有占用资源释放,包括线程等等。

下面是Window的dispose()的解释:
---------------------------------
Releases all of the native screen resources used by this Window, its subcomponents, and all of its owned children. That is, the resources for these Components will be destroyed, any memory they consume will be returned to the OS, and they will be marked as undisplayable.

The Window and its subcomponents can be made displayable again by rebuilding the native resources with a subsequent call to pack or show. The states of the recreated Window and its subcomponents will be identical to the states of these objects at the point where the Window was disposed (not accounting for additional modifications between those actions).
-------------------------------------
fishstudio 2004-05-06
  • 打赏
  • 举报
回复
我的意见是,你在A的事件某一个响应里可以结束B,C的线程

这样,所有的组件在BC上都失去响应

但是不需要终结器。这是一点点心得
dongshaojie 2004-05-06
  • 打赏
  • 举报
回复
veinstone(脉石)

能举个简单的例子吗??
veinstone 2004-05-06
  • 打赏
  • 举报
回复
终结器的行为往往是不可预知的,通常还很危险,可能导致错误的运行行为、低下的执行效率和移植性的问题,应该尽量避免使用。

终结器和C++中的析构函数不同,析构函数是释放同一个对象相关资源的,相对于构造函数。Java中的垃圾回收机制释放无用资源的内存占用,析构函数通常还可以释放非内存资源,而Java中使用try-finally来释放非内存资源。

终结器有两个无法保证:

1) 终结器无法保证立刻启动,也就是说在对象无用和被终结之间的时间无法估计。

2) 终结器无法保证所有终结动作全部会发生,所以不应该使用终结器来更新关键的永续状态。

System.gc()和System.runFinalization()仅仅能够增加终结器执行的可能性,但还是不能确保,只有方法System.runFinalizersOnExit()和Runtime.run()能够保证终结器的行为,但它们本身有一定的缺陷,所以不提倡使用它们。

进行终结行为的时候,可能会发生异常,这种异常场无法捕捉,这就导致了资源为被终结情况的发生。

解决之道:

1) 提供一个明确的终结方法,要求客户端在每个实例不再需要时调用它。但是,每个实例必须自己保留并追踪其是否已经被终结。明确的终结方法必须使用一个成员来记录对象不再有效,而其他方法必须检查这个成员,如果终结后在调用,就抛出IllegalStateException异常,典型的终结方法是InputStream和OutputStream的close方法。

2) 明确的终结方法通常和try-finally结合使用,以确保可以“立刻终结”。

使用终结器的作用:

1) “安全网”的作用,即使“无法说服自杀者放弃自杀,在他跳楼之后也可以起到安全保护作用”,专门用来捕获漏网之鱼。

客户端,忘记调用终结方法的时候,不致于资源永远得不到归还,“稍候归还总比永远不还得好”。

2) 第二种用途与对象的本地对等体(native peer)有关。本地对等体是一个本地对象,普通对象通过本地方法(native method)委托给一个本地对象。因为本地对等体不是一个普通对象,所以垃圾回收器不会知道它,当它的普通对等体被回收的时候,它不会被回收。在本地对等体不拥有关键资源的前提下,终结函数是执行这项任务的最合适的工具。



使用终结函数时,“终结函数链(finalizer chain)”并不会被自动执行,因而子类的终结函数必须手工调用超类的终结函数。
veinstone 2004-05-06
  • 打赏
  • 举报
回复
finaly()函数
viano 2004-05-06
  • 打赏
  • 举报
回复


java 自动回收垃圾!

要哪个 干什么?
sxhv998 2004-05-06
  • 打赏
  • 举报
回复
把b和c的实例设为null

然后 system.gc();

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧