包装类简介
java是一种面对对象的编程语言,但是它并不是所有的内容都是面对对象的。java中也含有非面对对象的成分,其中最常用的非面对对象的成分就是八种基本数据类型,这八种基本数据类型在java中并不属于对象。但是在java中应用时经常需要将这八种基本数据类型转换为对象,比如在之前的文章《利用数组储存表格数据》一文中我们定义了一个Object类的数组,当定义这个数组中的元素时就要求里面的元素必须是对象,而当我们传入八种基本数据类型作为这个数组中的元素时,由于八种基本数据类型不是对象,所以从原理上来说是不合法的。但是我们发现这时代码并没有报错,这是一因为在输入八种基本数据类型作为Object类数组的对象时,系统判断数组元素应为对象,这时系统就对输入的八种基本数据类型进行了自动包装操作,将其转换为了对象。
于是上面的操作中就涉及到了在java中将八种数据类型转换为对象的操作。在java中用于实现将八种基本数据类型转换为对应的对象的类统称为包装类。包装类包含了八个子类,分别为Byte、 Boolean 、Short 、Character、 Integer、 Long 、Float 、Double。它们分别对应了byte、 boolean、 short、 char、 int、 long、 float、 double这八种基本数据类型,这里要特别注意char和 int着两种数据类型对应的包装类的名称,以免混淆。
在八种基本数据类型中,byte、short、int、long、float、double这6种数据类型是数字,因此在创建这六种数据类型对应的包装类时给它们定义了一个共同的父类Number。Number类是一个抽象类,在这个抽象类中提供了byteValue()、shortValue()、intValue()、longValue()、floatValue()以及doubleValue()这六个抽象方法,用于实现类型之间的转换,这就意味着所有的数字类型在其允许的范围内都可以互相转换,同时实现了Number抽象类的类都要实现这六个方法。
包装类的作用主要有将八种基本数据类型转换为对象和存储这些数据类型的相关属性比如最大值、最小值等,以及相关的操作方法两种,其中相关的操作是指实现基本数据类型、包装类对象、字符串三者之间的转换操作。
包装类将八种基本数据类型转换为对象的原理是在包装类中定义一个未赋值常量属性value,在进行转换时将传入的数据类型的值赋给这个value属性,这时传入的数据就变成了新建对象中的value属性的值,实现了将基本数据类型转换为对象的操作。因此这也决定了实现这个操作的语法结构有以下几种:
1、包装类名称 变量名 = new 包装类名称(要转换为对象的数据);
2、包装类名称 变量名 = 包装类名称.valueOf(要转换为对象的数据);
其中第一种格式在JDK9以后被废除,但是仍旧可以使用,但是不做推荐。
代码演示
package cn.wraperclass.demo;
/**
* 测试包装类Integer的用法,其他包装类类似
*/
public class TestWraperClass {
void testInteger(){
//基本类型转化为Integer对象
Integer int1 = new Integer(10);//这种方法可以使用,但是已经被淘汰,不建议
Integer int2 = Integer.valueOf(10);//官方推荐的写法
//Integer对象转换为int
int a = int2.intValue();
//字符串转换为Integer对象
Integer int3 = new Integer("1234");
Integer int4 = Integer.valueOf("1234");
Integer int5 = Integer.parseInt("123");
System.out.println(int3);
System.out.println(int4);
//Integer对象转换为字符串
String str = int4.toString();
System.out.println(str);
//一些常见的int类型的相关常量
System.out.println("int能表示的最大整数:"+Integer.MAX_VALUE);
//自动装箱
Integer i = 5; //编译器自动改成:Integer i = Integer.valueOf(5);
//自动拆箱
int b = i; //编译器自动改成: int b = i.intValue();
Integer c1 = null;
//int c2 = c1;//编译器改成c1.intValue(),调用了对象方法,但c1为空对像,因此会运行报错.NullPointerException
//包装类的缓存问题
Integer d1 = 4000;
Integer d2 = 4000;
//当数字在[-128,127]之间时,返回缓存数组中的某个元素值
Integer d3 =123;
Integer d4 =123;
System.out.println(d1 == d2);
System.out.println(d3 == d4);
System.out.println(d1.equals(d2));
}
public static void main(String[] args) {
TestWraperClass test = new TestWraperClass();
test.testInteger();
}
}
以上的这个代码只是以Integer类作为一个使用范例,其余的数据类型能都进行相似的操作,只要熟悉了Integer包装类的使用,其余的一次类推即可。