学习目标:掌握Java基本数据类型,基本数据类型包括整数类型、浮点类型、字符类型和布尔类型。
基本数据类型
计算机编程语言是用来控制计算机的行为及操作,协助人类解决现实中的问题,其能表达的数据类型也是从实际中提取并抽象出来形成的数据结构描述。
例如:数学中数的基础分类有正整数、负整数、小数等类别,数学中所有关于数的运算都是在基础分类上进行的。计算机出现之前,数学家们用稿纸进行大量的数学运算以求证数学问题和科学计算,这耗费了数学家们太多的精力。随着计算机科技的发展,大量复杂的数学运算交给计算机来执行,极大提高了计算效率,也让数学家们从复杂地数学运算中摆脱出来。
数学运算包含大量的计算表达式,计算机程序需要有连续处理计算表达式和计算数据的处理能力,下面是一个简单的四则运算表达式:
15.8+20*31.5-30
计算机程序要处理上述表达式,就需要具备存储小数、整数、运算符的能力。Java语言提供了存储小数、整数、运算符的基本数据类型。下图是表达式数据类型到Java数据类型的映射图。

下面简要说明一个解析计算表达式并存储运算符和运算数的示例
为说明问题起见,给出一个简化计算表达式:8.25+30
声明三个变量用来存储运算数和运算符
public float floatNum;
public int intNum;
public char op;
四则运算器程序在计算上述计算表达式时,首先从左到右扫描表达式。假设本次扫描不考虑优先级运算,只是完成提取运算数和运算符的功能。扫描过程如下:如果是运算数,判断是整型还是小数,整型赋值给intNum,如果是小数赋值给floatNum,如果是运算符赋值给op。下图是扫描完成后,变量在内存储器的存储情况。

从上图可以看出,不同数据类型的变量在存储器占用的空间也不相同。数据类型为字符型的变量在存储器占用一个字节的空间,数据类型为整型的变量在存储器占用四个字节的空间,数据类型为浮点型的变量在存储器也占用四个字节的空间。Java基本数据类型都有固定的取值范围空间,不会随着机器硬件环境或者操作系统的改变而改变,因此Java程序的可移植性要强于其它编程语言。
Java基本数据类型见下图。

Java基本数据类型包括数值型、字符型和布尔型。数值型又分为整数类型和浮点类型。Java基本数据类型是构成其它复合类型的基础。
整数类型
整数类型有byte、short、int、long四种类型,用于需要不同存储空间的数据使用。整数类型有正整数和负整数之分,在Java语言中,规定整型的最高位为符号位,最高位为“0”表示正数,最高位为“1”表示负数,其它位表示数值。因此整型类型的数据能够表示的最小值为:-2n-1 —2n-1-1(n为该类型所占存储空间的二进制位数)。
其中,byte占用一个字节的存储空间,可表示的最小数值为-128,最大数值为127;
short占用二个字节的存储空间,可表示的最小数值为-32768,最大数值为32767;
int占用四个字节的存储空间,可表示的最小数值为-2147483648,最大数值为2147483647;
long占用四个字节的存储空间,可表示的最小数值为-9223372036854775808,最大数值为9223372036854775807。
整型变量可按如下方式声明:
public int pageNumber;
long population;
byte age;
short readCount;
在一条语句中,可以声明多个同一类型的整型变量,每个变量之间用英文逗号分隔:
int pageNumber, likeNumber,readCount;
整型变量可按如下方式初始化:
int pageNumber=230;
byte age = 21;
short readCount=1260;
在初始化变量或为变量赋值时,常常会用到一些数值,这些值通常称为常量。Java语言中整型常量有三种不同的表示形式:十进制、八进制和十六进制。
① 八进制整型常量:在八进制数值前面加前缀数字0,其数码取值为0—7,例如:023、0457、01329等;
② 十六进制整型常量:前缀为“0X”或“0x”,数码取值0—9、A—F、或a—f。例如:0X2A、0XA0、0Xffff等;
③ 十进制整型常量:既无前缀也无后缀。例如:236、56、7890等。
整数类型常量声明:
final int ERRORCODE = 0X1;
final int SUCESSCODE = 0X0;
final byte Key = 32;
当整型数据数值大小超出了可以表示的范围,而程序中又没有做数值范围的检查时,这个整型变量所输出的值将发生上溢或下溢,且不是预期的运行结果,这种现象称为溢出。
案例4:在项目Punit2,unit2包下创建case4类,在main方法内声明局部变量num,初始化num的值为9021467483647,该值已经超出int类型的存储范围,IDEA编辑窗口给出了错误提示:

浮点类型
Java语言的浮点类型有两种不同的表示形式:十进制数和科学计数法。十进制数形式,由数字和小数点组成,且必须有小数点,如0.123、12.85、26.98等;科学计数法形式,如:2.1E5、3.7e-2等。其中e或E之前必须有数字,且e或E后面的指数必须为整数。
科学计数法
一种简化计数的方法,对于位数较小的数值,科学计数法没有什么优势,但对于位数较多的数值其计数方法的优势就非常明显了。例如:光的速度是300,000,000米/秒,全世界人口数大约是6,100,000,000。类似光的速度和世界人口数这样大数值的数,读、写都很不方便,仔细观察上面的两个数值,光的速度可以写成3*108米/秒,全世界人口数可以写成6.1*109。这种计数方法就是科学计数法,用Java语言科学计数法表示光速是3E8,世界人口数大约是6.1E9。
一个较大的数值(>0)可以用下面的方式来表示:
a * 10n (1<=a<10,n为整数)
其中,a是该数值的有效位数,有效位数从左边第一个不是0的数起,到末尾数字为止,所有的数字(包括0,科学计数法不计10的n次方),称为有效数字。例如:光速是3E8,其有效数字是1位,值是3;世界人口数大约是6.1E9,其有效数字是2位,值是6.1。
n是该数值的整数部分减1的正整数。
一个较小的数值(<0)可以用下面的方式来表示:
a * 10-n (1<=a<10,n为整数)
a的取值同上面相同,n的取值为原数中左边第一个不为0的数字前面所有的0的个数(包括小数点前面的0)。
在Java语言中,浮点类型有float和double两种,分别代表单精度和双精度的数值。精度是指描述一个数值的准确程度,在数学运算中,经常会用到近似数,近似数与原数值非常相近,但又不完全符合原数值,只能说在某种程度上近似。精度与近似数相似,也是用一个与原数值非常相近的数代替原来的数值。
前面说过存储一个数值所用的字节越多,其精度越高,数值范围也越大。由此看来,精度与存储字节数密切相关,float类型的存储空间是4个字节,其表示的值范围约为10-38到1038,double类型的存储空间是8个字节,其表示的值范围约为10-308到10308,float存储数值的精度和范围要小于double存储数值的精度和范围。因此,float是单精度数值,double是双精度数值。

float变量可按如下方式声明:
float price = 12.35f;
public float average = 89.2f;
double变量可按如下方式声明:
double price = 12.35;
public double average = 89.2;
数值赋值给float变量时,数值尾部要加上小写“f”或大写“F”声明为float数值,不然编译器会给出“可能损失精度的错误”。因为在Java语言中,带小数的数值默认为是double类型,double类型转换为float类型,自然要损失精度了。
案例5:在Punit2项目unit包下创建Case5类,在Case5类下分别创建price、average局部变量并赋值,price的数据类型为float,average的数据类型为double,然后输出price与average的值到控制台。代码如下:
package com.unit;
public class Case5 {
public static void main(String[] args) {
// 声明局部变量price,数据类型为float
float price = 12.35f;
// 声明局部变量average,数据类型为average;
double average = 89.2;
// 输出静态变量width的值
System.out.println("局部变量price的值为:" + price);
// 输出静态变量height的值
System.out.println("局部变量average的值为:" + average);
}
}
字符类型
在编写程序时,我们还经常会遇到需要存储并操纵字符型数据的情况。例如:计算数值表达式时,需要存储运算符,这时就需要一种可以存储单个字符数据的数据类型。Java语言提供了一种char数据类型,可以满足存储单个字符的需要。
Java语言中,char占2个字节的存储空间,即可以存储英文字符,也可以存储单个汉字,一个汉字编码也占2个字节的存储空间。
char变量可按如下方式声明:
char code='a';
任意单个字符,加单引号。
char code ='中';
任意单个中文字,加单引号。
char code =111;
整数。0~65535。十进制、八进制、十六进制均可。输出字符编码表中对应的字符。
字符和字符串的区别是,字符用单引号括起来,字符串用双引号括起来。例如:‘a’是一个字符,”a”是一个字符串。
案例6:在Punit2项目unit包下创建Case6类,在Case6类下分别创建三个char类型的局部变量并赋值,然后输出变量的值到控制台。代码如下:
package com.unit;
public class Case6 {
public static void main(String[] args) {
// 声明局部变量ch,类型为char
char ch = 'A';
// 声明局部变量word,类型为char
char word = '中';
/**
* 声明局部变量ascii,类型为char
* ascii赋值为十进制67,大写字母C的ASCII码值是67
*/
char ascii = 67;
// 输出ch的值
System.out.println("ch的值为:" + ch);
// 输出word的值
System.out.println("word的值为:" + word);
// 输出ascii的值,应输出大写字母C
System.out.println("ascii的值为:" + ascii);
}
}
布尔类型
布尔类型是表示逻辑状态的类型。java语言通过关键字boolean来定义布尔类型变量,布尔类型只有true和false两个值,分别代表布尔逻辑中的“真”和“假”。布尔类型经常用在程序的流程控制中作为判断条件。
在Java语言中,boolean变量编译后被转换为int变量,占用4个字节的存储空间,true被转换为1赋值给int变量,false被转换为0赋值给int变量。因此,程序需要判断数值的真或假时,既可以用boolean类型变量,也可以用int类型的变量,当然也可以用byte类型的变量。
boolean变量可按如下方式声明:
boolean done = true;
boolean error = false;
案例7:在Punit2项目unit包下创建Case7类,在Case7类下分别创建两个boolean类型的局部变量并赋值,然后输出变量的值到控制台。代码如下:
package com.unit;
public class Case7 {
public static void main(String[] args) {
// 声明boolan变量done
boolean done = true;
// 声明boolan变量error
boolean error = false;
// 输出done的值
System.out.println("done的值为:" + done);
// 输出error的值
System.out.println("error的值为:" + error);
}
}