在程序设计中经常需要用到一系列类型,需要特别对待他们。我们知道new出来的对象存储在“堆”里,所以用new来创建一个特别小的简单的变量,往往不是很有效。因此,java不用new来创建变量,而是创建一个并非引用的“自动”变量。这个变量直接存储“值”在栈中,因此更加有效。
java需要确定每种基本类型占存储空间的大小。下图是java的9种基本类型的大小和值范围,以及对应的包装器类型:
基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
Boolean | – | – | – | Boolean |
char | 16-bit | Unicode 0 | Unicode12^16 -1 | Character |
Byte | 8 bits | -128 | 127 | Byte |
short | 16 bits | -2^15 | +2^15 -1 | Short |
int | 32 bits | -2^31 | +2^31 -1 | Integer |
long | 64 bits | -2^63 | +2^63 -1 | Long |
Float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
Void | – | – | – | Void |
有同学可能会疑惑,为什么void也可以算是一种基本类型?
其实void是可以算作一种基本类型的。在java中有两种类型,一种是基本类型,一种是引用类型。两者的区别是:
基本类型 | 引用类型 |
在栈中分配空间存值 | 在堆中分配空间存值 |
Void是不能new出来的,大家可以看看Void的源码,我们发现它的构造函数设置为private的,所以外部不能new对象,因此不能在堆中分配空间存储对应的值,那就是一开始就在栈中分配好了空间,所以也可以将Void归成基本类型。
class Void {
/**
* The {@code Class} object representing the pseudo-type corresponding to
* the keyword {@code void}.
*/ @SuppressWarnings("unchecked")
public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void");
/*
* The Void class cannot be instantiated.
*/ private Void() {}
}
基本类型具有的包装器类,使得可以在堆中创建一个非基本类型对象,用来表示基本类型。
char c = “x”;
Character ch = new Character(c)
也可以写成这样:
Character ch = new Character(“c”);
javaSE5中的自动包装功能将自动地将基本类型转换成包装器类型:
Character ch = “x”;
也可以反向转换:
char c = ch;