Java——包装类及认识泛型

包装类:

        在学习泛型之前我们一定要认识包装类。

        在Java 中,由于基本类型不是继承自 Object ,为了在泛型代码中可以支持基本类型, Java 给每个基本类型都对应了一个包装类型。
除了int类型和char类型的包装类不是它们对应的基本类型的大写之外,其他的都是将基本类型的首字母大写!

包装类中也有对应的许多方法,例如:将字符串类型转为整型: 

我们以Integer包装类为例研究。

拆箱和装箱:

        拆箱和装箱也被称为拆包和装包:

装箱:

也就是将基本类型变成包装类的过程:

例如:

此时就对基本类型完成了装箱过程:

需要调用Integer的静态方法完成装箱:

这个静态方法是什么意思呢?

可以一起看看,源码如下:

    public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}

首先进入源码有一个if语句,我们看看能能不能看懂。

Integer.low和Integer.high是什么意思呢?

我们同样找到low和high中,发现low是-128,high是127,也就是当我们传过来的参数如果小于-128或者大于127,这时候先调用Integer的构造函数之后就直接new一个新的Integer对象返回。

将类中的value初始化,完成整个装箱过程!!

但是如果此时我输入的值在-128和127之间会发生什么?
继续来看:

此时返回一个数组对应的值,cache是该类一开始就定义的一个Integer数组类型的成员变量:

那么这个数组中放的是什么呢?

在一开始的静态代码块中有初始化:

发现这个数组中首先只有(127+128+1 = 256)的大小,j = -128;之后将参数为-128 - 127的Integer类型的放在数组中,下标从0 - 255!!

这时候就明白了,原来这个数组中存放的就是-128到127的Integer类型的变量。

所以当我们传参如果大于127或者小于-128的时候,这时候会计算一个位置然后返回,如果是3,那么就返回3+128 = 131位置的对应的Integer对象,131位置上Integer初始化的value正好是3。

如上就是原理图!!

拆箱:

        就是将包装类变成基本类型:

例如:

    public static void main(String[] args) {Integer i = Integer.valueOf(10);int a = i.intValue();System.out.println(a);}

这就是拆箱过程,也就是调用封装对象的intValue方法。

源码如下;:

这个通俗易懂直接返回一个int类型的值。 

自动拆箱和装箱:

        名表了拆箱和装箱的原理,也知道拆线和装箱需要调用哪个方法。

        但是此时我写这样的代码,看看编译器能否通过编译!

首先没有报错,再其次打印结果如下:

此时有两个问题:

        1.Integer引用类型为什么可以直接接受一个int类型的变量?

        2.为什么我直接打印Integer引用类型变量,打印结果是一个10?

接下来一一解答该问题:

        1.编译器会为我们自动完成拆箱和装箱的过程!

        2.Integer包装类中已经重写了toString方法!! 

自动拆箱演示过程:
 

泛型:

什么是泛型:

        泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数0化。

语法:

class 泛型类名称 < 类型形参列表 > {
// 这里可以使用类型参数
}
class ClassName < T1 , T2 , ..., Tn > {

}

class 泛型类名称 < 类型形参列表 > extends 继承类 /* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}
class ClassName < T1 , T2 , ..., Tn > extends ParentClass < T1 > {
// 可以只使用部分类型参数
}
class MyArray<T> {
public T[] array = (T[])new Object[10];//1
public T getPos(int pos) {
return this.array[pos];
}
public void setVal(int pos,T val) {
this.array[pos] = val;
}
}
public class TestDemo {
public static void main(String[] args) {
MyArray<Integer> myArray = new MyArray<>();//2
myArray.setVal(0,10);
myArray.setVal(1,12);
int ret = myArray.getPos(1);//3
System.out.println(ret);
myArray.setVal(2,"bit");//4
}
}
代码解释:
1. 类名后的 <T> 代表占位符,表示当前类是一个泛型类
了解: 【规范】类型形参一般使用一个大写字母表示,常用的名称有:
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type
S, U, V 等等 - 第二、第三、第四个类型
2. 注释 1 处,不能 new 泛型类型的数组:
class 泛型类名称 < 类型形参列表 > extends 继承类 /* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}
class ClassName < T1 , T2 , ..., Tn > extends ParentClass < T1 > {
// 可以只使用部分类型参数
}
class MyArray < T > {
public T [] array = ( T []) new Object [ 10 ]; //1
public T getPos ( int pos ) {
return this . array [ pos ];
}
public void setVal ( int pos , T val ) {
this . array [ pos ] = val ;
}
}
public class TestDemo {
public static void main ( String [] args ) {
MyArray < Integer > myArray = new MyArray <> (); //2 当编译器可以根据上下文推导出类型实参 时,可以省略类型实参的填写
myArray . setVal ( 0 , 10 );
myArray . setVal ( 1 , 12 );
int ret = myArray . getPos ( 1 ); //3
System . out . println ( ret );
myArray . setVal ( 2 , "bit" ); //4
}
}
T [] ts = new T [ 5 ]; // 是不对的
3. 注释 2 处,类型后加入 <Integer> 指定当前类型
4. 注释 3 处,不需要进行强制类型转换
5. 注释 4 处,代码编译报错,此时因为在注释 2 处指定类当前的类型,此时在注释 4 处,编译器会在存放元素的时候帮助我们进行类型检查。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148072.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

zTasker自动化任务的小工具

一、简介 zTasker&#xff08;详情请戳 官网&#xff09;是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具&#xff0c;支持win7-11。其支持超过 100 种任务类型和 30 种定时/条件执行组合方法&#xff0c;可轻松任意调节更改任务类型达到理想效果。…

【计算机组成原理】实验一:运算器输入锁存器数据写实验

目录 实验要求 实验目的 主要集成电路芯片及其逻辑功能 实验原理 实验内容及步骤 实验内容 思考题 实验要求 利用CP226实验箱上的K16&#xff5e;K23二进制拨动开关作为DBUS数据输入端&#xff0c;其它开关作为控制信号的输入端&#xff0c;将通过K16&#xff5e;K23设定…

科技云报到:以数据“价值三角”为擎,探索数据治理实践路径

科技云报到原创。 过去四十年&#xff0c;经济发展主要来自于土地、劳动力、农业技术、工业技术等要素的充分释放。面向数字经济时代&#xff0c;无论是大模型、自动驾驶还是具身智能、人形机器人&#xff0c;数据已然成为继土地、劳动、资本和技术之后的又一种战略资产和新型…

低代码消息中心——提升应用交互效率的利器

在数字化飞速发展的今天&#xff0c;应用程序已成为我们日常生活与工作中不可或缺的一部分。随着应用功能的日益复杂&#xff0c;用户对于实时、高效的信息交互需求也日益增长。在这一背景下&#xff0c;低代码消息中心应运而生&#xff0c;以其便捷、灵活的特性&#xff0c;为…

LIN总线CAPL函数—— 设置报头同步间隔场长度(linSetBreakLength)

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

BiGRU——提高基于 RNN免疫反应预测的准确性

导言 论文地址&#xff1a;https://arxiv.org/abs/2208.04314 深度学习在免疫学领域的应用 人们有一种叫做免疫系统的系统来保护自己免受外来有害物质&#xff08;包括病毒和细菌&#xff09;的侵害。免疫系统是指包括白细胞在内的人体内各种元素相互配合以保卫身体的系统&a…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第三篇-着色器光照】

在前两篇文章中&#xff0c;我们分别拆解描述了实现原理&#xff0c;并进行了基础的着色器制作。在这一篇文章中&#xff0c;我们将为它实现光照效果 简单的概述 当光线射入体积时&#xff0c;随着光线射入距离的增加&#xff0c;体积中的介质会对光线产生反射和吸收作用&…

【已解决】ElementPlus 的 el-menu 组件如何用 js 控制展开某个子菜单,并在其他组件中控制使用呢?

文章目录 需求几次探索官网寻找线索&#xff08;解决办法&#xff09; 需求 我如何用代码来实现 ElementPlus 的菜单的展开和收缩呢&#xff1f; 几次探索 尝试通过找到节点之后&#xff0c;使用 click 事件&#xff0c;失败了 // 伪代码如下 const handleFindNodeAndClick …

力扣:用队列模拟栈

题目描述 解题 class MyStack {Queue<Integer> queue;int size 0;public MyStack() {queue new LinkedList<Integer>();}public void push(int x) {queue.offer(x);size;}public int pop() {for(int i 0; i < size - 1; i){queue.offer(queue.poll());}size…

LLM - 理解 多模态大语言模型(MLLM) 的 幻觉(Hallucination) 与相关技术 (七)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142463789 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 多模态…

Perfetto-Android开发分析神器(性能、内存、线程调度)

一、Perfetto内存分析 1.1Prefetto内存分析优势 Prefetto相比其他的sysmem、sysinfo或者追踪堆栈的方式进行内存相关问题的追踪具有更强的可视化以及调用层级更加详细的优势&#xff0c;很多时候能精确到某一个结构体&#xff0c;更加便于在内存泄漏环境下的问题定位。 1.1.1…

数据驱动农业——农业中的大数据

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

美信监控易的优势:长期稳定运行

美信监控易作为一款运维产品&#xff0c;其显著的优势在于能够长期稳定运行。在IT运维领域&#xff0c;系统的稳定性是至关重要的&#xff0c;它直接关系到企业的业务连续性和客户满意度。美信监控易通过其自研的数据库和先进的监测技术&#xff0c;确保了系统的高可用性&#…

Mysql高级篇(中)——事务篇

事务篇 一、数据库事务概述&#xff08;1&#xff09;概念&#xff08;2&#xff09;事务的处理原则&#xff08;3&#xff09;事务的特性(ACID)&#xff08;4&#xff09;事务的创建 二、如何使用事务三、事务隔离级别&#xff08;1&#xff09;分类&#xff08;2&#xff09;…

每日一练:二叉树的中序遍历

94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 一、题目要求 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root …

探索Allure Report:提升自动化测试效率的秘密武器

一.使用 Allure2 运行方式-Python # --alluredir 参数生成测试报告。 # 在测试执行期间收集结果 pytest [测试用例/模块/包] --alluredir./result/ (—alluredir这个选项 用于指定存储测试结果的路径) # 生成在线的测试报告 allure serve ./result 二.使用 Allure2 运行…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-15

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-15 1. Towards the holistic design of alloys with large language models Z Pei, J Yin, J Neugebauer, A Jain - Nature Reviews Materials, 2024 利用大型语言模型实现合金的全面设计 摘要 文章讨论了大型…

基于单片机的自行车智能辅助系统设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图目 录设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 …

构建数据分析模型,及时回传各系统监控监测数据进行分析反馈响应的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。增…

[论文精读]Towards Deeper Graph Neural Networks

论文网址&#xff1a;Towards Deeper Graph Neural Networks | Proceedings of the 26th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和…