一、包装类
1.包装类的引入
包装类:就是把8大基本类型封装到类之中
A.Object类可以接收所有引用数据类型(数组,类,接口),为了让Object类可以接收Java中一切内容,引入包装类,把基本类型的数值封装到类的对象之中,就产生了包装类。
B.基本类型的默认值其实在很多场景下会造成误导哦,引用类型的默认值就是null
Double -> 0.0
现在有一个扣费的需求,当前费用 * 当前费率(打几折) = 实际扣款数
如果费率使用double类型,默认值0.0,这样对于该需求会产生歧义
但如果使用的是double的包装类Double,默认值就是null
JDK中的包装类有以下8种:
数值型包装类(Number的子类):
整型:byte < short < int < long
对于的包装类:Byte < Short < Integer < Long
浮点型:float < double
对于的包装类:Float < Double
char类型的包装类:Character
boolean类型的包装类:Boolean
二、包装类的使用
以整型为例:
Int -> Integer
装箱:将基本类型的数值保存到包装类对象中。
拆箱:将包装类对象中的数值还原为基本类型。
自动拆装箱:Java编译器的优化,使用包装类就和使用基本类型一样。
有了自动拆装箱,使用包装类就和使用基本类型完全一致。
但是有两点不同:
A.默认值不同!包装类的默认值都是null,基本类型的默认值就是其数据类型默认值
Integer,Double -> null
Int -> 0
Double -> 0.0
B.比较相等,仍然使用equals方法比较,所有类对象的比较都使用equals方法!
注意:
当使用整型包装类的自动拆装箱时,JVM会缓存相应的数值
Integer常量池,默认在-128到127之间的取值,都会缓存到常量池中
只要是引用类型的比较,一律使用equals方法,咋样都不会错!!!
阿里编码规范:所有POJO(普通)类的成员变量一律使用包装类替代基本类型
二、泛型
定义泛型对象时,只能使用类,基本类型不能保存到泛型中,必须使用包装类
1.泛型的引出
Point{
x;
y;
}
x = 10 ; y = 20;
x = 10.1 ; y = 20.2;
x = “东经15度” y = “北纬39度”
Java是强类型语言,在定义x和y的时候必须强制定义变量类型
可以使用Object类定义变量,这样可以接收所有类型
当用户不小心输入的x和y是不同类型时,编译没问题,但是取出x和y时,强制类型转换就会报错,运行时异常
一般来说,我们要求把所有的错误都提前暴露在编译阶段,程序还没跑起来就能发现错误。
2.引入泛型
泛型:(守门员,编译阶段检查类型是否一致的手段)
所谓的泛型指的是在类定义时不明确类型,在使用时明确类型。
定义泛型使用"<>"操作符
称之为类型参数
可以使用任何字符,规范是单个的大写字母
T:表示任意类型
K:键值对,key值
V:value值
E:单个元素
使用泛型的类:
当产生MyPoint对象时,此时将T这个类型参数替换为明确的类型String
我们发现,引入泛型后,可以在编译阶段检查设置的类型值是否是指定类型,若不一致,编译报错
取出值时,就无需进行强转
我们就可以使用泛型来改造我们的动态数组和链表
之前保存的只能是int,当由泛型以后,我们可以保存任意类型。
若泛型类中存在多个类型参数,成员变量的类型不一定一致。
使用不同的大写字母指代不同类型,产生对象时,T和E的类型可以相同也可以不同