Object类
定义:Object是所有类的父类,java中的所有类都继承于Object类,即java中的所有类都可以使用Object类的方法和非私有属性。
特点:
继承有显式继承和隐式继承,其中隐式继承指一个类未指明父类的情况下,默认继承Object类。
Java泛型
定义:java泛型是jdk5中新引入的特性。泛型提供了编译时类型检测安全机制,该机制允许编程的代码编译时可以检测非法数据类型。
特点:
- 泛型类似于占位符作用。在不确定参数类型的清况下,可以使用泛型声明数据,在调用具体数据时,在为数据进行数据类型声明;
- 泛型使用时只能使用引用数据类型,不支持原始类型的声明。
使用情景:若一个方法可以接受多种数据类型参数,此时可以使用泛型声明数据类型,在使用时引入相应引用数据类型即可。
泛型的使用方法:
所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前。
每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
Java中的泛型标记:
E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的 java 类型
有界的类型参数:
定义:限制泛型的范围,即约束泛型声明的变量或返回值只能在那几个数据类型中被使用。
使用方法:要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。
泛型类:
泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。
和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。
类通配符
- 类型通配符一般是使用 ? 代替具体的类型参数。例如 List<?> 在逻辑上是 List<String>,List<Integer> 等所有 List<具体类型实参> 的父类。
- 类型通配符上限通过形如List来定义,如此定义就是通配符泛型值接受Number及其下层子类类型。
- 类型通配符下限通过形如 List<? super Number> 来定义,表示类型只能接受 Number 及其上层父类类型,如 Object 类型的实例。
序列化
定义:
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
原理:
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。
ObjectOutputStream 类包含很多写方法来写各种数据类型
注意:
public final void writeObject(Object x) throws IOException:序列化一个对象,并将它发送到输出流。
public final Object readObject() throws IOException, ClassNotFoundException:该方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,你需要将它转换成合适的数据类型。
一个类的对象序列化成功必须具备以下条件:
该类必须实现 java.io.Serializable 接口。
该类的所有属性必须是可序列化的。
一个Java标准类能否被序列化,只需要检查该类是否实现java.io.Serializable接口。
迭代器相关方法和应用代码演示如下:
运行结果如下:
泛型代码演示如下:
运行结果为:
序列化代码演示如下:
输出结果为:
总结:
序列化中的最高数据流为ObjectOutputStream和ObjectInputStream两个方法,其中两个方法包含了众多的输出和输入流对象方法。
在使用序列化时,需要将文件后缀命名为.ser,同时被序列化的对象必须是Serialzeable的实现类。
反序列化对象时,需要指明对象的类型,进行类型转换。