一 包装类
1.产生的原因:
Java的发明者既想要保存原有基本类型不变,但同时很多功能机制又需要为引用类型/类才可以使用(可以将其与Object类统一为统一体系),所以将基本类型包装了一下,为包装类型
2.写法:
int->Integer char->Character
其它都是改变第一个字母为大写
3.装箱和拆箱
装箱:内置类型转换为包装类
方法:
(1)使用Integer.valueOf方法
(2)new对象时顺便转换
new Integer(数字)
拆箱:将包装类转换为内置类型
注:现在idea已经可以其对进行自动装箱和拆箱功能了
4.使用:
对于包装类,由于其可以自动装箱,可以当作内置类型去使用,比如进行算术运算等
但是对于某些功能,必须要将内置类型转换为包装类才能进行使用
5.特殊情况:
JVM对于Integer做了优化,其对于常用的Integer对象提前进行创建(范围为-128-127),存放于常量池中,所以当其对其赋值在该范围内,其引用都是指向同一提前创建好的对象
二 泛型
1.作用:当类型发生改变,其依旧可以适用,即同一份代码,支持不同数据类型,实现代码重用,起到将类型参数化的效果
2.相似的实现方式:所有Object类型
问题:(1)所有的类型都能存放于一个Object数组,会导致混乱
区别于泛型:其进行类型指定后就相当于确定了该变量和该数组只能存放对应类型的变量,对其进行了约束(相当于一个容器,指定了该容器只能存放什么类型的值,并且编译器后续会对其做更严格的检查)
(2)需要进行强转
3.特性:
(1)其类型为参数的变量不可以实例化
(2)并且类型为参数的变量不可带static,因为static是在类加载的时候就已经确定类型了,而其就类型需要等运行起来才能确定
(3)其可以拥有多个参数类型
(4)其参数类型必须为类,如果是内置类型必须使用其包装类
4.类型推导:一开始前面的类型写全其指定的类型,后面new可不写类型,根据类型推导猜出其是什么类型
5.裸类型:不指定具体参数类型,直接创建对象,系统会自动默认为Object
注:不建议这样写,之后可能会被删除这样的规则
6.类型擦除:编译器在编译的时候会将代表类型的形参擦去,在代码中出现的地方全都替换为Object,并且后续会做一系列检查,在实例化阶段,根据其指定的类型编译器会做更严格的检查
7.泛型上界和泛型下界
(1)泛型上界:
(i)定义:指定参数类型必须为某个类的子类或就为此类本身
(ii)写法:<T extends 父类>
(iii)适用:可修饰参数类型(即类的定义处),以及引用的类型(定义变量处)
(2)泛型下界
(i)定义:指定参数类型必须为某个类的父类或就为此类本身
(ii)写法:<T super 子类>
(iii)仅适用于修饰引用的类型
例如
Test< ?super 子类> test=new Test<>();
则test其之后要指向的引用类型必须为子类的父类
8.通配符
(1)使用:利用?作为通配符,表示此处可为任意类型,用于定义变量,使该变量可以作为多个类型的引用
例如Test<?> test =new Test<>();
此时即可以作为指定String类型的Test类引用,又可以作为Integer类型的Test类引用
(2)注:次数后面new新对象时就需要显性定义
9.泛型方法:
(1)使用时写法:类型.<类型>方法名
(2)注:此时不允许使用类型推导,后面要明确写出其对应类型