Java 语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据 类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。
包装类均位于java.lang包,包装类和基本数据类型的对应关系如下:
基本数据类型(包装类)
byte(Byte)
short(Short)
char(Character)
int(Integer)
long(Long)
float(Float)
double(Double)
boolean(Boolean)
在这八个类名中,除了Integer和Character类以外,其它六个类的类名和基本数据类型一致,只是类名的{dy}个字母大写即可。
对于包装类说,这些类的用途主要包含两种:
a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
b、包含每种基本数据类型的相关属性如{zd0}值、最小值等,以及相关的操作方法。
JDK自从1.5(5.0)版本以后,就引入了自动拆装箱的语法,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进行,这将大大方便程序员的代码书写。请看如下代码片段:
//int类型会自动转换为Integer类型 int m = 12; Integer in = m; //Integer类型会自动转换为int类型 int n = in;
可见在实际使用时的类型转换将变得很简单,系统将自动实现对应的转换。
关于包装类的自动装箱与拆箱本文不作详细探讨,大家可以通过点击下面地址查看相关信息:
本文则主要介绍包装类与其他类的区别:
众所周知,“==”和“!=”运算符在比较2个数值型数据时,是比较它们值的大小,而在比较2个引用型数据时,则比较的是2个引用型变量是否指向同一块内存区域,即比较的是2者在内存中所在的地址。
“>”“>=”“<”“<=”是可以用来比较包装类对象的(Boolean类对象除外)。它比较的则不是包装类对象所指向内存中的地址,而是直接比较包装类的数据大小,下面来看一段代码:
- public class Test {
- public static void main(String[] args) {
- Integer a = new Integer(200);
- Integer b = new Integer(200);
- System.out.println("a == b:" + (a == b));
- System.out.println("a != b:" + (a != b));
- System.out.println("a <= b:" + (a <= b));
- System.out.println("a >= b:" + (a >= b));
- System.out.println("a < b:" + (a < b));
- System.out.println("a > b:" + (a > b));
- }
- }
public class Test { public static void main(String[] args) { Integer a = new Integer(200); Integer b = new Integer(200); System.out.println("a == b:" + (a == b)); //false System.out.println("a != b:" + (a != b)); //true System.out.println("a <= b:" + (a <= b)); //true System.out.println("a >= b:" + (a >= b)); //true System.out.println("a < b:" + (a < b)); //false System.out.println("a > b:" + (a > b)); //false } }
由结果不难看出包装类对象在进行比较运算时,“==”和“!=”不是比较数值大小而是比较内存地址值,而“>”“>=”“<”“<=”则是直接比较数值大小。
但是普通类的对象是不允许使用“>”“>=”“<”“<=”运算符来比较大小的,下面以String类为例:
- public class Test {
- public static void main(String[] args) {
- String a = new String("abc");
- String b = new String("abc");
- System.out.println("a == b:" + (a == b));
- System.out.println("a != b:" + (a != b));
- System.out.println("a <= b:" + (a <= b));
- System.out.println("a >= b:" + (a >= b));
- System.out.println("a < b:" + (a < b));
- System.out.println("a > b:" + (a > b));
- }
- }
public class Test { public static void main(String[] args) { String a = new String("abc"); String b = new String("abc"); System.out.println("a == b:" + (a == b)); //false System.out.println("a != b:" + (a != b)); //true System.out.println("a <= b:" + (a <= b)); //编译报错 System.out.println("a >= b:" + (a >= b)); //编译报错 System.out.println("a < b:" + (a < b)); //编译报错 System.out.println("a > b:" + (a > b)); //编译报错 } }
上述代码中,下面4行代码:
System.out.println("a <= b:" + (a <= b));
System.out.println("a >= b:" + (a >= b));
System.out.println("a < b:" + (a < b));
System.out.println("a > b:" + (a > b));
编译时是会报错的,错误信息如下:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The operator <= is undefined for the argument type(s) java.lang.String, java.lang.String
The operator >= is undefined for the argument type(s) java.lang.String, java.lang.String
The operator < is undefined for the argument type(s) java.lang.String, java.lang.String
The operator > is undefined for the argument type(s) java.lang.String, java.lang.String
另外,前面有提到Boolean类对象是不能使用“>”“>=”“<”“<=”作比较的,原因很简单,查看下Boolean和其他包装类的源代码:
Boolean类源代码:
public final class Boolean implements java.io.Serializable,Comparable<Boolean>
Integer类源代码:
public final class Integer extends Number implements Comparable<Integer>
不难发现Boolean类并没有继承Number类,而其他包装类是由Number类继承来的,所以Boolean类对象是不能使用“>”“>=”“<”“<=”作比较的。在这一点上Boolean类和其他普通类没有任何区别。