这几天对Java数据类型做了一下总结,参考了一些资料,具体内容如下,如有错误请指正。博文下方有此文PDF版下载链接。
Java数据类型精解
Java变量包括如下两大类数据类型:
l 基本数据类型:
Ø 整数:byte、short、int、long
Ø 浮点数:float、double
Ø 字符类型:char
Ø 布尔类型:boolean
l 对象数据类型:
Ø Java类的实例对象类型。
基本数据类型,是比较简单地表达一些基本的数据类型,包括一下几类:
l byte(字节型):计算机中1字节一般来说占8位。
l char(字符型):占2字节,也就是16位。
l short(短整型):占2字节,也就是16位。
l int(整型):占4字节,也就是32位。
l long(长整型):占8字节,也就是64位。
l float(单精度实型):小数点后保留7位有效数字,占32位。
l double(双精度实型):小数点后保留15位有效数字,占64位。
l boolean(字节型):占1字节,8位。
我们知道所有的数据都是以0和1的组合来存储的,例如整型数字1,在计算机中的实际存储形势为:
00000000 00000000 00000000 00000001
上面的每一个0或者每一个1都被称为1个位。
表一 基本数据类型
类型 |
字节数 |
位数 |
取值范围 |
举例 |
byte |
1 |
8 |
-27~27-1的整数 |
-128,54,127 |
short |
2 |
16 |
-215~215-1的整数 |
1348,6543 |
int |
4 |
32 |
-231~231-1的整数 |
0,-1000,345678 |
long |
8 |
64 |
-263~263-1的整数 |
987657897,-12 |
float |
4 |
32 |
-231~231的整数 |
23.978,87F |
double |
8 |
64 |
-263~263的整数 |
2.0231,0.435D |
char |
2 |
16 |
-215~215的整数 |
400,A,z,x,-23 |
boolean |
1 |
8 |
true,false |
true |
(1)float类型
数值有一个后缀——F,如果没有后缀F,那么默认为double。Double类型的数值也可以使用后缀D。当这些数字遇到取值范围错误时,会发生上溢(Overflow);而在遇到被零整除时,会发生下溢(Underflow)。
(2)字符类型:char
双引号则表示一个字串,它是Java的一个对象类型String,并不是数据类型。在Java中除了用这个\u的形式来表示字符外,还可以用换码序列来表示特殊字符。
\b 退格 \u0008
\t Tab 制表 \u0009
\n 换行 \u000a
\r 硬回车 \u000d
\"双引号 \u0022
\'单引号 \u0027
\ 反斜杠 \u005c
与变量定义一起使用,例子如下:
byte myByte=49;
byte myByte2=128; //错误,取值范围过大
short myShort=2345;
int myInt=123;
int myInt2=012; //012是用八进制表示的数字,以0开头的数字代表八进制数字。
int myInt3=0x12E5F; //0x12E5F是用十六进制表示的数字,以0x开头的数字代表八进制数字。
long myLong=23;
long myLong2=245L; //以L结尾表示该数值为长整型
float myFloat=456.56F; //以F结尾表示该数字为单精度实型
double myDouble=23.56789D; //以D结尾表示该数字为双精度实型
如果你对八进制和十六进制的转换不太清楚的话,首先要知道十进制、八进制和十六进制的成员。
l 十进制的基本成员:0、1、2、3、4、5、6、7、8、9
l 八进制的基本成员:0、1、2、3、4、5、6、7
l 十六进制的基本成员:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F(其中A、B、C、D、E、F分别代表10、11、12、13、14、15)。
(1)八进制转十进制
例如,八进制数345转换成十进制数为:5*80+4*81+3*82
(2)十六进制转十进制
例如,十六进制数45转换成十进制数为:5*160+4*81
Java是面向对象的程序设计语言,因此Java的数据类型中包括了对象数据类型。例如String对象、Date对象和数组对象等。
如下列所示:
String shenkxiao="Shenkxiao"; //字符串对象
Date time=new Date(); //日期对象
Hello Shenkxiao inst=new Hello Shenkxiao();//Hello Shenkxiao实例对象
表二 基本数据类型与对象数据类型对应关系
基本数据类型 |
byte |
short |
int |
long |
float |
double |
char |
boolean |
对象数据类型 |
Byte |
Short |
Integer |
Long |
Float |
Double |
Character |
Boolean |
因此,如下定义的两个变量a和b,虽然他们代表的值都是1,却是不同的类型,一个是简单数据类型,另一个是对象数据类型。
int a=1;
Integer b=new Integer(1);
此外,Java中还有很多其他对象类型。
Java中所有对象都要通过对象引用访问,对象引用是指向对象存储所在堆中某个区域的指针,所有的对象数据类型都属于引用数据类型。例如下列所示,b和c都是引用类型:
int a=1; //基本数据类型
Integer b=new Integer(1); //对象引用
Integer c=b; //对象引用
引用类型和基本数据类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型哦数据结构存储,当引用类型和基本数据类型用做某个类得实例数据时所指定的默认值。对象引用实例变量的默认值为null,而基本数据类型实例变量的默认值与他们的类型有关。
许多程序的代码将同时包含基本数据类型及他们的对象封装。当检查它们是否相等时,同时使用这两种类型并了解它们如何正确相互作用和共存将成为问题。程序员必须了解这两种类型是如何工作和相互作用的,以避免代码出错。
例如,不能对原始类型调用方法,但可以对对象调用方法:
int a=1; //基本数据类型
a.hashCode(); //错误
Integer b=new Integer(1); //对象引用
b.hashCode(); //正确
使用基本数据类型无须调用new,也无需创建对象,这节省了时间和空间。混合使用基本数据类型和对象也可能导致与赋值有关的意外结果。看起来没有错误的代码可能无法完成你希望做的工作,例如:
int a=1; //基本数据类型
int b=2;
Point x=new Point(0,0);
Point y=new Point(1,1);
System.out.println("a is "+a);
System.out.println("b is "+b);
System.out.println("x is "+x);
System.out.println("y is "+y);
System.out.println("改变位置……");
a=b; //改变基本数据类型的值
a++; //改变基本数据类型的值
x=y; //引用类型
x.setLocation(5, 5); //修改对象的值
System.out.println("a is "+a);
System.out.println("b is "+b);
System.out.println("x is "+x);
System.out.println("y is "+y);
这段代码输出以下结果:
a is 1
b is 2
x is java.awt.Point[x=0,y=0]
y is java.awt.Point[x=1,y=1]
改变位置……
a is 3
b is 2
x is java.awt.Point[x=5,y=5]
y is java.awt.Point[x=5,y=5]
修改整数a和b的结果没什么意外的地方。b的值被赋予变量a,结果a的值增加了1。这一输出反映了我们希望发生的情况。但是,令人感到意外的是在赋值并调用setLocation之后x和y对象的输出。我们在完成x=y赋值之后特意对x调用了setLocation,x和y的值怎么会相同呢?我们毕竟将y赋予x,然后更改了x,这与我们对整数a和b进行的操作没什么不同。
这种混淆是由基本数据类型和对象的使用造成的。赋值对这两种类型所起的作用没什么不同,但它可能看起来有所不同,赋值使(=)左边的值等于右边的值。这一点对于基本数据类型(如前面的int a和b)是显而易见的。对于非基本数据类型(如Point 对象),赋值修改的是对象引用,而不是对象本身。因此,x和y引用同一个对象,所以对x执行的所有方和和对y执行的所有方法都作用于同一个对象。
Java数组(array)是动态创建的索引对象,这一点和类非常相似,此外,同类一样,数组只能索引数组的实例或者null,如以下代码所示:
int[] myIntArray=new int[5]; //定义一个长度为5的数组,数组默认初始值是0
int myIntArray[]=new int[5]; //C 风格的声明方式也是可以的。 此处感谢mougaidong的建议
int[] anotherIntArray=null;
数组是Object类的继承,这样,Object类的所有方法都可以被数组调用,数组对象由元素组成,元素的数目也可以为0,在这种情况下称作数组为空。所有的数组都是从0开始对元素编号的,这意味着数组内的第一个元素的索引编号是数字0。所有对数组元素的访问都会在运行时接受检查,如果试图使用编号小于0或者大于数组长度的值来索引元素就会产生<