1.一些基本类型,像int,char这些类型(小的,简单的变量),为了方便,Java并没有把他们也创建到堆中,而是放在了堆栈中,可以高效的存取
主类型 |
大小 |
最小值 |
最大值 |
封装器类型 |
---|---|---|---|---|
boolean |
1-bit |
– |
– |
Boolean |
char |
16-bit |
Unicode 0 |
Unicode 216- 1 |
Character |
byte |
8-bit |
-128 |
+127 |
Byte |
short |
16-bit |
-215 |
+215 – 1 |
Short1 |
int |
32-bit |
-231 |
+231 – 1 |
Integer |
long |
64-bit |
-263 |
+263 – 1 |
Long |
float |
32-bit |
IEEE754 |
IEEE754 |
Float |
double |
64-bit |
IEEE754 |
IEEE754 |
Double |
void |
– |
– |
– |
Void1 |
Java的基本数据类型与机器无关,这点与C++不同,由于这个特性,Java的可移植性比C++强很多,号称一次编译,到处运行(呵呵,有点牛吧)
讲讲封装器类型的好处:
2.高精度数字
Java 1.1增加了两个类,用于进行高精度的计算:BigInteger和BigDecimal。尽管它们大致可以划分为“封装器”类型,但两者都没有对应的“主类型”。
这两个类都有自己特殊的“方法”,对应于我们针对主类型执行的操作。也就是说,能对int或float做的事情,对BigInteger和BigDecimal一样可以做。只是必须使用方法调用,不能使用运算符。此外,由于牵涉更多,所以运算速度会慢一些。我们牺牲了速度,但换来了精度。
BigInteger支持任意精度的整数。也就是说,我们可精确表示任意大小的整数值,同时在运算过程中不会丢失任何信息。
BigDecimal支持任意精度的定点数字。例如,可用它进行精确的币值计算
3.Java的数组
使用C++的可能对里面的数组越界的问题比较愤怒吧,往往编译器跳出来的内存错误很多是数组越界的问题;
Java可以保证被初始化,而且不可在它的范围之外访问(Java程序员应该感到庆幸了)。由于系统自动进行范围检查,所以必然要付出一些代价:针对每个数组,以及在运行期间对索引的校验,都会造成少量的内存开销。但由此换回的是更高的安全性,以及更高的工作效率。为此付出少许代价是值得的。
创建对象数组时,实际创建的是一个句柄数组。而且每个句柄都会自动初始化成一个特殊值,并带有自己的关键字:null(空)。一旦Java看到null,就知道该句柄并未指向一个对象。正式使用前,必须为每个句柄都分配一个对象。若试图使用依然为null的一个句柄,就会在运行期报告问题。因此,典型的数组错误在Java里就得到了避免
4.自定义的类
class ATypeName {/*类主体置于这里}
这样就引入了一种新类型,接下来便可用new创建这种类型的一个新对象:
ATypeName a = new ATypeName();
在ATypeName里,类主体只由一条注释构成(星号和斜杠以及其中的内容,本章后面还会详细讲述),所以并不能对它做太多的事情。事实上,除非为其定义了某些方法,否则根本不能指示它做任何事情