2.2 数据类型
现实生活中的数据有不同类型之分,如在计算职工工资时,职工人数为整数,职工姓名为字符串,职工工资为浮点数等。
2.2.1 数据类型的划分
Java语言中的数据类型分为基本数据类型和引用数据类型。基本数据类型共有8种,包括4种整数类型(byte、short、int和long)、两种实数(浮点数)类型、字符类型(char)和布尔类型(boolean)。引用数据类型包括字符串(String)、类(class)、接口(interface)、数组等,其中字符串类型兼具某些基本数据类型的特征。另外,也有文献把空类型(void)看作是一种数据类型。Java数据类型如图2-1所示。
2.2.2 基本数据类型
图2-1 Java数据类型
在栈中可以直接分配内存的是基本数据类型。
1.整型
整型是那些没有小数部分的数据类型。Java中提供字节型(byte)、短整型(short)、整型(int)和长整型(long)4种整数类型,这些整数类型都有正负数之分。每种整型占用的二进制位数和取值范围见表2-2。
表2-2 整数类型的取值范围
int类型是最常用的整数类型,它表示的数据范围已经足够大了,基本能满足现实生活的需要。如果需要表示更大的整数,这时就要用long。由于Java中的整型默认为int型,在表示长整型时需要在数值后面加写字母L或其对应的小写字母l,这时形如8L及-10l的整数占用64位存储空间。鉴于字母l与数字1非常容易混淆,强烈推荐使用L。
除了日常生活中使用的十进制表示形式外,Java中的整数常量也可以采用八进制或十六进制表示形式。八进制整数常量以0为前缀,使用数字0~7表示,如065为八进制形式的整数常量,等价于十进制中的53。十六进制数用0~9及A~F(a~f)表示,并以0x或0X为前缀,如0xa02F为十六进制的整数常量。
2.浮点类型
浮点类型是带有小数部分的数据类型,也称实型。Java中有单精度float和双精度double两种类型的浮点数,每种类型占用的二进制位数和取值范围见表2-3。
表2-3 浮点类型的取值范围
最常用的浮点类型是double,如3.14D、2.5d等都是double类型。默认情况下,可以省略其后缀D或d。若要指定float类型的数据,则需在浮点数后面加后缀F或f,如3.14F或2.5f为float类型的数据。
3.布尔类型
布尔类型用于表达两个逻辑状态之一的值,也称为逻辑类型。Java中的布尔类型变量是boolean,取值只能为true和false两者之一,分别代表逻辑“真”与逻辑“假”。与C/C++不同的是,Java中的布尔值不能与0、1相互转换。
布尔类型通常被用在流程控制中,作为判断条件。
boolean flag=true;
4.字符类型
字符类型char用于表示单个字符,如字母、数字、标点符号和其他符号。Java使用Unicode字符集,因此char类型的数据均是16位,不管是英文还是中文,都占用两个字节的内存空间。字符类型常量用一对单引号括起来,比如'K'、'a'、'3'、'你'等。也可以使用Unicode编码来表示字符值,用\u开头的4个十六进制数表示,如'\u0041'表示'A'。
Java中有以反斜杠(\)开头的字符,反斜杠将其后面的字符转变为另外的含义,称为转义字符。Java中常用的转义字符如表2-4所示。
表2-4 Java中常用的转义字符
5.字符串类型
字符串类型是程序设计中的常用类型,虽然字符串不是Java语言的基本数据类型,但它具有许多基本数据类型的特征,比如可以声明字符串变量,对字符串变量直接赋值等,因此在本节中作简单介绍。
字符串是包含在""中的字符序列,序列中字符的个数称为字符串的长度,长度为0的字符串为空串。以下为部分字符串。
"Hello World!"
"欢迎!"
" " //字符串中有一个空格字符,长度为1
"" //空串,长度为0
null //空对象,不指向任何实例
字符串变量的声明格式为:
String变量名;
变量声明后就可以对其赋值:
Strings1="Hello",s2; //声明String型变量s1和s2,同时给s1赋值
s2="World!"; //给s2赋值为"World!"
String s3 = s1+s2 ; // s3为"HelloWorld!"
其中“+”运算将两个字符串连接成一个新的字符串。若其中某个操作数为其他数据类型,则先将其隐式转换成字符串,然后再进行字符串连接运算。例如:
//先将数值800转化为字符串"800",再进行连接运算
System.out.println("职工津贴为每月"+800+"元");
6.数据类型转换
整型、字符型、浮点型数据可以混合运算。不同优先级类型的数据需要先转换为同一类型,再进行运算。Java中类型的优先级由低级到高级分别为(byte,short,char)→long→float→double。
(1)自动类型转换
当出现混合运算时,类型转换的一般原则是低优先级(位数少)的类型转换为高优先级(位数多)的类型,称作自动(隐式)类型转换。当某种类型的值赋给另一种类型的变量时,如果这两种类型是兼容的,就可以将低优先级类型的值赋给高优先级类型的变量。例如当int型值可以赋给long型的变量时,Java自动执行转换。如下面的语句可以在Java编译器中直接通过:
byte a = 10; //定义字节型变量a
int i=a;
float f=a;
(2)强制类型转换
若将高优先级的值赋给低优先级的变量,如将long型值赋给int型变量,则可能造成信息的丢失,这时Java不能执行自动转换,编译器需要程序员通过强制(显式)类型转换的方式确定这种转换。强制类型转换的一般形式为:
(type)expresstion
例如: