拓冰建站拓冰建站
首页 / 资讯中心 / 正文

包装类和泛型的详细解析

前言❤️❤️hello hello这里是洋不写bug~欢迎大家点赞关注收藏严格来说包装类和泛型算是JavaSE阶段的内容只是缺少合适的使用场景它们的使用场景和数据结构是深度相关的因此就放到数据结构专栏中来讲这篇博客依旧是数据结构的前置知识从下篇博客开始解析数据结构的知识这个专栏的数据结构是代码都是用Java来写的JavaSE专栏现在已经全部更新完成铁汁们复习基础知识时非常推荐使用可以试一下个人主页洋不写bug的博客所属专栏数据结构专栏复习Java基础知识Java学习之旅从入门到进阶铁汁们对于数据结构基础的各种核心知识不太常用的也有都可以在上面的数据结构专栏学习专栏正在持续更新中有问题可以写在评论区或者私信我哦~1包装类Java有8种基础数据类型byteshortintlongfloatdoublebooleanchar后续Java又引入了一系列进阶的语法机制例如泛型机制这些机制又依赖引用类型所有的引用类型都是直接或简介继承Object类的于是就发明了包装类也就是把这8种基础数据类型包一下变成引用类型基本类型和包装类的对应如下图除了int类型和char类型其他都是直接首字母大写在早期因为包装类确实是类所以是不能直接进行算术运算的还需要进行类型转化把基础数据类型转为包装类就是装箱把包装类转为基础数据类型就是拆箱但在jdk8后就引入了自动类型转化包装类可以直接转为基础数据类型如下所示在进行算术运算时就会自动的拆箱把Integer类型拆为int类型的publicclassTest{publicstaticvoidmain(String[]args){Integera1;Integerb2;System.out.println(ab);}}还有个比较有趣的东西下面这段代码的执行结果一个是true一个是flasepublicclassTest{publicstaticvoidmain(String[]args){Integera127;Integerb127;System.out.println(ab);Integerc128;Integerd128;System.out.println(cd);}}这是因为JVM针对Interger这样的常量做了优化-128 —127这个范围内的数字Integer对象提前创建好了保存在常量池中在JavaSE专栏String类解析博客中有提到常量池有兴趣的铁汁可以看下当然未来的JVM也可能不会遵循这样的规则因此铁汁们这里只是了解下即可2泛型前面的包装类其实就是为泛型做铺垫的那泛型解决了什么问题呢代码如下这个MyArray类类中定义了一个数组存储的是String类型的publicclassMyArray{privateString[]datanewString[100];publicStringgetData(intindex){returndata[index];}publicvoidsetData(Strings,intindex){this.data[index]s;}}如果后面想要让这个类中的数组不存储String类型了改为存储Book类型Student类型如果不想再去一处一处的修改代码有什么好办法呢可能有的铁汁会认为把数组的类型设置为Object类型就好了因为Object类是所有类的父类这样数组就可以存任何类型的数据了那代码就变成了下面这样publicclassMyArray{privateObject[]datanewObject[100];publicObjectgetData(intindex){returndata[index];}publicvoidsetData(Objects,intindex){this.data[index]s;}}创建个空的Student类和空的Book类测试后确实各种数据类型都能存进去如下所示publicclassStudent{}publicclassBook{}但是这样写就有个很大的弊端如果想要获取元素的话就需要先拿Object获取数组元素再进行类型转化但是当数组中什么类型都能存每次取元素都进行类型转化很麻烦也容易出错因此一般是不会这样写的泛型就很好的解决了这个问题想要修改数组储存的数据类型既不需要改代码取出元素也不需要进行类型转化代码如下这个TType就表示未知类型也就相当于是个形参这里用什么字母或者单词都可以只是习惯用T因为T的类型未知所以创建数组时不能直接new T[10]还需要先创建Object类型的再进行类型转化publicclassMyArrayT{privateT[]arr(T[])newObject[10];publicTgetIndex(intindex){returnarr[index];}publicvoidset(intindex,Tvalue){arr[index]value;}}后续在main方法中使用时直接在里传入具体类型即可在myArray对象中set和get方法返回的都是Student类型的在myArray2对象中set和get方法返回的都是Book类型的这样就很方便也不用进行强制类型转化publicclassTest{publicstaticvoidmain(String[]args){MyArrayStudentmyArraynewMyArray();MyArrayBookmyArray2newMyArray();MyArrayStringmyArray3newMyArray();}}如果想存整数类型的话是不能直接传入int的要传入基本数据类型对应的包装类要也就是Integer因为传入的必须是一个类这也就是包装类的作用如下图如果创建对象时不指定参数如下图这里数组元素的类型就是Object类型的但是一般是不这样写的这里了解下即可泛型代码编译时就是把T当作Object类型在实例化创建对象的时候编译器再根据传入的参数进行区别对待也可以对参数T加上一定的限制例如让参数T继承Number类这样后续只能传入数字类型的包装类如下所示publicclassMyArrayTextendsNumber接着聊下泛型通配符如下图新创建一个对象数组存储Book类型尝试更改下myArray引用的指向是会报错的因为创建这个引用时就指定了这个引用指向的对象的数组必须是Student类型的想要这个引用可以指向其他对象就可以在创建引用时使用通配符?那这个引用就可以指向任何数组类型的对象创建引用处没有传入具体参数在那创建对象那里的里面传入数组类型结语泛型并不复杂在数据结构中创建各种表时基本上都要用到泛型所以具体了解下后面看代码会更清楚以上就是今天的所有内容啦完结撒花
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门