社区
Java SE
帖子详情
java有没有"析构"函数呢?
lgb0532
2001-11-06 07:32:44
对于一个java类,可以使用其构造函数来初始化其参数,
一个类实例出了在其作用范围后系统将释放其资源,
请问java可不可以写一个函数让类实例被销毁时系统自动调用呢?
就象C++中的"析构"函数一样? 谢谢.
...全文
3240
17
打赏
收藏
java有没有"析构"函数呢?
对于一个java类,可以使用其构造函数来初始化其参数, 一个类实例出了在其作用范围后系统将释放其资源, 请问java可不可以写一个函数让类实例被销毁时系统自动调用呢? 就象C++中的"析构"函数一样? 谢谢.
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lgb0532
2001-11-08
打赏
举报
回复
谢谢 hahaha88、lusxiao 以及各位的指点,
那么说来在cpu被占用的情况下先调用system.runFinalization(),再调用system.gc(),也并不能保证它一定会成功,问题是如果这么调用了,只要cpu空闲下来就会处理吗?
还有,如果我在一个线程里频繁做system.runFinalization()和system.gc(),对机器性能影响不大,是吗?谢谢~!
hahaha88
2001-11-07
打赏
举报
回复
析构除了可被用来释放内存资源之外,还可以用来释放其他资源,如socket资源,
thread资源/同步信号资源,文件资源,硬件资源。。。等。
好象只有finalize()方法会在该object被GCed的时候被系统自动调用。但何时
不保证(比如GC很晚才发生或根本没发生),由哪个线程出手来调用finalize()
也不规定,。。。故finalize()不是非常可靠的方法。
比较可靠的方法是自己写close方法,并在把该object设为null之前,自己主动地在
一个合适的线程里调用这个close方法
lgb0532
2001-11-07
打赏
举报
回复
谢谢各位的指点,我是想释放一个类实例占用的资源。
但是又不想调用其中的方法,而是要自动释放,所以想到了"析构".
现在已经找到了一个方法,
可以先调用system.runFinalization(),再调用system.gc()来触发重载了finalize()方法的类方法来释放资源,相当于"析构"。
但是不知道,如果一个线程起来后,隔一段时间这样运行一次,对系统性能有什么影响?
hy_yxj
2001-11-07
打赏
举报
回复
重载finalize()方法,之后在想要释放时或者超出作用域的时候调用System.gc()
lusxiao
2001-11-07
打赏
举报
回复
当你的程序有大量耗时运算,或主机环境有别的程序抢占cpu资源,以使你的jvm没有cpu时间片来运行垃圾收集线程(该线程优先级最低),就会有我和hahaha88兄的情况。
你的程序没有大量计算,或你的计算机较快所以每次都成功。因为system.gc()并不是直接启动垃圾收集,所以就算有影响,也不会有很多的性能损失。
本来finialize()就是用来给你释放某些外部资源的。比如,你用jni,其中分配了内存,那么内存的释放就可以放在finialize()(参见thinking in java)。
54sunboy
2001-11-07
打赏
举报
回复
没有!JAVA有垃圾收集器,如果要自己来做可以用finialize()
kfx
2001-11-07
打赏
举报
回复
finialize()
win_sharp
2001-11-07
打赏
举报
回复
thinking in java 中对这个问题有非常详细的描述,可以参看!
lgb0532
2001-11-07
打赏
举报
回复
但是我使用system.runFinalization(),再调用system.gc()每次都成功啊, 我现在是想知道这样对系统性能有什么影响,谢谢.
lusxiao
2001-11-07
打赏
举报
回复
java的垃圾收集是虚拟机管理的。调用system.gc()只是提醒jvm做垃圾收集,并不是一定会实现。这还引起了java高手的一场论战。所以没有必要隔一段时间运行一次System.gc。
因此finalize()并不一定会被调用。就象hahaha88兄说的一样。
lgb0532
2001-11-07
打赏
举报
回复
各位,来讨论一下吧,必定送分!
lgb0532
2001-11-07
打赏
举报
回复
各位,来讨论一下吧,必定送分!
waao
2001-11-06
打赏
举报
回复
没有,有释放资源的方法。如finalize()方法,垃圾回收过程中被系统自动调用。
hello_wyq
2001-11-06
打赏
举报
回复
内存管理都没有了,你要析够干什么?
yuppy_lew
2001-11-06
打赏
举报
回复
析构函数用不着你操心编译器会替你做这些繁琐的事的
totkid
2001-11-06
打赏
举报
回复
finalize()
Altair
2001-11-06
打赏
举报
回复
没有
有很多用public void destroy()释放资源
在Direct3D程序中运用碰撞检测
几乎所有的3D游戏都离不开碰撞检测——无论是各物体之间的碰撞检测,还是物体与场景之间的碰撞检测。在真实世界中,你是很自然地不能穿墙而过的,所以很多人在玩各种3D游戏的时候自然而然的忽视了碰撞检测这一过程的存在。然而,碰撞检测的过程是重要的。如果没有它,你在CS中就会毫无遮拦的飞来飞去——如果考虑重力的话,则会一直不停地往下掉,直到符点数溢出(或你受不了这一漫长的过程而离开游戏)为止。碰撞检测是在编
Direct3D射线与AABB碰撞检测实战示例
Direct3D 是 DirectX 的核心组件之一,专为高性能 3D 图形渲染设计,广泛应用于游戏开发和实时图形处理领域。其架构由多个关键模块组成,包括设备(Device)、交换链(SwapChain)、资源(Resource)与命令队列(Command Queue)等,构成了现代图形渲染的基础。射线碰撞检测(Ray Intersection Detection)是指从一个起点出发,沿特定方向发射一条无限延伸的射线(Ray),并判断该射线是否与某个几何体(如三角形、包围盒、网格等)相交的过程。
浅谈
Java
3D、 OPENGL、VRML、DIRECT3D
http://www.blog
java
.net/hongjunli/archive/2006/05/04/44542.html
浅谈
Java
3D、 OPENGL、VRML、DIRECT3D
一、
JAVA
3D的优势:
作为一名3D图形学习者,无论是游戏开发、科学计算,还是生物技术,还是虚拟现实(Virtual Reality)、仿真技术,
Java
3D都是很优秀的选择。理由如下:
1)基于
Java
技术,秉承了
Java
的一切
Direct3D学习笔记(四)——碰撞检测(Bounding Box)
一、碰撞检测
函数
(MyDirectX.cpp) int Collision(SPRITE sprite1, SPRITE sprite2) { RECT rect1, rect2; rect1.left = (long)sprite1.x; rect1.right = (long)sprite1.y; rect1.top = (long)sprite1.x + sprite1.width
基于Direct3D的PC赛车游戏开发:从渲染管线到碰撞检测实战解析
在Windows桌面端开发3D赛车游戏,绕不开图形API的选型与底层渲染原理。Direct3D作为微软官方图形接口,凭借对渲染管线、顶点缓冲、着色器编程的完整控制,成为学习计算机图形学和游戏渲染底层逻辑的绝佳路径。与Unity等商业引擎不同,Direct3D要求开发者手动管理交换链、矩阵变换、资源绑定等核心环节,这虽然增加了工程复杂度,却能让人真正理解3D场景从顶点到像素的完整流水线。对于赛车游戏而言,不仅需要绘制赛道与车辆模型,还要实现视角跟随、碰撞检测、AI路径寻路等交互逻辑,这些知识同样适用于三维仿真
Java SE
62,620
社区成员
307,251
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章