Java是一门面向对象的语言,但是在Java中却存在几个异类,它们没有属性,没有方法,也不能实现对象的交互,它们就是八大基本数据类型。而且基本数据类型作为类的属性,存在默认值,有些时候,这些默认值则会干扰我们的判断。
包装类与基本数据类型
包装类与基本数据类型是一一对应的,作为引用数据类型,包装类拥有属性、方法、能达成对象的交互,也就意味着我们可以通过这些属性方法来实现之前一些没有办法对基本数据类型数据完成的操作。
包装类属性方法和构造器简介
- 包装类没有子类
- 基本数据类型继承Number
- 字符型char和布尔型boolean继承自Object
- java中所有的包装类都存放在java.lang包中
- 包装类的方法大部分都是static方法:静态方法既可以通过类名调用也可以通过对象名调用
- 包装类中一般会提供两种构造器用于构建对象
- 使用基本数据类型的参数;
- 使用字符串类型的参数:对于此类参数,在实际创建对象的时候要注意输入的值要满足条件;
包装类与基本数据类型的转换
包装类与基本数据类型之间的转换,非常的简单,因为在Java中提供了装箱与拆箱的技术。Java中,装箱是把基本数据类型的值转换为对应包装类的对象,拆箱就是把包装类对象转换为对应基本数据类型的值。
从基本数据类型转成引用数据类型的方法:
- 从构造器创建(手动装箱)
- 自动装箱创建
从引用数据类型转成基本数据类型:
- 使用 对象.xxxxValue()(手动拆箱)
自动拆箱
int y = 10;
Integer yi = new Integer(y);
Integer yi2 = y;
int y3 = yi.intValue();
boolean b = false;
Boolean bi = new Boolean(b);
Boolean bi2 = b;
boolean bi3 = bi2.booleanValue();
基本数据类型与字符串转换
基本数据类型转换为字符串类型:
将基本数据类型转换为字符串,可以使用包装类方法toString(typeValue)来实现转换操作int t1 = 10;
String t2 = Integer.toString(t1);
字符串类型转换为基本数据类型
- 方法一:包装类的parse方法
示例: int t = Integer.parseInt(StringValue);
int t3 = Integer.parseInt("3");
- 方法二: 使用包装类的 valueOf(StringValue)的方法,先将字符串转换为包装类,再通过自动拆箱完成基本数据类型转换。
示例: int t = Integer.valueOf(StringValue);
int t4 = Integer.valueOf(t2);
- 包装类的初始值为null
这也是为什么我们有点时候在设置类的属性时,需要采用包装类,因为能够避免基本数据类型的初始值。
- 包装类的比较
Java中有一个缓存区机制,Integer中,数值在-128到127之间的值会进行缓存,取值时会从缓存中读取数据,如果有,直接返回地址使用;如果没有这个数值,会new Integer进行创建。
public class Test {
public static void main(String[] args) {
Integer one = new Integer(100);
Integer two = new Integer(100);
System.out.println("one==two的结果:" + (one == two));//false 比较的是内存地址,此处one与two的内存地址不同
Integer three = 100;
System.out.println("three==100的结果:" + (three == 100));//true 自动拆箱
System.out.println("three==one的结果:" + (three == one));//false 内存地址
Integer four = 100;
/**
* 数字范围在[-128,127]之间直接从对象池获取(有就直接产生,没有实例化Interger),
* 故three和four共享同一块内存空间,
* 实际操作为 Integer four = Integer.valueOf(100);
*/
System.out.println("three==four的结果:" + (three == four));//true
Integer five = 200;
System.out.println("five==200的结果:" + (five == 200));//true 自动拆箱
Integer six = 200;
System.out.println("five==six的结果:" + (five == six));//false 超过了127的范围,内存地址不同
}
}
- Double和Float没有对象常量池(缓存区),其余6种基本类型的包装类都有。不可以适用上述的比较原理