发表时间:2022-03-25来源:网络
学习了许久的Java,我们知道Java是一种面向对象的语言,万物皆对象。但是我们之前在说到Java基本数据类型的时候,由于处理对象需要额外的系统开销,于是出于对性能的考虑,基本数据类型并不做为对象使用。
既然是面向对象的,在Java中许多方法需要把对象作为参数,但是基本类型变量身上没有任何方法和属性,于是Java提供了一个简单的方法,就是为每一个基本数据类型类型都配套提供一个包装类型,我们便可以在两者之间来回反复地横跳。
先看一波包装类型的继承图:
数值类型都直接继承于父类Number类,非数值类型Character和Boolean直接继承于Object类。
除此之外,包装类型的名字也非常好记,除了int->Integer和char->Character两个比较特殊之外,其他都是基本数据类型的首字母改为大写即可,如:byte->Byte。
通过查看官方文档,我们可以发现,数值类型继承的Number类其实是一个抽象类,那么可想而知,该类中的抽象方法已经在这几个数值类型中得到实现,看一波:
很明显,除了最后一个serialVersionUID(这个以后再总结),其他的方法在数值型包装类中都存在,可以通过这些方法将对象“转换”为基本类型的数值。
我们再来看看包装类型的构造器,我们再查看所有包装类之后,发现:
所有的包装类型都不存在无参构造器。 所有包装类的实例都是不可变的。 一旦创建对象后,它们的内部值就不能进行改变。深究一下,parse(String s,int radix)中的radix其实代表着进制信息,而我们的构造器默认让radix为10,代表着输出字符串s在十进制下的数,所以除了数字0-9之外,字符串中不能有其他的玩意儿,否则会抛出NumberFormatException的异常。
我们在上面说过,基本数据类型和包装类型之间的转换涉及到装箱与拆箱的操作,为了简化代码,在JDK1.5之后,Java允许基本类型和包装类型之间可以自动转换。
将基本类型直接赋值给对应的引用类型,编译器在底层自动调用对应的valueOf方法。
就像下面这样:
我们利用debug调试工具设上断点,发现在执行Integer in = i; 时,将会自动调用下面的方法:
继续深究其底层实现,我们发现IntegerCache其实是Integer包装类的一个内部类,我们进入IntegerCache一探究竟:
我们会发现所有的整数类型的(包括Character)包装类里都有类似的玩意儿,所以大致运行的规则应该大致相同,在这里就总结几点不太一样的:
只有Integer包装类才可以更改缓存大小。 Character容量只有128。将引用类型字节赋值给对应的基本类型,编译器在底层自动调用对应的xxxvalue方法(如intValue)。
Integer in = 5; int i = in;自动拆箱相对来说就稍微简单一点了,我们还是利用debug工具,发现上面的代码将会自动调用下面的方法
equals比较的是同一包装类型,即比较两者数值是否相等
Integer i1 = 5; Integer i2 = 5; Integer i3 = 10; //同一包装类型,比较数值是否相等 System.out.println(i1.equals(i2));//true System.out.println(i3.equals(i1+i2));//true Long l1 = 5L; Long l2 = 10L; //Long与Integer比较,不是同一类型,false System.out.println(l1.equals(i1));//false //先自动拆箱,i1先转为int,l转为long,int自动类型提升转为long,最后相等 System.out.println(l2.equals(l1+i1));//true
皓盘云建最新版下载v9.0 安卓版
53.38MB |商务办公
ris云客移动销售系统最新版下载v1.1.25 安卓手机版
42.71M |商务办公
粤语翻译帮app下载v1.1.1 安卓版
60.01MB |生活服务
人生笔记app官方版下载v1.19.4 安卓版
125.88MB |系统工具
萝卜笔记app下载v1.1.6 安卓版
46.29MB |生活服务
贯联商户端app下载v6.1.8 安卓版
12.54MB |商务办公
jotmo笔记app下载v2.30.0 安卓版
50.06MB |系统工具
鑫钜出行共享汽车app下载v1.5.2
44.7M |生活服务