首页 分享 Java面向对象系列[v1.0.0][包装类]

Java面向对象系列[v1.0.0][包装类]

来源:花匠小妙招 时间:2025-01-05 22:42

java是面向对象的编程语言,但它提供了8中基本类型,这8种基本类型不支持面向对象的编程机制也不具备对象的特性,没有成员变量和方法可以调用;所有的引用类型都继承了Object类,都可以当成Object类型变量来使用,但这8种基本类型就不可以,如果某个方法需要的是Object类型的参数,但实际需要的值确实2,3等数值,就非常难处理
为了解决类似的问题,Java提供了Wrapper Class的概念即包装类为8种基本类型分别定义了引用类型,并称为基本数据类型的包装类
在这里插入图片描述
在JDK1.5之前,如果需要进行转换还需要使用对应包装类的valueof()静态方法,返货来要获取包装类中的基本类型变量需要xxxvalue()实例方法,在JDK1.5之后就抛弃了这种语法
在这里插入图片描述

JDK1.5:自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)

自动装箱:就是可以直接把一个基本类型变量直接赋给对应的包装类变量,或者赋给Object变量(Object是所有类的父类,子类对象和直接赋给父类变量)
自动拆箱:自动拆箱则反之,允许直接把包装类对象赋给一个对应的基本类型变量

public class AutoBoxingUnboxing { public static void main(String[] args) { // 直接把一个基本类型变量赋给Integer对象 Integer inObj = 5; // 直接把一个boolean类型变量赋给一个Object类型的变量 Object boolObj = true; // 直接把一个Integer对象赋给int类型的变量 int it = inObj; if (boolObj instanceof Boolean) { // 先把Object对象强制类型转换为Boolean类型,再赋给boolean变量 boolean b = (Boolean) boolObj; System.out.println(b); } } } 123456789101112131415161718

有了自动装箱和自动拆箱后,大大简化了基本类型变量和包装类之间的转换过程,只需要注意一下几点

类型匹配,例如Integer只能自动拆箱成int类型变量,不要试图拆箱成boolean,反之亦然,即便是赋给Object类型变量,那也只是利用了Java的向上自动转型特性,不要试图装箱成Boolean通过包装类、自动装箱拆箱,可以把基本类型的变量“近似”的当成对象使用,反过来也可以把包装类实例“近似”的当成基本类型的变量使用

基本类型和字符串之间的转换

利用包装类提供的parseXxx(String s)静态方法(除Character之外的所有包装类都提供了该方法)利用包装类提供的valueOf(String s)静态方法String类也提供了多个重载valueOf()方法用于将基本类型变量转换成字符串

public class Primitive2String { public static void main(String[] args) { var intStr = "123"; // 把一个特定字符串转换成int变量 var it1 = Integer.parseInt(intStr); var it2 = Integer.valueOf(intStr); System.out.println(it2); var floatStr = "4.56"; // 把一个特定字符串转换成float变量 var ft1 = Float.parseFloat(floatStr); var ft2 = Float.valueOf(floatStr); System.out.println(ft2); // 把一个float变量转换成String变量 var ftStr = String.valueOf(2.345f); System.out.println(ftStr); // 把一个double变量转换成String变量 var dbStr = String.valueOf(3.344); System.out.println(dbStr); // 把一个boolean变量转换成String变量 var boolStr = String.valueOf(true); System.out.println(boolStr.toUpperCase()); // itStr的值为"5" 这是一种将基本类型转换为字符串更简单的方法 // 将基本类型变量和""进行连接运算,系统会自动把基本类型变量转换成字符串 var itStr = 5 + ""; } } 123456789101112131415161718192021222324252627282930

在这里插入图片描述
虽然包装类型的变量是引用类型,但包装类的实例可以与数值类型的值进行比较,这种比较是直接取出包装类实例所包装的数值进行比较的

public class WrapperClassCompare { public static void main(String[] args) { var a = Integer.valueOf(6); // 包装类实例与数值进行比较,此处结果输出true System.out.println("6的包装类实例是否大于5.0" + (a > 5.0)); // 两个包装类的实例进行比较,因为包装类的实例实际上是引用类型 // 只有两个包装类引用指向同一个对象时才会返回true,此处输出false System.out.println("比较2个包装类的实例是否相等:" + (Integer.valueOf(2) == Integer.valueOf(2))); // 通过自动装箱,允许把基本类型值赋值给包装类的实例 Integer ina = 2; Integer inb = 2; System.out.println("两个2自动装箱后是否相等:" + (ina == inb)); // 输出true Integer biga = 128; Integer bigb = 128; System.out.println("两个128自动装箱后是否相等:" + (biga == bigb)); // 输出false } } 1234567891011121314151617181920

自动装箱成为Integer类型后,为什么int值是2的比较结果是true,而128的比较结果是false,先看一下java.lang.Integer类的源码

//定义一个长度为256的Integer数组 static final Integer[] cache = new Integer[-(-128) + 127 + 1]; static{ //执行初始化,创建-128到127的Integer实例,并放入到cache数组中 for(int i = 0; i < cache.length; i++) cache[i] = new Integer(i -128); } 1234567

源码中可以看出,系统是把一个-128到127之间的整数自动装箱成Integer实例,并放入了一个名为cache的数组中缓存起来,当我们把一个-128到127之间的整数直接装箱成一个Integer实例时,实际上是直接指向了cache数组中的一个数组元素,能够对应上,因此在-128到127之间的整数自动装箱成Integer实例时,永远都是引用cache数组中的数组元素,因此2的比较是True,128超出了范围,在自动装箱成Integer实例时,系统总是会重新创建一个Integer实例,因此返回False

JDK1.7:静态的compare(xxx val1, xxx val2)

Java7为所有的包装类提供了静态的compare(xxx val1, xxx val2)方法,可以直接使用该方法来比较两个基本类型值的大小,包括比较boolean类型值【两个boolean值比较,true>false】

System.out.println(Boolean.compare(true, false)); // 输出1 System.out.println(Boolean.compare(true, true)); // 输出0 System.out.println(Boolean.compare(false, true)); // 输出-1 123

JJDK7还未Character包装类增加了大量的工具类方法来对一个字符进行判断,详细的可以直接看Character的API文档

JDK1.8:增强包装类

Java8在此增强了包装类,提供了无符号算术运算,为整型包装类增加了支持无符号运算的方法:

static String toUnsignedString(int/long i):该方法将指定的int或者long型整数转换为无符号整数对应的字符串static String toUnsignedString(int/long i, int radix):该方法将指定的int或者long型整数转换为指定进制的无符号整数对应的字符串static xxx parseUnsignedXxx(String s):static xxx parseUnsignedXxx(String s, int radix):static int compareUnsigned(xxx x, xxx y):static long divideUnsigned(long dividend, long divisor):static long remainderUnsigned(long dividend, long divisor):

Java8还为Byte、Short增加了toUnsignedInt(xxx x)、toUnsignedLong(yyy x)两个方法,这两个方法用于将指定的byte或short类型的变量或值转换成无符号的int或long值

public class UnsignedTest { public static void main(String[] args) { byte b = -3; // 将byte类型的-3转换为无符号整数。 System.out.println("byte类型的-3对应的无符号整数:" + Byte.toUnsignedInt(b)); // 输出253 // 指定使用16进制解析无符号整数 var val = Integer.parseUnsignedInt("ab", 16); System.out.println(val); // 输出171 // 将-12转换为无符号int型,然后转换为16进制的字符串 System.out.println(Integer.toUnsignedString(-12, 16)); // 输出fffffff4 // 将两个数转换为无符号整数后相除 System.out.println(Integer.divideUnsigned(-2, 3)); // 将两个数转换为无符号整数相除后求余 System.out.println(Integer.remainderUnsigned(-2, 7)); } } 12345678910111213141516171819

无符号数最大的特点是最高位不再被当成符号位,因此无符号整数不支持负数,其最小值为0
理解上边的程序关键是先把操作数转换为无符号整数,然后再进行计算,例如byte类型的-3,其原码是10000011(最高位1表示负数),其反码为11111100,补码为11111101;如果将该数当成无符号整数处理,那么最高位1就不再表示符号,也是数值,该数就是253,也就是上边程序的输出结果了

相关知识

【JAVA】Java基础—面向对象编程:类与对象
Java编程:包装类、日期处理与String详解
面向对象基本思想:面向对象=对象+类+继承+通信
手撕Java系列
面向对象2
养生类花草茶系列包装设计说明
面向对象网上花店管理系统
类和对象(上)
Java对象生命周期管理:从创建到垃圾回收的完整解析
面向对象的病虫害数据库研究与建立

网址: Java面向对象系列[v1.0.0][包装类] https://www.huajiangbk.com/newsview1462164.html

所属分类:花卉
上一篇: 百亩樱桃生态园建设项目建议书.d
下一篇: 组合式计量包装机

推荐分享