finalize()是由JVM自动调用的,你可以用System.gc(),但JVM不一定会立刻执行,JVM感觉内存空间有限时,才会开始执行finalize(),至于新的对象创建个数和被收集个数不同是因为收集的对象只和JVM的垃圾收集策略有关。
1.构造函数
要点:
构建器(Constructor)属于一种较特殊的方法类型,因为它没有返回值.这与 void返回值存在着明显的区别。对于void返回值,尽管方法本身不会自动返回什么,但仍然可以让它返回另一些东西。构建器则不同,它不仅什么也不会自动返回,而且根本不能有任何选择.若创建一个没有构件器的类,则编译器会自动创建一个默认构件器.
2.finalize()和gc()
(1)问题:finalize()函数是干嘛的?Java不是有Garbage Collection(以下简称gc)来负责回收内存吗?
回答:
gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行内存回收就要靠finalize().
举个例子来说,当java 调用非java方法时(这种方法可能是c或是c++的),在非java代码内部也许调用了c的malloc()函数来分配内存,而且除非调用那个了 free() 否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法调用它(free()).
finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.
(2)问题:finalize()在什么时候被调用?
回答:
有三种情况
1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.
2.程序退出时为每个对象调用一次finalize方法。
3.显式的调用finalize方法
除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因.
3. this
要点:
this关键字只能在方法中使用,它能为调用该方法的对象提供相应的句柄,使得同一个类产生的不同对象实例在调用同一方法的时候,系统能判断出是哪一个对象在进行调用.
比如:
MyObject a=new MyObject();
MyObject b=new MyObject();
a.f();// (3)
b.f();// (4)
编译器在编译的时候,实际上是将(3),(4)句解释为
MyObject.f(a);
MyObject.f(b);
的,这样就将调用了该方法的对象的信息传到了方法中,也就是传给了this,就可以通过this表示调用该方法的对象实例.
用this的概念还可以解释为什么在静态方法中不能调用非静态方法和元素,这是因为静态方法中没有this,也就是说我们不能获得调用该方法的对象的句柄.既然找不到这个对象实例,我们又怎么能够在其中调用对象实例的方法和元素呢?
那为什么静态方法没有this呢?用静态方法的概念可以来理解这个问题.静态方法是类方法,是所有对象实例公用的方法.它不属于某一个具体的对象实例,因此也无法用this来体现这个实例.这和非静态方法是不一样的.打个比方,在一个局域网内的几个用户每个人都有一台客户机,但都访问一台公共的服务器.对于每台客户机来说,它的this就是使用它的用户.而对于服务器来说,它没有this,因为它是大家公用的,不针对某一个具体的客户.
4.对象初始化
要点:
1.对象只有在创建的时候,需要使用它的时候才进行初始化,否则永远都不会初始化.
2.对象进行初始化是有一定顺序的,无论在定义的时候各个成员的摆放位置如何.首先是静态成员和对象,然后是非静态成员和对象,最后才运行构造器.
3.静态成员和对象有且只有一次初始化过程,这个过程发生在第一次创建对象或者第一次使用类的静态成员和对象的时候.
以一个名为Dog的类为例,它的对象实例初始化过程如下:
(1) 类型为Dog的一个对象首次创建时,或者Dog类的static方法/static字段首次访问时,Java解释器必须找到Dog.class(在事先设好的类路径里搜索)。
(2) 找到Dog.class后,它的所有static初始化模块都会运行。因此,static初始化仅发生一次?D?D在Class对象首次载入的时候。
(3) 创建一个new Dog()时,Dog对象的构建进程首先会在内存堆(Heap)里为一个Dog对象分配足够多的存储空间。
(4) 这种存储空间会清为零,将Dog中的所有基本类型设为它们的默认值
(5) 进行字段定义时发生的所有初始化都会执行。
(6) 执行构建器。正如第6章将要讲到的那样,这实际可能要求进行相当多的操作,特别是在涉及继承的时候
5.数组的初始化
数组包括基本数据类型数组和对象数组,其中对于对象数组的初始化,经常会出现"Exception"错误.比如下面的程序
问题代码如下:
public userInfo[] getUsersInfo() {
userInfo[] usersInfo=null;
if (users.size()!=0) {
usersInfo=new userInfo[users.size()];
for(int i=0;i< usersInfo.length;i++) {
//+-------------------出问题的地方-----------------
usersInfo[i].name=((User)(users.elementAt(i))).name;
usersInfo[i].type=((User)(users.elementAt(i))).type;
usersInfo[i].userID=((User)(users.elementAt(i))).userID;
//+-------------------出问题的地方-----------------
}
System.out.println("here");
return usersInfo;
}else {
return null;
}
}
其中userInfo的定义为
class userInfo{
userInfo(String name,int type,int userID){
this.name=name;
this.type=type;
this.userID=userID;
}
String name;
int type;
int userID;
}
运行到程序中标出的问题区域时,系统显示NullPointerException,为什么会这样呢?
这是因为,Java在定义数组的时候
usersInfo=new userInfo[users.size()];
并没有给数组元素分配内存,它只是一个句柄数组,数组中的对象还没有初始化.因此数组中的每个对象都需要new之后才可以访问.例如:
A[] a=new A[2];
for(int i=0;i<2;i++)
a[i] = new A();
这样才能a[i].someMethod()
因此上面的程序应该改为
public userInfo[] getUsersInfo() {
userInfo[] usersInfo=null;
if (users.size()!=0) {
usersInfo=new userInfo[users.size()];
for(int i=0;i< usersInfo.length;i++) {
//+-------------------修改的地方-----------------
usersInfo[i]=new userInfo(((User)(users.elementAt(i))).name,
((User)(users.elementAt(i))).type,
((User)(users.elementAt(i))).userID);
}
//+-------------------修改的地方-----------------
return usersInfo;
}else {
return null;
}
}
就没问题了简单来讲,finalize()是在对象被GC回收前会调用的方法,而System.gc()强制GC开始回收工作纠正,不是强制,是建议,具体执行要看GC的意思简单地说,调用了 System.gc() 之后,java 在内存回收过程中就会调用那些要被回收的对象的 finalize() 方法。
分享到:
相关推荐
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat
【毕业设计】Python基于图神经网络与多任务学习的图像分类器_pgj
【毕业设计】本科毕业设计基于麦克风阵列的声源定位系统
【毕业设计】安卓Android图书馆占座app设计毕业源码案例设计_pgj
本项目是自己做的设计,有GUI界面,完美运行,适合小白及有能力的同学进阶学习,大家可以下载使用,整体有非常高的借鉴价值,大家一起交流学习。该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。
那个大佬的temp包
【毕业设计】基于android的酒店预订系统,ReactNative_pgj
文章首先简述了Kotlin的语言特点及其重要性,接着列举了一系列官方和第三方提供的教程链接,包括文档、视频和在线学习平台,确保不同程度学习者的需要均能得到满足。还给出了从基础语法到面向对象编程的实际代码例子,特别是协程和Android应用程序的实例。随后列出众多实用的开源项目、开发框架与插件工具,为开发者提供更多的实践方向和支持。
基于matlab平台的 BP的水果识别.zip
真实拍照的文档目标分割数据集,标注软件是Labelme,标签格式是.json文件,标签统计结果SH656个,可用于计算机视觉目标检测或者实例分割。
【断点续传】FTP断点续传搭建
计算机行业面试必看:你该知道的面试问题与回答技巧
内容概要:本文档详细介绍了在数据结构课程设计中,围绕哈夫曼树展开的设计任务。它首先提出了一套完整的流程——从读取文本文件到构建哈夫曼编码、译码直至实现文本文件的基本压缩存储机制。文档描述了哈夫曼编码原理的应用,展示了如何根据文本中出现频率不同的字符生成最优前缀编码,并提供了具体编码和译码的方法步骤。接着阐述了哈夫曼树的数据结构及其构建过程中涉及到的关键点如频率排序、二叉树节点管理、递归回溯编码路径等知识点;此外,针对特定功能模块提供了相应的伪代码段落,使读者更容易理解和模仿操作;文中还涵盖了对最终结果的测试案例及其实验分析,验证了算法效率。最后一节是对课程设计的学习感悟,强调了这次项目带来的技术成长和个人编程思维进步。 适合人群:适合计算机科学专业的大专生、本科生以及对数据结构、哈夫曼编码感兴趣的技术爱好者;尤其对于那些希望通过实例来深化理论认识的学生来说是非常有价值的参考资料。 使用场景及目标:本文旨在帮助初学者理解和掌握经典的哈夫曼编码原理和技术实现。它可以作为课堂上讲解哈夫曼编码算法的实际例子;同时也能为想要自己动手尝试编码的人提供详细的指导材料,从而达到理论与实践相结合的教学目的。此外还可以用来辅助理解诸如文件压缩这样的实际应用场景。 其他说明:本实验涉及了大量关于C/C++语言的基础语法知识,并使用了一些较为专业的概念和技术手段,在跟随教程练习之前最好先确保有一定的预备知识。
基于matlab平台的 ORL的人脸考勤系统.zip
"深入探究:Comsol锂电池电化学仿真及热管理模型构建,涵盖循环寿命衰减、热失控仿真与锂沉积建模技术",COMSOL锂电池电化学仿真及热管理模型研究:探究锂电池循环寿命衰减与热失控仿真的技术应用,comsol锂电池仿真 电化学仿真,锂电池模拟仿真,锂电池循环寿命衰减,锂电池热管理模型,锂电池热失控仿真,锂沉积建模 ,comsol锂电池仿真; 电化学仿真; 锂电池模拟仿真; 锂电池循环寿命衰减; 锂电池热管理模型; 锂电池热失控仿真; 锂沉积建模,《锂电池仿真与热管理模型研究》
这是一个用于管理AI提示词的Edge/Chrome浏览器插件,它可以帮助你方便地组织、管理和使用各种AI提示词。
battery_mm_3358_e.pdf
"COMSOL瓦斯抽采技术:双重介质模型的应用与实践","基于COMSOL的瓦斯抽采双重介质模型研究",comsol瓦斯抽采-双重介质模型 ,comsol;瓦斯抽采;双重介质模型,双重介质模型在COMSOL瓦斯抽采中的应用
内容概要:本文系统介绍了国产通用人工智能(AGI)科技公司DeepSeek及其开源推理模型DeepSeek-R1。文章覆盖了DeepSeek的定义与特点,包括强大的开源推理模型、免费商用、处理复杂任务和支持多样应用场景的能力。此外,文档详细解释了DeepSeek的各种功能如智能对话、文本生成、知识推理等,并深入探讨了如何根据不同任务需求选用适合的模型,包括推理模型和通用模型,同时还给出了模型选择和优化的策略。对于提示语的应用,文档不仅展示了其重要作用,还讲述了常见的提示语设计误区及其应对办法。此外,针对AIGC(人工智能生成内容)的风险识别和治理策略,文档提出了相关评价标准,并提及了国家级项目的支持。文章通过一系列实际应用案例和技术原理,帮助读者深入了解DeepSeek的强大功能,指导用户从入门到精通地应用DeepSeek进行复杂的人工智能开发。 适合人群:有兴趣了解或从事人工智能、自然语言处理及相关领域的从业者,尤其是那些希望深入了解和使用国产AI模型的技术人员、研究者和产品经理。 使用场景及目标:①希望使用国产免费的开源模型进行智能对话、文本生成等复杂应用的研发与部署。②通过学习和掌握DeepSeek的功能和使用方法,加速从概念到成品的技术落地过程。③理解不同应用场景下提示语的设计要点,以最大化模型的应用效率和效果。 其他说明:为了帮助用户熟练掌握DeepSeek的各项功能,文中穿插了许多实战技巧,旨在通过实践加深理解和巩固技术。此外,本文还提到了与DeepSeek相关的两项国家级科研项目的支持情况,强调了模型的重要意义和技术优势。
【毕业设计】一款设计精美、体验优良的地图信息展示小程序,一个更有意思的同学录,可以在小程序中查看班级同学的毕业去向以及地域分布,多联(蹭)系(饭)