️️️️ Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类,包装类就是将基本数据类型封装成一个类,让这个基本数据类型作为类的一个属性
包装类(如:Integer,Double等)这些类封装了一个相应的基本数据类型数值,并为其提供了一系列操作方法。
八种数据类型对应的包装类:
| 基本数据类型 | 对应包装类 | 包装类的父类 |
|---|---|---|
| byte | java.lang.Byte | java.lang.Number |
| short | java.lang.Short | java.lang.Number |
| int | java.lang.Integer | java.lang.Number |
| long | java.lang.Long | java.lang.Number |
| float | java.lang.Float | java.lang.Number |
| double | java.lang.Double | java.lang.Number |
| boolean | java.lang.Boolean | java.lang.Object |
| char | java.lang.Character | java.lang.Object |
注意:
java八种基本数据类型的字节数:分别为1、2、4、8个字节;1字节(byte、boolean)、 2字节(short、char)、4字节(int、float)、8字节(long、double);
八种基本数据类型的包装类,除了char的是Character、int类型的是Integer,其他都是首字母大写;
对应包装类的直接父类:前6个由于是数,直接父类为Number,而后两个的直接父类就是Object类;
对于包装类来说,这些类的用途主要包含两种:
● 作为和基本数据类型对应的类类型存在。
● 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
常用常量:
①SIZE:表述这个具体对象的value值的二进制表示形式下的位数
②BYTES:表示这个包装类对应基本类型的字节数(byte)
一个字节(byte)==八位(bit);
比如:Integer对应的基本数据类型就是int类型,一个int类型的对象占四个字节
③ MAX_VALUE: 表示 int 型可取的最大值
④ MIN_VALUE: 表示 int 型可取的最小值
案例:
System.out.println(Integer.MIN_VALUE);//int类型可取的最小值:-2147483648 System.out.println(Integer.MAX_VALUE);//int类型可取的最大值:2147483647 System.out.println(Integer.BYTES);//int类型的字节数:4 System.out.println(Integer.SIZE);//int类型的二进制位数:32⛳️包装类常用属性方法
以下都以Integer为例
1.构造方法①Integer(int a);
以 int 型变量作为参数创建 Integer 对象,实例代码如下:
Integer a = new Integer(8);
②Integer(String a);
以 String 型变量作为参数创建 Integer 对象,实例代码如下:
Integer number=new Integer("8");
2.比较方法
①public static int compareTo(Integer anotherInteger );
在数字上比较两个 Integer 对象,如果这两个值相等,则返回 0;如果调用对象的 数值小于 anotherInteger 的数值,则返回负值;如果调用对象的数值大于anotherInteger 的数值,则返回正值
②public boolean equals(Object IntegerObj );
比较此对象与指定对象是否相等
③public int max(int a,int b);
返回a、b中数值大的
④public int min(int a,int b);
返回a、b中数值小的
3.转换方法①public static toBinaryString(int i);
十进制转为二进制形式
②public static String toHexString(int i);
十进制转为十六进制形式
③public static String toOctalString(int i);
十进制转换为八进制
案例:
public class IntegerDemo1 {
public static void main(String[] args) {
//转2进制
System.out.println(Integer.toBinaryString(3));//11
//转16进制
System.out.println(Integer.toHexString(17));//11
//转8进制
System.out.println(Integer.toOctalString(9));//11
}
}
④public int intValue();
返回这个对象的value值
⑤public static int parseInt(String s);
将String类型的实参转换为int类型
注意:在转换时要保证这个String实参可以转换为int类型,如果这个字符串中包含有字母,那么就会出现转换异常
⑥public String toString();
返回一个表示该Integer 值的 String 对 象
⑦static Integer valueOf(int i);
将int类型的数值转换为Integer类型
⑧static Integer valueOf(String s);
将String类型的转换为Integer类型
案例:
public class IntegerDemo1 {
public static void main(String[] args) {
Integer i1 = new Integer(10);//基本类型包装到对象中
int i2 = i1.intValue();//把对象中的基本类型取出来
int i3 = Integer.parseInt("10");//将String类型转为int类型
i1.toString();//将int包装类型转为String类型
Integer i4 = Integer.valueOf(10);//将基本类型转为引用类型
Integer i5 = Integer.valueOf(10);//将String类型转为引用类型
}
}
⛳️自动装箱和自动拆箱
1.概念
简介:jdk1.5之后的新特性。该特性是编译器认可的,是在编译器自动将基本数据类型和包装类相互转换,节省了麻烦。
自动装箱:java编译器自动将基本数据类型转换为包装类,自动调用的是valueOf方法
自动拆箱:java编译器自动将包装类转换为基本数据类型,拆箱的时候自动调用的是xxxValue方法
案例:
public void IntegerDemo() {
//自动装箱
Integer a=12;//原理是Integer a = Integer.valueOf(12);
//自动拆箱
int b=a+1;//原理是int b = a.intValue()+1;
Integer c=123;
Integer d=123;
Integer e=c+d;
}
2.valueOf()方法源码研究
按住ctrl键,鼠标点击该方法即可查看源码,下面以Integer类的valueOf(int i)为例
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
理解:由于我们经常会将-128-127之间的数进行包装成类,所以我们就在Integer的内部定义了一个IntegerCache结构,IntegerCache中定义了Integer [] 数组在这个数组中保存了-128-127范围之间的整数,我们使用自动装箱的方式给Integer赋值时, Integer类的valueOf(int i)方法首先会判断i是否在-128~127之间,如果在的话,就返回的对象是Integer类中静态数组cache中的对象,如果不是在这之间,就会重写创建一个新的对象。
通过查看其它类该方法的源码之后,可以得到该表:
| 包装类 | valueOf(X i)返回对象原则 |
| Byte | 直接取,数组范围为(-128,127),且byte值的范围也是(-128,127) |
| Short | (-128,127)之间在数组中取,否则new |
| Integer | (-128,127)之间在数组中取,否则new |
| Long | (-128,127)之间在数组中取,否则new |
| Float | 直接new |
| Double | 直接new |
| Boolean | 直接返回,不new |
| Character | (0,127)之间从数组中取,否则new |
public class IntegerDemo {
public static void main(String[] args) {
Integer a1=127;
Integer a2=127;
int a3=127;
Integer b1=128;
Integer b2=128;
int b3=128;
System.out.println(a1==a2);//true
System.out.println(a1==a3);//true
System.out.println(b1==b2);//false
System.out.println(b1==b3);//true
}


![包装类[java] 包装类[java]](http://www.mshxw.com/aiimages/31/786052.png)
