java 基础知识点整理(三)
(1) 枚举的jdk实现
下面是枚举代码
1 | public enum Labels0 { |
在编译后生成的字节码如下:
可以看到枚举被编译后就是一个类,被编辑为final并且继承Enum
里面的枚举都是static finak的常量,静态的所以是单例的
重点:
++枚举类型没有可以访问的构造器,是真正的 final;是实例受控的,它们是单例的泛型化; 本质上是单元素的枚举;提供了编译时的类型安全。 单元素的枚举是实现单例的最佳方法!++
(2) jdk序列化
定义:将实现Serializable接口的对象转成一个字节数组,并且可以讲字节数组转换为对象
- 实现序列化
- 实现Serializable接口
- 该接口只是一个可序列化的标志并没包含实际的属性和方法
- 如果不在该方法中添加readObject 和 writeObject 则采取默认的序列化机制,如果添加了这两个方法还想执行默认的序列化机制 则需要分别调用 defaultReadObject()和defaultWriteObject()方法
- 为了保障安全性可以使用transient关键字修饰不必序列化的属性因为在序列化的过程中private的属性也会被序列化
- 实现ExternalSerializable接口 可以对要求序列化的内容进行控制,控制那些属性能被序列化,那些不能被序列化
- 反序列化
- 实现Serializable接口接口反序列化,无需调用构造方法,完全处于字节
- 实现ExternalSerializable接口方法在反序列化的时候调用构造方法
- 注意事项
- 被static 修饰的对象不会被序列化
- 对象的类名 属性都会被序列化,方法不会被序列化
- 保证序列化对象对象所在类的属性也是可以被序列化的
- ObjectOutputStream 是专门用来输出对象的输出流;
ObjectOutputStream 将 Java 对象写入 OutputStream。可以使用 ObjectInputStream 读取 (重构)对象。 - serialVersionUID
用来判断序列化的版本号的,如果反序列化的时候如果版本号不一致则会抛异常
(3)ERROR 和 Exception
- error 是程序无法处理的错误,是有jvm虚拟机器抛出的异常如。outofmemorayerror,虚拟机将发生这种异常的线程直接终止
- exception 是可以程序可以处理的异常,是程序主动抛出的异常。
异常氛围检查时异常和非检查异常,检查异常需要try cache 非检查异常无需try cache
(4)常见的RuntimeException
- NullPointerExcepiton 空指针
- IllegalArgumentExcepiton 参数无效
- ArraysOutOfBoundsExcepiton 数组越界
- ClassCaseException 类型转换异常
- NumberFormatException 数字转换异常
(5)泛型擦除
编辑器生成的字节码是不包含泛型信息的,编译过程中会擦除泛型。限定类型会指向限定类型,非限定类型则指向object
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment