枚举类
1.早期的枚举类代码通常是用简单的静态常量来表示(也可以通过private将构造器隐藏,其实例变量用public static final修饰),但是由于存在类型不安全、没有命名空间、输出不明确等缺点,所以可用性不高(代码量大)。
2.现在可以直接用关键字enum定义枚举类(和class同一级别),可以实现多个接口,但是它是默认继承的java.lang.Enum类,所以不能显示的继承其他父类;
非抽象枚举类默认使用final修饰,所以枚举类不能定义子类;
构造器只能使用(默认)private;
枚举类的所有实例必须在第一行全部列出。
3.枚举类和其他类产生对象的方式不同,枚举类的实例只能是枚举值而不是随意通过new产生的对象;由于封装性,我们应该通过方法来控制对成员变量的访问;如果构造器带参数,那么第一行列出枚举值时就要传参。
4.枚举类的接口和其他类基本一样
这段话的意思不太懂
抽象的枚举类还是可以派生子类的;枚举类里定义抽象方法不能用abstract将枚举类定义成抽象类,系统会自动给该枚举类添上abstract
对象与垃圾回收
垃圾回收特点如下
1.对象在内存中的状态分为三种:1.可达状态:有一个以上的变量引用它;2.可恢复状态:没有变量引用它,在被回收之前会用finalize()方法进行资源清理,此时让变量重新引用它就到了可达状态;3.不可达状态:彻底失去引用,之后只能被回收。用流程图理解比较好
2.强制回收机制:(可能不会立刻进行垃圾回收)
3.垃圾回收前会要清理资源,java会默认用finalize()来清理资源,也可以重新Object类的finalize()成合适的清理资源程序
(第二点:如果占内存非常小,可能垃圾回收机制不想回收它,finalizey也就不一定会调用)
可恢复状态到可达状态就是通过重写finalize实现
4.java对对象的几种引用
引用队列可以保存回收后对象的引用,软引用和弱引用的对象被回收后可以把被回收对象对应的引用放入引用队列;虚引用在对象释放前就把对象对应的引用放入了引用队列,所以可以在对象被回收前采取行动。常量会被系统视为强引用。
对对象使用这几个特殊引用时必须取出对该对象的强引用,不然这些引用的作用失效