包装类
java语言是面向对象的语言,而基本数据类型的数据不是对象,但是有的时候我们
需要研究使用基本数据类型的数据,需要将之转换成对象来使用,这个时候我们可
以将基本数据类型包装成引用类型。
每一个基本数据类型都对应一个包装类:
byte----->Byte
short---->Short
int------>Integer
long----->Long
float---->Float
double--->Double
char----->Character
boolean-->Boolean
特点:
(1)都是final修饰的
(2)一经创建的对象里的数据不可变
(3)Character和Boolean的父类是Object,其他六种的父类是Number类型
(Number是抽象类)
Integer:
常用构造器:
Integer(int value)
通过指定的基本数据类型的数据构建一个Integer对象
Integer(String str)
通过指定的字符串的数据构建一个Integer对象
常用方法:
int intValue();
作用是将包装类的对象拆箱成基本数据类型
static int parseInt(String s)
作用是将字符串转换成10进制的基本数据类型
static Integer valueof(String s)
作用是将字符串转成Integer对象
JDK1.5以后支持自动装箱和拆箱(reg:TextBox1)
/**
* jdk1.5以后支持自动装箱和拆箱
* */
public class TextBox1 {
public static void main(String[] args) {
/*
* 发生了自动装箱操作,相当于调用了Integer.valueOf(5)
* 5被包装成对象,存在堆中。将地址值给了变量i
* */
Integer i = 5;
/*
* 发生了自动拆箱操作,相当于i.intValue()
* 对象i被拆箱成基本数据类型5存储在num空间里
*/
int num = i;
/*
*任何引用数据类型的变量不可以进行运算。
*除了字符串拼接
*/
Integer n1 = new Integer(10);
Integer n2 = new Integer(20);
Integer n3 = n1+n2;
/*
* n1发生了自动拆箱,即n1.intValue(),变成基本数据类型
*n2发生了自动拆箱,即n2.intValue(),变成基本数据类型
*然后进行运算,结果为基本数据类型的30
*30自动装箱,底层调用Integer.valueOf(30),
*变成对象n3
*/
System.out.println(n3);
}
}
包装类的常量池
基本数据类型的包装类除了浮点数类型都有自己的常量池。当将基本数据类型进行自动装箱时,装箱后的对象的字面值,如果是在 -128~127会存储在常量池中,会先检查常量池中是否有相同字面值的对象,如果有,则将常量池的地址给引用变量。
public class Text02 {
public static void main(String[] args) {
Integer i1 = new Integer(100);
Integer i2 = new Integer(100);
System.out.println(i1 == i2);// false,不是自动装箱时数据不是存在常量池中
// 测试自动装箱
Integer i3 = 100;// 100装箱后变成对象,存入常量池中
Integer i4 = 100;
/*
* 100装箱后,去常量池中查找是否有相同值的对象,发现存在 就将常量池中的i3值给了i4
*/
System.out.println(i3 == i4);
Byte i5 = 100;
Byte i6 = 100;
System.out.println(i5 == i6);
/*
* 整数的包装类 Byte,Short,Integer,Long都有自己的常量池(字面量-128~127)
* Character也有自己的常量池: '\u0000'~'\u007f'
*
* Boolean也有常量池
*
* 浮点数类型的包装类没有常量池
*/
System.out.println(i5 == (Number) i3);// Byte和Integer的父类是Number,用Number进行强转
Character c1 = (char) (-1);
Character c2 = (char) (-1);
System.out.println(c1 == c2);
Boolean f = true;
Boolean f1 = true;
System.out.println(f == f1);
}
}