java中的对象有三种状态,1:激活,2:去活,3:死亡。
当一个对象有一个或者多个对象引用时,他处于激活状态。当一个对象没有引用指向他时,他将变成去活状态(例:Student s = new Student();这个时候s为去活状态;s=null没有引用来引用这个对象)。当一个对象处于去活状态时,系统垃圾回收器准备回收该对象时,会先调用该对象的finalize方法,如果finalize方法中,该对象没有被重新引用,那么他将变成死亡状态,如果有其他引用,他重新变成激活状态。死亡状态:当对象没有被其他对象引用,且已经调用过了finalize方法(也没有让其变为激活状态),那么系统才真正的回收其内存资源。
java中的对象没有必要由程序员手动删除,由垃圾回收器回收,可是垃圾回收器回收的时间往往具有不确定性。因此我们可以通过system.gc()方法或者Runtime.getRuntime().gc(),提醒垃圾回收器该回收垃圾了,记住只是提醒而已,至于垃圾回收器什么时候回收还是不确定的,只不过他会尽量快的进行回收。
下面的代码演示了finalize方法中如何激活本身,和知道垃圾回收的不确定性。
public class Test1 {
private static Test1 a = null ;
void info()
{
System.out.println("测试finalize()方法");
}
@Override
protected void finalize() throws Throwable {
//使this对象重新变成激活状态
a=this;
}
public static void main(String[] args) throws InterruptedException {
new Test1();
//告诉垃圾回收器该收垃圾了
System.gc();
//没有这句的话,系统没有没有清理垃圾,那么就不会调用finalize方法,a对象为null,告诉我们并不是调用System.gc();
//后,垃圾回收器就马上开始回收垃圾了
Thread.sleep(2000);
//调用静态成员的info方法
a.info();
}
}
我们也可以强制垃圾回收器执行去活对象的finalize方法,通过调用system.runFinalization()方法,下面的代码和上面的代码一样,只不过不用线程休眠2s,垃圾回收器也会调用去活对象的finalizde方法。
public class Test1 {
private static Test1 a = null ;
void info()
{
System.out.println("测试finalize()方法");
}
@Override
protected void finalize() throws Throwable {
//使this对象重新变成激活状态
a=this;
}
public static void main(String[] args) throws InterruptedException {
new Test1();
//告诉垃圾回收器该收垃圾了
System.gc();
//没有这句的话,系统没有没有清理垃圾,那么就不会调用finalize方法,a对象为null,告诉我们并不是调用System.gc();
//后,垃圾回收器就马上开始回收垃圾了
// Thread.sleep(2000);//线程休眠没有休眠
//垃圾回收器强制回收回收垃圾
System.runFinalization();
//调用静态成员的info方法
a.info();
}
}
static属于类,是多个对象共享(对象和类都能直接调用)实例变量属于对象,每个对象都有自己的实例变量(每个队象调用时都重新初始化一个实例变量来)。
final,finally与finalize的区别
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)简单来说就是finally后的代码块无论如何都会被执行除非程序退出(break)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。