当前位置: 首页 > article >正文

【实践】java.lang.Integer源码分析

Java有八种基本数据类型,为了面向对象的严谨性,Java对这八种基本数据类型作了封装,衍生出了八个基本数据类型封装类:

byte(字节) –> Byte
shot(短整型) –> Shot
int(整型) –> Integer
long(长整型) –> Long
float(浮点型) –> Float
double(双精度) –> Double
char(字符型) –> Char
boolean(布尔型) –> Boolean

在使用过程中,封装类必然与原基本数据类型有所差异,并且有时使用不当会产生一些问题,以java.lang.Integer为例,我们一起来分析它们的封装设计想法与应用实践。

打开java.lang.Integer的源码(.java),映入眼帘的是

public final class Integer extends Number implements Comparable<Integer>

Integer是final的,也就是说Integer类不能被继承,没有子类,Integer中所有方法都是final的。其次Integer继承了抽象类Number并实现了Comparable<Integer>接口。

Comparable<Integer>相信大家并不陌生,读者可自行某du或某gle。其实就是实现了int compareTo(T o)方法,Integer的实现也很简洁易懂:

public int compareTo(Integer anotherInteger) {return compare(this.value, anotherInteger.value);
}public static int compare(int x, int y) {return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

所以我们在比较两个Integer封装类的时候,其实比较的是它们的value值。value其实就是一个int类型的成员变量(属性property):

private final int value;

从声明来看,value对外是不可见的,并且只能被赋值一次。我们可以看到Integer的构造函数只有两个:

public Integer(int value) {this.value = value;
}public Integer(String s) throws NumberFormatException {this.value = parseInt(s, 10);
}

一个是直接传入一个int参数为value值,另一个是传入String字符串,转换为int类型value,如果无法转换会抛出NumberFormatException

parseInt方法解析:传送门

我们回到Integer类的声明,除了实现Comparable<Integer>接口,还继承了Number抽象类。

public abstract class Number implements java.io.Serializable {public abstract int intValue();public abstract long longValue();public abstract float floatValue();public abstract double doubleValue();public byte byteValue() {return (byte)intValue();}public short shortValue() {return (short)intValue();}
}

我们看到Number是可序列化的抽象类,并且提供了int,long,float,double数值获取的抽象方法,以及byte,short数值获取的方法实现。这里其实就是java的多态,运行时才知道Number的实例类型,调用具体的取值方法。

而Integer在重写这些方法时,除了int取值返回value本身外,其它直接强制转换。

最后我们再了解下Integer中另一个常用的方法valueOf:传送门

针对Integer分析暂时到这,有兴趣的读者还可以自行深入研究,这里套用别人一句话结尾:

与其听信谣言,不如自我实践。

http://www.lryc.cn/news/2416479.html

相关文章:

  • CImage 从内存中读取图像
  • FileZilla Server简介及使用说明
  • 解决Adobe reader 8 突然打不开了并报许可协议的问题
  • 2023年【A特种设备相关管理(锅炉压力容器压力管道)】报名考试及A特种设备相关管理(锅炉压力容器压力管道)模拟考试题
  • vue 项目如何捕获awit 错误情况
  • 可行性分析与需求分析 —以图书馆管理系统为例
  • 破解密码的8种典型手段与防护建议
  • Linux service network服务重启失败及ping不通外网解决办法
  • linux 多媒体安装和使用
  • cnna词汇集(三)
  • CreateProcess失败返回错误代码998
  • 0x0000007B是什么意思?解决方案
  • 43张图详解计算机网络,看这一篇就够了
  • C语言中,事件对象(CreateEvent)、互斥对象(CreateMutex)、关键代码段(InitializeCriticalSection)
  • 量子通信和传统通信的对比分析
  • keil报错:Loading PDSC Debug Description failed for STMicroelectronics STM32Fxxxxxxx
  • php ismethod,PHP的method_exists,function_exists,is_callable的区别
  • linux ioctl 函数
  • #SATA# SATA 专业术语
  • 工作流引擎 介绍
  • 权限持久化---映像劫持检测(Shift后门)
  • 【金士顿PS2251-03(PS2303)量产教程_2024】
  • Winedit修改快捷键
  • 推荐一款强大的Go语言工具:goid
  • GitHub Pages + Jekyll 快速搭建个人博客网站
  • JavaScript(BOM)中Window对象的prompt()方法
  • 注意力机制总结
  • windows配置防火墙
  • Sōsh:让宅男宅女从虚拟回到现实的社交网站
  • 一秒教你保存浏览器当前页面的所有图片