方法一:垃圾回收器
垃圾回收器是Java平台中用的最频繁的一种对象销毁方法。垃圾回收器会全程侦测Java应用程序的运行情况。当反先有些对象成为垃圾时,垃圾回收 器就会销毁这些对象,并释放这些对象所占用的内存空间。在这里,程序开发人员需要知道,在哪些情况下垃圾回收器会认为这些对象是垃圾对象。通常情况下,如 果发生以下两种情况时,系统会认为这些对象是垃圾对象,需要销毁。
一是将一个NULL值赋值给对象。如用户先建立了一个对象str1。对象用完了之后,再利用赋值语句,将NULL值赋值给这个对象str1,即使用 str1=NULL的方式将NULL值赋值给这个对象。此时这个对象与内存中对象的存储地址之间就失去了联系。此时内存中的对象就好像成为了一个无主的对 象,就会被垃圾回收器销毁。不过这也有例外。如现在同一个对象有两个名字,分别为str1与str2。此时若只是将NULL值赋值给str1,那么内存的 这个对象仍然有一个主人,即str2。此时这个对象还暂时不会被垃圾回收器回收。除非在代码中讲这个对象所关联的所有对象名字都赋值为NULL。此时这个 对象才变为无主的对象,才会被垃圾回收器回收。在Java中定义自己的工具库
二是对象其超出了作用范围,这个这个对象就被认为是垃圾对象,被被垃圾回收器回收并释放内存。其实对象跟变量一样,其也有作用域。当超过这个作用域 的话,跟变量一样,这个对象也就无效了,其他地方不能够再引用这个对象。此时这个对象就是名存实亡了。为此垃圾回收器也把这种超过作用范围的对象当作垃圾 对象来处理。所以说,如果程序员要让对象中的某些成员变量或者成员方法一直有效的话,就需要采用static关键字,让其在变量销毁时仍然有效,或则仍然 可以调用这些成员变量与成员方法。
方法二:finalize方法
虽然说垃圾回收器已经是一个比较完善的对象销毁机制,但是其并不能够解决Java语言中所有对象的销毁问题。如Java语言平台中,创建对象主要有 两种方式,分别为利用NEW关键字来创建(这是对象创建的主要方式)与不适利用NEW关键字来创建。如果Java语言中某些对象不是利用new关键字为对 象在内存中分配一块存储区域,那么这种类型的对象就不能够被垃圾回收站回收。即使在代码中将NULL值赋值给这个对象,仍然不能够被垃圾回收器回收。虽然 这种对象比较少,但是毕竟存在。为了解决这类对象的回收与内存释放问题,在Java语言中提供了一个finalize的方法。通过这个方法可以显示的让系 统回收这个对象。这是一个Object类的方法。通常情况下,这个方法是被声明为protected。程序开发人员在必要的时候,可以在自定的类中定义这 个方法。假设现在程序开发人员定义了这个方法,那么在对象销毁时,垃圾回收器会先采用这个方法来销毁对象。并且在下一次垃圾回收动作发生时,最终释放对象 的内存。
可见,采用了finalize 方法,虽然可以让这个对象被垃圾回收器回收,但是其原理是不同的。垃圾回收器是先调用这个方法,然后在下次运行这个垃圾回收作业时再释放其占用的内存。另 外需要注意的是,这个方法并不一定会保证发生。也就是说,相对来讲,其安全性并没有垃圾回收器那么的高。故在实际创建对象时,最好还是采用new关键字来 创建比较安全,也更加的方便。因为在利用New关键字来创建对象时,在代码中不需要加入另外额外的代码。所以从安全性与便利性上来说,笔者都建议采用 new方法为对象在内存中分配存储区域,而不建议采用其他的方式。在采用垃圾回收器的时候,其会自动检测对象的状态,而不需要程序员告知。其发现对象超出 了作业域范围或者对象被重置为空时,其就会被自动销毁并释放对象所占用的内存,这种方式处理起来相对来说更加的安全与便利。
方法三:利用System.gc方法强制启动垃圾回收器
垃圾回收器其实自动启动的。也就是说,垃圾回收机制起会自动监测垃圾对象,并在适当的时候启动垃圾回收器来销毁对象,释放内存。但是这个垃圾回收器 也会有不合作的时候。也就是说,这个垃圾回收器不受程序代码的控制,其具体执行的时间也会不确定,从而导致上面的finalize方法无法执行,某些对象 无法及时销毁。为此有时候需要利用代码来强制启动垃圾回收器,来销毁对象。
笔者平时在给一些学员培训时,往往将这个垃圾回收器比喻成医院里的护士。平时的时候,护士会每隔一段时间来进行查房,看看病人有没有什么问题。不过 在必要的时候,病人也可以通过警铃来呼叫护士。如当盐水挂完了就可以要求护士来更换盐水。其实这个护士定期查房就好像是垃圾回收器会根据应用程序的运行情 况来定时的或者不定时的启动。而这个警铃就好像是这个System.go方法。在有需要的时候,程序开发人员可以在代码中调用这个方法,来强制让护士来病 房,即强制启动这个垃圾回收器。采用这个方法,给程序开发人员多了一种主动权,而不需要被动的等着垃圾回收器的启用。有时候,在代码种类利用这个方法不定 期或者定期的强制启动垃圾回收器,对及时销毁垃圾对象能够起到一个辅助与保障作用。
相关推荐
"JAVA中销毁一个对象的方法" JAVA 中销毁一个对象的方法可以分为三种:垃圾回收器、finalize 方法和 System.gc 方法。 方法一:垃圾回收器 垃圾回收器是 Java 平台中用的最频繁的一种对象销毁方法。垃圾回收器会...
静态工厂方法的一个例子是Java集合框架中的`Collections.emptyList()`,它返回一个不可变的空列表。此外,Builder模式在有多参数构造器时特别有用。Builder模式允许逐步构建对象,避免了构造函数参数过多导致的代码...
在Java编程语言中,对象的生命周期和销毁是一个关键的概念,它涉及到内存管理和性能优化。下面我们将详细讨论Java中对象的创建、使用以及销毁的过程。 首先,对象的创建通常通过`new`关键字完成,这会在堆内存中...
这个方法接受两个参数:前缀和后缀,返回一个`File`对象表示新创建的临时文件。例如: ```java import java.io.File; import java.io.IOException; public class TempFileExample { public void createTempFile()...
继承是另一个关键特性,它允许创建一个新类(子类)从已存在的类(父类)继承属性和方法。这样,子类不仅可以拥有父类的所有功能,还可以添加自己的特性和行为。Java支持单一继承,即一个类只能有一个直接父类,但...
- 在构造函数中,可以使用`this`关键字调用同一个类中的另一个构造函数。 - 调用必须是构造函数的第一条语句。 2. **通过`super`调用父类构造函数**: - 子类的构造函数可以通过`super`关键字调用父类的构造...
在Java中,如果一个类没有显式定义构造方法,编译器会自动提供一个默认的无参构造方法。这个默认构造方法会确保每个新创建的对象都有一组初始值。 无参构造方法通常用于简单的初始化,例如设置默认值。当创建对象时...
Java中的基本数据类型变量和对象的名称引用变量如定义在方法中,都为局部变量。但对象本身不一定是局部生命周期。如函数外存在其他对该对象的引用变量,则该对象的生命周期延伸至该其他引用变量所在的块。 如从...
6. **接口与对象的多态性**:在Java中,通过实现接口,一个类可以具有多种行为。多态性允许我们使用父类引用指向子类对象,这样在运行时可以根据实际对象类型执行相应的操作,增强了代码的灵活性。 7. **构造器链**...
`borrowObject`方法负责从池中取出一个对象,`returnObject`方法则将对象放回池中。为了保证线程安全,这里使用了`synchronized`关键字。实际应用中,还需要考虑更复杂的逻辑,例如对象的状态检测、池大小的动态调整...
多态是面向对象的另一个重要特性,它允许使用父类引用指向子类对象,使得在不关心具体类型的情况下,可以调用子类特有的方法。Java中,多态有两种形式:静态多态(编译时多态)和动态多态(运行时多态)。静态多态...
Java对象池是一种优化资源管理的技术,它通过复用已经创建并初始化过的对象,避免了频繁地创建和销毁对象带来的性能开销。在Java中,对象池通常用于数据库连接、线程、Socket等昂贵资源的管理。下面我们将深入探讨...
例如,人是一个对象,拥有属性如年龄、性别、身高等,方法如吃饭、睡觉等。 对象的理解是学习Java语言的基础。正确理解对象的概念是学习面向对象编程的关键。对象的概念包括对象的定义、对象的特征、对象的行为等。...
Java对象在内存中的结构及其生命周期是Java编程中基础且关键的概念。Java的内存管理主要涉及栈(Stack)和堆(Heap)两个区域,对于理解程序的性能和内存使用至关重要。 首先,栈主要用于存储基本数据类型(如int, ...
Java对象的生命周期是一个关键概念,涉及到对象从创建到销毁的整个过程。理解这一过程对于高效地编写和管理Java程序至关重要。 #### 创建对象的方式 对象的创建是生命周期的起点,通常通过以下几种方式实现: 1. ...
在Java中,一个类可以实现多个接口,这使得设计更加灵活。接口还常用于实现事件处理和回调机制。 2. 类(Class): 类是面向对象编程的基础,它是创建对象的模板。在Java中,类定义了对象的状态(属性,即成员变量...
- 在一个类的构造函数中调用其它构造函数。 - 访问当前对象的成员变量或方法。 #### 十二、`static`关键字 `static`关键字用于声明类的静态成员和方法,这些成员和方法不属于任何特定对象,而是与类本身关联。静态...
在这个概念中,类是对象的蓝图,定义了对象的属性(变量)和行为(方法)。面向对象的三个基本特征是封装、继承和多态。 封装是将数据和方法捆绑在一起,对外只暴露必要的接口,隐藏内部实现细节。在Java中,我们...