目录:
一、包装类:
1、基本数据类型所对应的包装类:
2、装箱和拆箱:
二、 泛型:
1、什么是泛型:
2、语法:
三、泛型类的使用:
四、裸类型:
五、泛型的擦除机制:
六、泛型的上界:
七、泛型方法:
八、 小结:
九、总结:
一、包装类:
在 Java 中,由于基本数据类型不是继承 Object ,为了在泛型代码中可以支持基本数据类型,所以Java给每个数据类型都有一个对应的包装类。
1、基本数据类型所对应的包装类:
2、装箱和拆箱:
装箱也叫装包:其分为 自动装箱 和 显示装箱。
那么什么是装箱:就是把基本数据类型变为包装类的过程称之为装箱。
我们先来看看装箱的代码:
那么这里可能就有疑问了,那我们的自动装箱是怎样进行的呢,我们来看看它的底层:
拆箱也叫拆包:其也是分为两中 自动拆箱 和 显示拆箱
那么什么是拆箱:就是把包装类变成的过程称之为装箱。
我们来看看拆箱的代码:
我们再来看看其中的底层代码:
我们来看一个有趣的代码:
我们看到这就有意思了,为什么126就是相等,但是到129就不相等了呢?
这个我们就要看 Integer 的装箱代码了:
由此我们可以看出,Integer的装箱只能装-127——128的,超过这个就是创建一个新对象了
二、 泛型:
1、什么是泛型:
对于泛型就是:使用与许多许多类型。
从代码上来说呢,就是对类型实现了参数化。
泛型的引出:
对于引出泛型,我们来实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值。
在这里呢,我们用 Object类 来进行创建数组,Object是所有类的父类,
但是呢,我们在这里呢就有一些问题,我们来看看:
1、在这里呢,我们这个数组当中可以存放任何类型
2、我们每次进行的到值时候呢,都要进行强转
那么这就有问题了,当我们存储的数据很多的时候呢,当我们不知道是什么类型的时候呢,我们还需要去找它属于什么类型,这就很麻烦了,而且这个数组里面的类型是非常的乱的。
所以呢,我们有没有办法让编译器来转型,并且呢我们有时要存储一种类型,而非存储多种类型,这时候呢就需要用到我们的泛型了。
泛型的主要目的:就是指定当前的容器,要持有什么类型的对象,让编译器去做检查, 我们使用者不用关心,不需要尽心类型的强转。
2、语法:
在我们看语法之间我们先看看实例代码:
我们上面蓝色的组成就是泛型了,我们是不是有一些疑问对于这个代码?不要急我们马上就能知道了。
1、在 class MyArray类后面的的 <E> 代表占位符,表示当前类为泛型类。
那么我们 <> 中的E有时什么呢?类型形参一般使用一个大写字母表示,我们常见为:
E : Element //元素
T :Type //类型
K :Key //当我们分享到Map会用到
V : Value //当我们分享到Map会用到
N : Nmber
S、U等等,我们往后再介绍
我们这里要注意的是对于我们传类型的时候,我们一定要用包装类,用基本数据类型会报错。
语法:
class 泛型类名称<类型参数列表> {
}
class 泛型类名称<类型参数列表> extends 继承类 {
}
三、泛型类的使用:
语法与示例:
语法:
泛型类<类型实参> 变量名 = new 泛型类<类型实参>(这里的类型实参可写可不写)
示例:
MyArray<Integer> myArray = new MyArray<>();
这里我们再次提醒一次:
所有的泛型只能接收类,所有的基本数据类型,必须使用包装类类型。
四、裸类型:
裸类型是只没有类型实参的泛型类,比如我们 :
五、泛型的擦除机制:
对于泛型是一种编译时期的机制,在我们运行时期是没有的,那么它又是怎么运行的呢?
这里呢,就用到了一种机制,称为擦除机制:
在编译过程中,将左右的<T> 替换成Object类的这种机制,称之为擦除机制。
六、泛型的上界:
在我们定义泛型的时候呢,有时候呢,我们需要对传入的类型变量做一定的约束,我们可以通过对类型的边界进行约束。
语法:
class 泛型类名称 <类型形参 extends 类型边界> {
}
我们来看一个例子:
这样的结果会是什么呢?我们来看:
当我们没有定义其上界的时候呢,我们的上界有是什么呢?当我们没有定义上界的时候,我 们的E默认继承Object类。
我们来看一个实例:
这个呢,我们也是熟悉的,就是对于引用类型的比较方法我们需要继承Comparable接口,我们来看看:
七、泛型方法:
语法:
方法修饰限定符 <类型形参列表> 返回值类型 方法名称(形参列表) {
//方法体
}
我们来看看实例:
那么看到这又有可能有一个疑问,我们每次都要泛型方法的时候呢,我们都要进行对象的创建,那么我们能不能不创建对象,还可以调用泛型方法呢?可以,我们可以把其方法设置为静态方法:
八、 小结:
1、泛型是将参数类型进行参数化,进行传递
2、使用 <T> 代表的是当前类是泛型类
3、目前的优点:数据类型参数化,在编译时自动进行类型转换和检查
九、总结:
OK,我们的这次关于包装类和泛型的 博客就到这里就结束了,我们的泛型在数据结构中非常之重要,我们要好好的理解泛型,接下来我们就开始介绍数据结构中的线性表了,让我们期待下次见面!!!拜拜~~~