java基础知识整理8

实现接口的枚举类
枚举类也可以实现一个或多个接口。与普通类实现一个或多个接口一样,枚举类实现一个或多个接口时,也需要实现该接口所包含的方法。使用implements实现接口,实现接口里包含抽象方法。
如果由枚举类来实现接口方法,则每个枚举值在调用该方法时,都有相同的行为方式(因为方法体完全一样)如果需要每个枚举值在调用方法时呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法,每个枚举值提供不同的修饰方式,从而让不同枚举值调用该方法时具有不同的行为方式。
包含抽象方法的枚举类:
枚举类里定义抽象方法时无需显式使用abstract关键字将枚举类定义成抽象类,但因为枚举类需要显式创建枚举值,而不是作为父类。所以定义每个枚举值时必须为抽象方法提供实现,否则将出现编译错误。
对象与垃圾回收:
垃圾回收机制具有以下特征:
1.垃圾回收机制只负责回收堆内存的中的对象,不会回收任何物理资源。
2.程序无法精确控制垃圾回收的运行,垃圾回收是在合适的时候进行。当对象永久性的失去引用后,系统就会在合适的时候回收它占用的内存。
3.路基回收机制回收任何对象之前,总会先调用他的finalize方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收。
对象在内存中的状态:
当一个对象在堆内存中运行时,根据他被引用变量所引用的状态,可以把所处的状态分为:
1.激活状态:当一个对象被创建后,有一个以上的引用变量引用他,则这个对象在程序中处于激活状态,程序可以通过引用变量来调用该对象的属性和方法。
2.去活状态:如果程序中某个对象不再有任何变量引用他,他就进入了去活状态。在这个状态下,系统的垃圾回收机制准备回收该对象所占用的内存,在回收该内存之前,系统会调用所有去活状态对象的finalize方法进行资源清理,如果系统在调用finalize方法重新让一个引用变量引用该对象,则这个对象会再次变为激活状态;否则该对象将进入死亡状态。
3.死亡状态:当对象与所有引用变量的关联都被切断,且系统已经调用所有对象的finalize方法依然没有使该对象变成激活状态,哪这个对象将永久性的失去引用,最后变成死亡状态。只有当一个对象处于死亡状态时,系统才会真正回收该对象所占用的资源。
一个对象可以被一个方法局部变量所引用,也可以被其他类的类属性引用,或被其他对象的属性引用。当某个对象被其他类的类属性引用时,只有该类被销毁后,该对象进入去活状态;当某个对象被其他对象的实例属性引用时,只有当该对象被销毁时,该对象才会进入去活状态。
强制垃圾回收:
程序只能控制一个对象何时不再被任何引用变量引用,绝不能控制他何时被收回。
强制系统垃圾回收呦如下两种方法:
1.调用System类的gc()静态方法:System.gc()
2.调用Runtime对象的gc()实例方法:Runtime.getRuntime().gc();
可以执行命令:java -verbose:gc TestGc(文件名)
Finalize方法:方法原型为:protected void finalize() throws Throwable
当finalize()方法返回之后,对象消失,垃圾回收机制开始执行。方法原型throws ThrowAble表示他可以抛出任何异常类型。
任何Java类都可以覆盖Object类的finalize方法,在该方法中清理该对象占用的资源,如果程序终止没有进行垃圾回收,则不会调用失去引用对象的finalize()方法来清理资源,垃圾回收机制何时调用对象的finalize方法时完全透明的,只有当程序认为需要更多额外内存时,垃圾回收机制才会进行垃圾回收。
可能会出现一个情形:某个失去引用对象只占用了少量的内存,而且系统没有产生严重的内存需求,因此垃圾回收机制并没有试图回收该对象所占用的资源,所以finalize方法也不被调用。
Finalize方法四个特点:
1.永远不要主动调用某个对象的finalize方法,该方法教给垃圾回收机制调用
2.Finalize方法何时被调用,是否调用具有不确定性。不要把finalize方法当成一定会被执行的方法。
3.当jvm执行去活对象的finalize方法时,可能使该对象或系统中其他对象重新变成激活状态。
4.当jvm执行finalize方法时出现了异常,垃圾回收机制不会报告异常,程序继续执行。
由于finalize方法不一定会被执行,如果想保证某个类里打开的资源被清理,不要放在finalize方法中进行清理。
System和Runtime类里都提供了一个runFinalization方法,可以强制垃圾回收机制调用,用系统中去活对象的finalize的方法
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43467548/article/details/94722925