3.2 Java基础知识
Java的数据类型可以分为基本数据、类、接口等,任何常量、变量和表达式都必须是上述数据类型中的一种。Java的流程控制语句可以分为条件、循环和跳转三种类型。条件语句可以根据变量或表达式的不同状态选择不同的执行路径,它包括if和switch两个语句;循环语句可以重复执行一个或多个语句,它包括while、for和do-while等语句;跳转语句允许程序以非线性方式来执行,它包括break、continue和return三个语句。本节将讲解以下内容:Java的基本数据类型,以及属于这些类型的常量、变量和表达式用法;Java语言的流程控制语句。
3.2.1 Java数据类型
Java基本数据类型如表3-1所示。
表3-1 基本数据类型长度和表示范围
1)四种整数类型(byte、short、int、long)。
byte:8位,用于表示最小数据单位,如文件中数据,-128~127。
short:16位,很少用,-32768~32767。
int:32位,最常用,-2^31-1~2^31(21亿)。
注意事项:int i=5; // 5叫直接量(或字面量),即直接写出的常数。整数字面量默认都为int类型,所以在定义的long型数据后面加L或l。小于32位数的变量,都按int结果计算,强转符比数学运算符优先级高。
2)两种浮点数类型(float、double)。
float:32位,后缀F或f,1位符号位,8位指数,23位有效尾数。
double:64位,最常用,后缀D或d,1位符号位,11位指数,52位有效尾数。
注意事项:
二进制浮点数:1010100010=101010001.0*2=10101000.10*2^10(2次方)=1010100.010*2^11(3次方)=.1010100010*2^1010(10次方)。尾数:.1010100010;指数:1010;基数:2。
浮点数字面量默认都为double类型,所以在定义的float型数据后面加F或f;double类型可不写后缀,但在小数计算中一定要写d或带小数点,float表示长度没有long高,但数据精度却比long高。
3)一种字符类型(char)。
char占两个字节,是一个单一的16位Unicode字符。最小值为\u0000(即是0),最大值为\uffff(即为65535)。
注意事项:char类型是用来存储Unicode编码的字符的,Unicode编码字符集包含了汉字,所以char类型变量可以存储单个汉字。不过如果某个特殊汉字没有被包含在Unicode编码字符集中,那么,char就不能存储这个特殊汉字字符(注:unicode编码占用两个字节)。
4)一种布尔类型(boolean):true(真)和false(假)。
下面是基本数据类型的示例。
【例3-1】 基本数据类型
程序运行结果如图3-1所示。
【程序说明】
● 在此程序中,输出八种基本类型的二进制位数,所属包装类,所能表示的最大值与最小值。byte的二进制位数为8位,所属包装类:java.lang.Byte,最小值为-128,最大值为127。short的二进制位数为16位,所属包装类:java.lang.Short,最小值为-32768,最大值为32767。int的二进制位数为32位,所属包装类:java.lang.Integer,最小值为-2147483648,最大值为2147483647。long二进制位为64,所属包装类:java.lang.Long,最小值为-9223372036854775808,最大值为9223372036854775807。float的二进制位数为32位,所属包装类:java.lang.Float,最小值为1.4E-45,最大值为3.4028235E38。double二进制位数为64位,所属包装类:java.lang.Double,最小值4.9E-324,最大值为1.7976931348623157E308。char二进制位数为16位,所属包装类:java.lang.Character,最小值为0,最大值为65535。在输出char类型时只以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台。Float和Double的最小值和最大值都是以科学计数法的形式输出的,结尾的“E+数字”表示E之前的数字要乘以10的多少次方。比如3.14E3就是3.14×103 =3140,3.14E-3就是3.14×10-3=0.00314。
图3-1 基本数据类型
3.2.2 基本数据类型转换
1.自动类型转换
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算,转换从低级到高级。级别低的操作数和级别高的不同基本类型操作数在一起运算时,就需要进行类型转换,类型转换方式如表3-2所示。
表3-2 自动类型转换
数据类型转换必须满足如下规则。
1)不能对boolean类型进行类型转换。
2)不能把对象类型转换成不相关类的对象。
3)在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
4)转换过程中可能导致溢出或损失精度。
5)浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入。
必须满足转换前的数据类型的位数要低于转换后的数据类型,例如,short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型。
下面是自动类型转换的示例。
【例3-2】 自动类型转换
运行结果如图3-2所示。
● 在此程序中,定义一个char类型,将其自动转换为int类型,计算char类型和int类型相加后的值。c1的值为字符a,查ASCII码表可知对应的int类型值为97,A对应值为65,所以i2=65+1=66。
2.强制类型转换
1)强制类型转换的条件是转换的数据类型必须是兼容的。
2)格式:(type)value。type是要强制类型转换后的数据类型。
下面是强制类型转换的示例。
【例3-3】 强制类型转换
运行结果如图3-3所示。
图3-2 自动类型转换
图3-3 强制类型转换
● 在此程序中,定义一个int类型,将其强制转换为byte类型。
3.2.3 流程控制语句
Java程序的流程控制分为顺序结构、分支结构和循环结构三种。其中,顺序结构是按照语句的书写顺序逐一执行,分支结构是根据条件选择性地执行某段代码,循环结构是根据循环条件重复执行某段代码。
1.if语句
(1)if单语句
我们经常需要先做判断,然后才决定是否要做某件事情。对于这种“需要先判断条件,条件满足后才执行的情况”,就可以使用if条件语句实现。
下面是if单语句的示例。
【例3-4】 if单语句
程序运行结果如图3-4所示。
图3-4 if单语句
● 在此程序中,利用if判断两个数是否相等。如果a=b就输出“a等于b”。如果a=c就输出“a等于c”。
(2)if-else语句
● 在此程序中,if-else语句的操作比if语句多了一步:当条件成立时,执行if部分的代码块;条件不成立时,则进入else部分。
下面是if-else语句的示例。
【例3-5】 if-else语句
运行程序结果如图3-5所示。
图3-5 if-else语句
● 在此程序中,利用if-else实现判断给定的数据是奇数还是偶数。如果a%2等于0,就输出“a是偶数”,否则输出“a是奇数”。
(3)多重if语句
● 在此程序中,多重if语句,在条件1不满足的情况下,才会进行条件2的判断;当前面的条件均不成立时,才会执行else块内的代码。
下面是多重if语句的示例。
【例3-6】 多重if语句
程序运行结果如图3-6所示。
图3-6 多重if语句
● 在此程序中,利用多重if-else,实现分数大于90输出“优秀”,分数大于70小于90输出“良好”,小于70输出“继续加油”。
2.switch语句
当需要对选项进行等值判断时,使用switch语句更加简洁明了。
执行过程:当switch后表达式的值和case语句后的值相同时,从该位置开始向下执行,直到遇到break语句或者switch语句块结束;如果没有匹配的case语句则执行default块的代码。
下面是switch语句的示例。
【例3-7】 switch语句
程序运行结果如图3-7所示。
图3-7 switch语句
● 在此程序中使用简单的switch语句,当num小于1000时输出“奖励牙膏”num小于1500大于1000输出“奖励香皂”,num小于2000大于1500时输出“奖励洗衣粉”,num等于其他数值时输出“奖励洗发露”。
3.while循环语句
while循环结构在每次执行循环体之前,先对循环条件进行判断。如果true则重复执行循环体部分。
下面是while语句的示例。
【例3-8】 while语句
程序运行结果如图3-8所示。
图3-8 while语句
● 在此程序中,利用while循环,输出大于10小于13的数。当x小于13时,输出x的值并且x加1,直到x大于13,结束循环。
4.do-while循环语句
do-while循环先执行循环体,然后判断循环条件,如果循环条件成立则执行下一次循环,否则终止循环。
下面是do-while语句的示例。
【例3-9】 do-while语句
程序运行结果如图3-9所示。
图3-9 do-while语句
● 在此程序中使用简单的do-while循环,先执行do后面的语句,后执行while判断。先执行do后面的语句输出x的值并且x加1,再进行判断x是否小于13。
5.for循环语句
for循环在执行时,先执行循环的初始化语句,初始化语句只在循环开始前执行一次。每次执行循环体之前,先计算循环条件的值,如果循环条件值为true,则执行循环体部分,循环体部分执行结束后。执行迭代语句。因此,对于for循环而言,循环条件总比循环体要多执行一次。最后一次执行条件值为false则不再执行循环体。
for循环注意事项有以下几点:
1)初始化语句、循环条件、迭代语句这三部分都可以省略,但三者之间的分号不可以省略。当循环条件省略时,默认值为true。
2)初始化语句、迭代语句这两个部分可以为多条语句,语句之间用逗号分隔。
3)在初始化部分定义的变量,其范围只能在for循环语句内有效。
下面是for语句的示例。
【例3-10】 for语句
程序运行结果如图3-10所示。
图3-10 for语句
● 在此程序中,简单的for循环,实现1~10的整数的和。利用for循环,先初始化i等于1,sum的值为sum与i之和,判断i小于等于10,如果i大于10则结束循环。
6.break语句
Java中没有使用goto语句来控制程序的跳转,这种设计虽然提高了程序流程控制的可读性,但降低了灵活性。为了弥补这种不足,Java提供了break等语句来控制循环结构。
当循环体中出现break语句时,其功能是从当前所在的循环中跳出来,结束本层循环,但对其外层循环没有影响。break语句还可以根据条件结束循环。
下面是break语句的示例。
【例3-11】 break语句
程序运行结果如图3-11所示。
图3-11 break语句
● 在此程序中,利用break语句跳出此循环。即当i等于4时,利用break语句跳出循环。
7.continue语句
在循环体中出现continue语句时,其作用是结束本次循环,进行当前所在层的下一次循环。continue语句的功能是根据条件有选择性地执行循环体。
下面是continue语句的示例。
【例3-12】 continue语句
程序运行结果如图3-12所示。
图3-12 continue语句
● 在此程序中,利用continue跳出本次循环。即当i等于1时,利用continue语句跳出本次循环,继续下次循环。