2.3 基本类型
2.3.1 整型数据
整型数据是最普通的数据类型,可表示日常生活中的整数。
1.整型常量
Java的整型常数有三种表示形式:十进制、十六进制和八进制。
十进制整数以10 为基数,用0~9 这10 个数字和正、负号组成,如123,-456,0等。十进制整数的第一位数字不能为0。
十六进制整数以16为基数,用0~9的10个数字、字母A~F(小写也可,代表10~15这些整数)和正、负号组成。十六进制整数必须以0X或0x作为开头,如0x123,-0xabc等。
八进制整数以8为基数,用0~7的8个数字和正、负号组成。八进制整数必须用0开始,如0567,-0123等。
每一个整型常数默认存储为int类型,该类型数据占用存储空间的数量和数据的取值范围见表2.3。若要使用更大的数,可用long类型整数。若希望把一个整数强制存为一个长整型数,可以在数字后面加字母l或L。
2.整型变量
整型变量按所占存储空间大小的不同有四种不同的类型,均为有符号数。表2.3 列出各整型数据所用的类型符及其所占存储空间的字节数和数据的取值范围。
表2.3 整型数据类型
(1)byte类型
byte字节类型适用于表示网络和文件的字节流,用于分析网络协议或文件格式等。本类型变量用byte定义,例如:
byte b; //定义byte型变量b byte c = 0x55; //定义byte型变量c,并赋初值十六进制数55
(2)short类型
short短整型是Java语言中不常用的一种类型。短整型变量用short定义,例如:
short s; //定义short型变量s short t = 03377; //定义short型变量t,并赋初值八进制数3377
(3)int类型
int整数类型由于数值范围大,而且在任何时候,带有byte,short和int类型量的一个整型表达式在计算前都会提升为int类型,所以使用较为广泛。int类型变量的定义例子如下:
int i; //定义int型变量i int j = 0x3344aabb; //定义int型变量j,并赋十六进制数3344aabb初值
(4)long类型
long长整型是一种可以表示比int类型取值范围更大的数据类型,它足以表示宇宙中的所有原子。例如,当使用毫秒来表示一年时,int数据已经溢出(超出了int数据的值范围),所以需要long类型。long类型变量的定义例子如下:
long l; //定义long型变量l long n = 0x33445566aa7788bbl; //定义long型变量n,并赋初值,用l作为后缀
2.3.2 实型(浮点型)数据
在Java中,实型数据常用十进制形式,通常将实型数据应用于精确到小数的计算中。
1.实型常量
Java的实型常量有标准和科学记数法两种表示形式。
(1)标准形式,由数字和小数点组成,且必须有小数点,如0.123,4.56,789.0等。
(2)科学记数法形式,数字中带e或E,如123e1或4.56E3,其中e或E前后必须有数字,且e或E后面的数字(表示以10为底的乘幂部分)必须为整数。
实型数据按所占内存的大小不同有两种类型,分别为4 字节的单精度型和8 字节的双精度型。实型常量后面可带后缀F,f或D,d,分别表示单精度实数或双精度实数,例如:
1.2f,3.4d,0.56e-7f,89e10d
无后缀的实型常量默认存储为双精度型。若带有后缀,则按后缀决定类型。
实数在机器中的存储格式以ⅠEEE754格式存在。
单精度实数有效位数为二进制23 位、十进制7 位精度,多余位四舍五入。双精度实数有效位数为二进制52位、十进制15位精度,多余位四舍五入。
2.实型变量
实型变量的类型说明符、所占字节数和取值范围见表2.4。
表2.4 实型数据类型
(1)float类型
float型的实型数据占用存储空间较少,具有较快的运算速度,但在数值很大或很小时数据精度会受到影响。
(2)double类型
double型的实型数据所表示的实数精度比float更高,值范围比float更大,所有的数值计算方法如sin、cos、sqrt(开方)的计算结果均为double型。
定义实型变量的例子如下:
float f; float g = 3.45f; double d; double mypi = 3.1415926535897932384;
注意:float类型的数据必须带类型后缀字母f或F。由于Java加强了类型检查,所以初始化一个实数时必须分清它是什么类型的。如语句:
float g = 3.45;
在编译时将产生一个错误,其中实数应该写为3.45f。
2.3.3 字符型数据
字符型char数据是由一对单引号括起来的单个字符。Java使用Unicode格式的16位字符集,而不仅仅为ASCⅠⅠ字符集,因此char类型的范围从0到65535。Unicode字符集能够容纳一个很大的字符集合,包括拉丁语、希腊语、阿拉伯语、希伯来语、汉语、日语、韩语等语言,因此使用16位是非常必要的。
在Java语言中,以反斜杠(\)开头的多个字符表示一个转义字符,转义字符一般用于表示某些非图形(非可视)字符。表2.5 中列出了Java中的转义字符。例如,'\u0061'表示ⅠSO拉丁码的'a'。
字符变量用char说明,用来存放单个字符。示例如下:
char c1 = 'c'; char c2 = '\u0020'; char ch1 = 88; // 正确,字符'X'的代码 char ch2 = 'ab'; //错误,只能存储1个字符 char ch3 = "a"; //错误,不能用字符串初始化字符
表2.5 转义字符表
2.3.4 布尔型数据
布尔类型或称逻辑类型是一种简单的两值数据类型,布尔数据只有两个值:true和false,且都是保留字,表示“真”和“假”这两种状态。关系运算和逻辑运算的结果是布尔值。
布尔型变量用boolean定义,例如:
boolean mouseOn = true; boolean done = false;
布尔型是一个独立的类型,它不像C语言中的布尔型代表0 和1 两个整数,由于这个原因,Java中的布尔类型不能转换成数字。
2.3.5 字符串数据
1.字符串常量
字符串常量是用双引号括起来的零个或多个字符(包括转义字符)。例如:
"" \\ 空串 "我们赢了!\n" \\ 一个包含转义字符的字符串
一个长字符串可以用“+”号分成几个短字符串。例如:
"中国 北京 "+ "2008 奥运!" \\ 一个字符串
在Java语言中,每个字符串常量被作为字符串类String的对象来处理。
2.字符串变量
在Java语言中,字符串变量是对象,是复合类型。有两种字符串变量类型:String类和StringBuffer类。String类是常量类,初始化后不能改变;StringBuffer类是字符串缓冲区,可以修改。例如:
String str1 = new String("This is a string."); String str2 = "This is a string."; StringBuffer str3 = new StringBuffer(); StringBuffer str4 = new StringBuffer("This is a string.");
关于字符串的详细介绍见本书第6章。
2.3.6 默认初始值
在Java程序中,使用变量的目的是为了存放数据(值)。根据变量声明的位置不同,分为局部变量和成员变量,在方法中声明的变量或方法的参数称为局部变量,在方法外声明的变量为成员变量。对局部变量必须先赋值后使用。对成员变量,若没有赋值,则成员变量有默认初值。对于数值数据,默认数值为相应类型的零;字符的默认初值为'\u0000';布尔初值为false;Object类型初值为null。成员变量的介绍见第5章。
【例2.1】基本类型变量的赋值并应用。
public class BasicType{ public static void main(String args[]){ byte b = 077; short s = 0x88; int i = 88888; long l = 888888888888l; char c = '8'; float f = 0.88f; double d = 8.88e-88; boolean bool = false; String str = "我们赢了!"; StringBuffer sb = new StringBuffer("中国 北京 2008 奥运!"); System.out.println("b = "+b); System.out.println("s = "+s); System.out.println("i = "+i); System.out.println("l = "+l); System.out.println("c = "+c); System.out.println("f = "+f); System.out.println("d = "+d); System.out.println("boolean = "+bool); System.out.println("str = "+str); System.out.println("sb = "+sb); } }
程序运行结果如下:
b = 63
s = 136 i = 88888 l = 888888888888 c = 8 f = 0.88 d = 8.88E-88 boolean = false str = 我们赢了! sb = 中国 北京 2008 奥运!
因为程序中的所有变量均在main方法中声明,它们都是局部变量,因此需要先赋值后使用。否则,将得到“可能尚未初始化变量”的出错提示。