目录
写在前面: 基本数据类型是不具备对象的特点, 不能调用对象方法, 为了让java更加面向对象, 增加了八种基本数据类型的包装类, 以下以Integer为例.
创建
构造方法
使用构造方法创建Integer对象
Integer i = new Integer(int x);
静态方法
Integer i2 = Integer.valueOf(int x);
什么是装箱和拆箱
装箱: 包装类就是将基本数据类型包装起来, 就是装箱, 创建Integer对象就是装箱的过程
拆箱: 将包装类转换成基本数据类型
int i3 = i2.intValue();
自动装箱和自动拆箱
这个机制让我们更方便灵活运用int和Integer,既可以让包装类对象按照基本数据类型的操作方式进行操作,也可以让包装类对象依然具备对象的特性. (一举两得)
什么时候自动装箱: 当基本数据类型要做一下引用数据类型才能完成的操作的时候, 系统自动将基本数据类型封装包装类型
Integer i4 = 200;
//相当于====
Integer i4 = Integer.valueOf(200);
什么时候自动拆箱: 当引用数据类型要做基本数据类型才能完成的操作时,系统自动将包装类拆箱转换为基本数据类型
Integer i5 = new integer(10);
//相当于====
int i5 = Integer.intValue(10);
System.out.println(i5+15);
数值与字符串数值之间的转换
数值转字符串
Integer a = 15;
//1.使用字符串拼接
String s1 = a+"";
//2.主动调用重写的toString方法
String s2 = a.toString();
//3.被动转换, 使用String.valueOf(), 将传进去的参数变成String
String s3 = String.valueOf(a);
字符串转数值
String s = "10.9";
//1.使用BigDecimal进行操作
BigDecimal bi = new BigDecimal(s);
//2.使用Integer的parseInt方法, 返回int对象
int i = Integer.ParseInt(s);
//3.使用包装类的静态方法valueOf, 将传入参数转为包装类对象
Integer i3 = Integer.valueOf(s)
缓存区问题
整数类型(byte/short/int/long)的包装类都有相应的缓存区: 从-128~127
当使用valueOf静态方法创建对象时, 会先检查缓存区中是否有对应的包装类对象, 如果有,直接引用地址 , 如果没有, 则创建新的包装类对象 .
应用
//题目:观察代码,说出比较的结果.
Integer i1 = new Integer(120);
Integer i2 = new Integer(120);
System.out.println(i1 == i2);
Integer i3 = Integer.valueOf(120);
Integer i4 = Integer.valueOf(120);
System.out.println(i3 == i4);
Integer i5 = Integer.valueOf(200);
Integer i6 = Integer.valueOf(200);
System.out.println(i5 == i6);
Integer i7 = 100;
Integer i8 = 100;
//自动装箱走的是valueOf方法
System.out.println(i7 == i8);
1. 使用构造方法创建对象 , 在堆中创建, 不同对象的地址不同
2. 使用valueOf静态方法创建对象, 会先检查对象值是不是在缓存区中(-128~127),如果是,直接引用这个地址
3. 使用valueOf静态方法创建对象, 如果对象值不在缓冲区, 则调用构造方法创建新的对象
4. 使用自动装箱的机制 , 实际上调用的是valueOf静态方法.