黑马程序员_基本数据类型对象包装类

本文详细介绍了Java中基本数据类型与包装类之间的转换、整数的进制转换以及JDK1.5自动装箱和拆箱机制。重点讲解了如何使用包装类进行数据类型转换、自动装箱与拆箱的原理与应用,并强调了包装类相较于基本类型的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、基本数据类型对象包装类
为了方便操作,基本数据类型值,将其封装成了对象,在对象中定义了属性和行为丰富了该数据的操作。
用于描述该对象的类就称为基本数据类型对象包装类。
基本数据类型对象包装类
byte
Byte
intInteger
floatFloat
charCharacter
shortShort
longLong
doubleDouble
booleanBoolean

基本类型---->字符串
1.基本类型数值+" ";
2.String类中的静态方法 valueOf(基本类型数值);
3.用Intger的静态方法valueOf(基本数据类型);


字符串---->基本类型

1.使用包装类中静态方法 xxx paseXXX("xxx类型字符串");
   只有Character没有pares方法,它用toString();
2.如果字符串被Integer进行对象封装.
    可以使用另一个非静态方法,intValue();将一个Integer对象转成基本数据类型值.

二、整数的各个进制转换
十进制---->其他进制
Integer.toBinaryString(int i);十进制--->二进制
    toHexString(int i);十进制--->十六进制
       toOctalString(int i);十进制--->八进制
    toString(int i,int radix);十进制--->任意进制
其他进制--->十进制
    parseInt(String s,int radix);//radix---基数


三、JDK1.5自动装箱和拆箱

两者有什么差别,包装类是类,是对象,而基本类型是有值的“变量”,再细化一点,就是包装类的实例(对象)创建在堆上,而基本类型创建在栈上,这是JAVA为了程序的速度考虑做出的优化,那么既然是创建在栈上,所以基本类型都有大小的规定(每种基本类型所占的字节是一定的)。
扯句题外话,那么为什么java的设计者要设计出包装类呢?我的理解是既然java作为一门面向对象的语言,那么包装类作为类,可以容纳更多的信息,可以提供更多的操作。另外,包装类都实现了Comparable接口,可以实现对象之间的比较,所以包装类之间的比较尽量用compareTo,而不是><=这些运算符。切记。
在JDK1.5之前,我们要实现基本类型和包装类之间的转换,大多是通过包装类提供的方法,Integer i = Integer.valueOf(5)或者int j = i.intValue()来做互相转换的。JDK1.5之后,编译器会在我们做赋值操作(这里所说的赋值操作不包括构造函数,我们后面会讲)的时候帮我们自动完成基本类型和包装类之间的相互转换。
上面我们所说的赋值操作,基本上可以分为两种情况,一种是显式赋值,另一种是隐式赋值.

Integer x = new intgert(4);可以直接写成
integer x =4;// 自动装箱

显式赋值:我们可以理解为有赋值符号出现的情况,这里编译器会自动的帮你完成把4这个int的基本类型装箱成包装类实例的工作,这样就不用我们再手动的转换了。

x = x +5;//自动拆箱,通过intValue方法;

隐式赋值:就是没有复制符号出现的情况,这点我们很多人经常忽略,比如方法调用时候的参数传递,比如我们有一个接受Integer类型参数的方法(void method(Integer i)),我们在调用的时候可以直接传递一个基本类型的实参进去(method(5)),这时候编译器会自动的将我们传递进去的实参装箱成包装类,从而完成对方法的调用。很简单的一个过程,里面的原理却不简单,这是因为,方法调用的时候,在内存中的栈上,首先会为方法的形参创建内存区域,然后将我们传递进去的实参赋值给形参,看到没,就是在这时,发生了赋值操作,才会让编译器完成装箱操作。当然,方法执行完后,栈上有关形参的内存区域会被回收。

还有我们要记住一点,就是编译器的装箱/拆箱原则,就是基本类型可以先加宽(比如int转换为long),再转变成宽类型的包装类(Long),但是不能转变成宽类型的包装类型。
比如我们有个方法 void method(long l),我们通过method(5)是可以调用该方法的,因为int类型的5被加宽成了long类型;但是如果这个方法变成void method(Long l),我们通过method(5)就不能调用它了,因为int类型的5是不能直接转换成Long包装类的。切记。
需要注意:Integer比int多一个值------null,在使用时,如果Integer x = null;上面的代码就回出现NullPointerException.所以需要做一个判断.

Integer a = new Integer(128);
Integer b = new Integer(128);
a==b;为false,因为它们开辟的空间地址不一样;
a.equals(b)为true,因为值相同覆盖了Object方法;
  
Integer x = 127;
integer y = 127;
x==y;为true,因为JDK1.5后自动装箱中如果是一个字节,数据会被共享,不开辟空间;
在这一块,java的设计者采用了cache pool的设计模式,在Integer这个类里面有一个长度为256的静态Integer数组,里面存储了从-128到127的Integer对象,当我们传递进去的参数在这个范围之内时,这个方法会返回该数据中实现保存的Integer对象实例,只有超过该范围时,才会返回new出来的Integer对象实例。
x.equals(y)为true,因为值相同;


PS:==符号比较的基本类型的值,对对象类型而言,比较的是对象的内存地址。

自动装箱:基本数据类型赋值给引用数据类型;
自动拆箱:当引用数据类型与基本数据运算时.



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值