一、数据类型的划分
数据类型划分
数据类型在程序语言的构成要素中占有相当重要的地位。Java的数据类型可分为基本数据类型与引用数据类型。
原始数据类型也称为基本数据类型,它们包括了最基本的boolean、bytc、char、short、int、Jong、float 与 double 等类型。另一种数据类型为引用数据类型,它是以一种特殊的方式指向变量的实体,这种机制类似于 C/C++的指针。这类变量在声明时不会分配内存,必须另外进行开辟内存空间的操作,如字符串与数组均属于这种数据类型。在Java 中规定了8种基本数据类型变量来存储整数、浮点数、字符和布尔值,如图所示。
二、基本数据类型
到目前为止,相信读者已经对 Java有了一些初步的认识,如果想在程序中使用一个变量,就必须先声明,此时编译程序会在未使用的内存空间中寻找一块足够能保存这个变量的空间以供这个变量使用。Java的基本数据类型如表3-1所示
2.整数类型
当数据不带有小数或分数时,可以声明为整数变量,如3、-147等即为整数。在Java中,整数数据类型可以分为long、int、short及byte 4种,long为64位,也就是8个字节(bytes),可表示范围为-9223372036854775808~9223372036854775807;int为32位,也就是4个字节,表示范围为-2147483648~2147483647;若数据值的范围为-32768~32767时,可以声明为short(短整数)类型;若数据值更小,在-128~127之间时,可以声明byte类型,以节省内存空间。例如,声明一个短整型变量sum时,可以在程序中作出如下声明
代码如下(示例):
short sum ; // 声明sum为短整型
经过声明之后,Java即会在可使用的内存空间中寻找一个占有两个字节的块供sum变量使用,同时,这个变量的范围只能在-32768~32767之间。
在Java 中对于一个整型常量,其类型默认的就是int型,所以读者在声明常量时不要超过int数据类型的范围。
范例:以下代码验证了如果数据过长则有可能出现的问题
Class DateDemo01{
public static void main(String[] args){
//定义整型变量,错误超出长度范围
int num=9999999999999999999999999;
}
}
以上代码为int变量初始化时超过了其本身的范围的情况,所以在编译程序时出现了以下的错误提示:
DateDemo01.java:3:integer number too large:9999999999999999999999999
int num = 9999999999999999999999999;//定义整型变量,错误,超出长度范围
1 error
3.整数的溢出
当整数的数据大小超出了可以表示的范围,而程序中有没有做数值范围的检查时,这个整型变量所输出的值将发生混乱,且不是预期的运行结果.在下面的程序范例中声明了一个整数的数,并把它赋值为整型所可以表示范围的最大值,然后将它分别加1及加2.
范例:将整型的最大值1和加2
class DateDemo02{
public static void main(String[] args){
int max = Integer.MAX_VALUE; //得到整型的最大值
System.out.println("整型的最大值"+max);//输出最大值
System.out.println("整型最大值+1"+(max+1));//最大值加1
System.out.println("整型最大值+2"+(max+2));
}
}
程序运行的结果
整型最大的值:2147483647
整型最大值+1:-2147483648
整型最大值+2:-2147483647
当最大值加上1时,结果变成表示范围中最小的值;最大值加上2时,结果变成表示范围中次小的值,这就是数据类型的溢出。读者可以发现,上面例子会出现一个循环,若是想避免这种情况的发生,在程序中就必须加上数值范围的检查功能,或者使用较大的表示范围的数据类型,如长整型。
当声明了一整数X,其表示的范围为-2147483648~2147483647之间,当x的值设为最大值 2147483647,仍在整数的范围内,但是当x加1或加2时,整数x的值反而变成-2147483648和-2147483647,成为可表示范围的最小及次小值。
上面的情形就像计数器的内容到最大值时会自动归零一样。而在整数中最小值为-2147483648,所以当整数x的值最大时,加上1就会变成最小值-2147483648,也就是产生了溢出。可以参考图3-2来了解数据类型的溢出问题。
为了避免int类型的溢出,可以在该表达式中的任一常量后加上大写的,或在变量前面加上long,做强制类型的转换。在下面的程序中加上防止溢出的处理,为了让读者方便比较,特意保留一个整数的溢出语句。
范例:使用强制类型转换,防止数据溢出
class DateDemo03{
public static void main(String[] args){
int max = Integer.MAX_VALUE; //得到整型的最大值
System.out.println("整型的最大值"+max);//输出最大值
System.out.println("整型最大值+1"+(max+1));//最大值加1
System.out.println("整型最大值+2"+(max+2L));
System.out.println("整型最大值+2:"+((long)max+2)); //强制转换为long型
}
}
程序运行的结果:
整型的最大值:2147483647
整型的最大值+1:-2147483648
整型最大值+2:2147483649
整型最大值+2:2147483649
由上面的程序可知,处理int类型的溢出,可以利用强制类型转换的方式.但是对于long类型的溢出,就没有处理办法了,此时就需要在程序中加上变量值的界限检查,在运行是,才不会发生错误.
4.字符类型
字符类型在内存中占有两个字节,可以用来保存英文字母等字符.计算机处理字符类型是,是把这些字符当成不同的整型来看待,因此严格来说,字符类型也算是整数类型的一种.
在计算机的世界里,所有的文字、数值都只是一连串的0与1,这些0与1对于设计者来说实在是难以理解,于是就产生了各种方式的编码,它们通过指定一个数值来代表某个字符,如常用的字符码系统ASCII。
虽然各类的编码系统合起来有数百种之多,却没有一种是包含足够的字符、标点符号及常用的专业技术符号。这些编码系统之间可能还会有相互冲突的情形发生,也就是说,不同的编码系统可能会使用相同的数值来表示不同的字符,在数据跨平台时就会发生错误。
Unicode 就是为了避免上述情况的发生而产生的,它为每个字符制订了一个唯一的数值,因此,在任何的语言、平台、程序中都可以安心地使用。Java 所使用的就是 Unicode字符码系统。
例如,Unicode中的小写a是以97来表示的,在下面的程序中可以看到,声明字符类型的变量ch1、ch2,分别将变量chl的值设为97,ch2的值设为字符a,再输出字符变量chl及ch2的内容。
范例:测试字符和整型之间的相互转换
范例:测试字符和真心之间的互相转换
public class DateDemo04{
public static void main(String[] args){
char ch1 ='a';//定义字符
char ch2 =97; //定义字符,整型转字符
System.out.println("ch1="+ch1);
System.out.println("ch2="+ch2);
}
}
程序运行结果:
ch1 =a ;
ch2 = a;
给字符变量赋值可以使用数值和字符,他们都可以使程序正确的运行.要注意的是,字符要只用一对单引号(’ ')括起
序号 | 转义字符 | 描述 |
---|---|---|
1 | \f | 换页 |
2 | \ | 反斜杠 |
3 | \b | 倒退一格 |
4 | ’ | 单引号 |
5 | \r | 归为 |
6 | " | 双引号 |
7 | \t | 制表符 |
8 | \n | 换行 |
5.浮点数类型与双精度浮点数类型
在日常生活中经常会使用到小数类型的数值,如身高,体重,整数将不能满足程序设计者的要求.在数学中,这些带有小数点的数值称为实数,在Java中,这种数据类型称为浮点数类型(float),其长度为32个字节.当浮点数的表示范围不够大时,还有一种双精度(double)浮点数可供使用.双精度浮点类型的长度为64个字节.
浮点数的表示方式除了指数的形式之外,还可以用带有小数点的一般形式来表示.例如,想声明一个double类型的变量num与一个float类型的变量sum,并同时给sum赋初始值3.0,可以在程序中做出如下声明及其设置:
double num; //声明num为双精度浮点型变量
float sum = 3.0f; //声明sum为浮点型变量, 其初始值为3.0
声明之后,Java即会在可使用的内存空间中寻找一个占有8个字符节的块供num变量使用
6.布尔类型
布尔(boolean)类型的变量只有true(真)和false(假)两种,也就是说,当将一个变量定义成布尔类型时他的值只能是true或false,除此之外没有其他的值可以赋值给这个变量.例如,声明名称为flag变量的布尔类型,并设置为true值,可以使用下面的语句:
boolean flag = true;//声明布尔变量flag,赋值true
经过声明后,布尔变量的初值即为true,当然如果程序中需要更改status的值时,可以随时更改.
7.基本数据类型的默认值
在Java中,若在变量的声明时没有给变量赋初值,则会给该变量赋默认值
序号 | 数据类型 | 默认值 |
---|---|---|
1 | byte | (byte)0 |
2 | short | (short) 0 |
3 | int | 0 |
4 | long | 0L |
5 | float | 0.0f |
6 | double | 0.0d |
7 | char | /u0000(空,") |
8 | boolean | false |
在某些情形下,Java会给予这些没有赋初始值的变量一个确切的默认值,这没有任何的意义,是灭有必要的,但应该保证程序执行时不会有这种未定义值的变量存在.虽然这种方式给编程者带来很多的遍历,但是过去以来系统给变量赋初始值.就不容易检测到是饭否已经给变量应有值了,这是需要注意的问题.