目录
一. 包装类
1.1 什么是包装类?
包装类是java本身预定义的类, 在包装类中存在着成员方法(操作包装类对象), 每个包装类都对应一个基本数据类型. (可以理解为包装类是基本数据类型的plus版本)
1.2 包装类的意义
包装类存在的最大意义就是在使用泛型时, 把包装类作为参数传递.(基本数据类型不能够作为泛型参数传递)
1.3 基本数据类型与包装类
boolean -> Boolean
char -> Character
float -> Float double -> Double
byte -> Byte short -> Short int -> Integer long -> Long
总共有八对, int 和 character 特殊, 其他的都是首字母大写.
1.4 装箱
装箱(装包): 基本数据类型 -> 包装类类型.
装箱分为:
a. 显式装箱.
(使用valueOf方法.)
b. 自动装箱.
1.5 拆箱
拆箱(拆包): 包装类类型 -> 基本数据类型.
拆箱分为:
a. 显式拆箱.
(使用intValue方法.)
b. 自动拆箱.
1.6 小总结
包装类存在的最大意义就是在使用泛型的时候作为参数传递.
二. 泛型
2.1 什么是泛型?
泛型就是一个类可以支持不同的数据类型, 把数据类型作为参数传递, 实现了类型的参数化.
2.2 泛型的意义
a. 实现了代码的复用. (当需要使用这个类实现不同的功能时, 只需要更改传入的类型参数, 而不需要再重新写一个类.)
b. 在传入参数时自动进行类型检查.
c. 在返回时自动进行类型转换.
2.3 泛型的语法
class 类名<参数列表> { // ... }
即 class 类名<T1, T2, T3> { // ... }
2.4 泛型的编译
2.4.1 下载插件
2.4.2 分析
图一:
图二:
可以发现: 在编译完成之后, 所有的T1, T2, T3 都被替换成了 Object (所有类的父类), 这就是 泛型的擦除机制.
也就是说, 泛型只存在于程序编译的过程中, 在编译完成之后(运行时), 不存在泛型.
2.5 上界
语法:
class 类名<T1 extends T2> { // ... }
即 T1 必须是 T2的子类 或者 实现了T2 接口 或者 是 T2.
例子:
T 必须是 Integer的子类 或者是 Integer.
2.6 泛型方法
T extends Number: T是Number的子类 或者 就是 Number.
func(T a, T b): 传入参数时, 进行类型检查.
T func(...): 返回时, 进行类型转换.
test2.<Integer>func(10, 20): 进行类型参数的传递.
泛型方法的意义:
a. 实现了代码的复用.
b. 传参时进行类型检查.
c. 返回时进行类型转换.
2.7 小总结
泛型就是进行了类型的传递, 以此来实现代码的复用.
三. 总结
a. 包装类存在的最大意义就是在使用泛型时, 作为参数传递.
b. 泛型就是进行了类型的传递, 并以此来实现代码的复用.