![Android移动应用开发技术与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/15/40681015/b_40681015.jpg)
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 基本数据类型长度和表示范围
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/66_01.jpg?sign=1739288969-Woux6bEZbDjiM6aa4kMfsNL7JTGYr1DD-0-107a0a388a538034d5c28bad2527dbb3)
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】 基本数据类型
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/67_01.jpg?sign=1739288969-tfLbqK12PLKzUw3ufsWWSyBdjOfhkuL8-0-ce5eb2198b36553112b65f587a9c4949)
程序运行结果如图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。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/68_01.jpg?sign=1739288969-h3sj1EkrOu4H8v9FpV8sSlAogm85khN3-0-87959f7d0171446e551791b0c4a791bd)
图3-1 基本数据类型
3.2.2 基本数据类型转换
1.自动类型转换
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算,转换从低级到高级。级别低的操作数和级别高的不同基本类型操作数在一起运算时,就需要进行类型转换,类型转换方式如表3-2所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/68_02.jpg?sign=1739288969-LNT5wqYMDGT5O684pDJQLccf5c8u8Rp0-0-c307cf75b8623623d81e51ac243ae40b)
表3-2 自动类型转换
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/68_03.jpg?sign=1739288969-UmrGYDQHO0fOA9UceUSatlG5gw3WEYGv-0-7e73b52a1d2a0552bfdb03d118a8a28a)
数据类型转换必须满足如下规则。
1)不能对boolean类型进行类型转换。
2)不能把对象类型转换成不相关类的对象。
3)在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
4)转换过程中可能导致溢出或损失精度。
5)浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入。
必须满足转换前的数据类型的位数要低于转换后的数据类型,例如,short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型。
下面是自动类型转换的示例。
【例3-2】 自动类型转换
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/69_01.jpg?sign=1739288969-UylcYmdx7BrYktkf8leUCZzib6KBG2Hj-0-ff3b9a6ef82284d2c9ae7ebef38a15aa)
运行结果如图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】 强制类型转换
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/69_02.jpg?sign=1739288969-L0ejVX9GrIdDDO4AX2vm9cJs47TiUXKM-0-8495849d445b3710608e5659ce048e83)
运行结果如图3-3所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/69_03.jpg?sign=1739288969-FSvgVxa7K1Li5iMvWddMXESd7M57b1a0-0-eaf877634c0d0f9d68558844a427b3aa)
图3-2 自动类型转换
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/69_04.jpg?sign=1739288969-CyyVXmxqsrPESspnIQegFDb17o03FGoP-0-e82c4e41b05f596bb19ec618312a82fb)
图3-3 强制类型转换
● 在此程序中,定义一个int类型,将其强制转换为byte类型。
3.2.3 流程控制语句
Java程序的流程控制分为顺序结构、分支结构和循环结构三种。其中,顺序结构是按照语句的书写顺序逐一执行,分支结构是根据条件选择性地执行某段代码,循环结构是根据循环条件重复执行某段代码。
1.if语句
(1)if单语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/70_01.jpg?sign=1739288969-UYw0WrHnENEFZdYMhex1Wjmk62M6dMkk-0-6e8f1b77dd965994c6d2cf6f1852dabc)
我们经常需要先做判断,然后才决定是否要做某件事情。对于这种“需要先判断条件,条件满足后才执行的情况”,就可以使用if条件语句实现。
下面是if单语句的示例。
【例3-4】 if单语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/70_02.jpg?sign=1739288969-aoMqlcXhK1gJkZVaZZ2U29CrV3x5ZpJ8-0-02313c293448bc72b833a4dc534e71e0)
程序运行结果如图3-4所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/70_03.jpg?sign=1739288969-RWFR1iMt0BTv6anrGmm7WJ8MuvIZo2cD-0-08f3aa30671db59514c4030c2248d8e4)
图3-4 if单语句
● 在此程序中,利用if判断两个数是否相等。如果a=b就输出“a等于b”。如果a=c就输出“a等于c”。
(2)if-else语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/70_04.jpg?sign=1739288969-zEjvHd9PWaM8ArqYvo5teI3ldLsNdnz3-0-6a7553e924f45ede1f5d85ece2aff521)
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/71_01.jpg?sign=1739288969-ev6roGixfpIMQNof05b4YyX6oakIsbWI-0-56db1f38eb1d84126562a57963e1d112)
● 在此程序中,if-else语句的操作比if语句多了一步:当条件成立时,执行if部分的代码块;条件不成立时,则进入else部分。
下面是if-else语句的示例。
【例3-5】 if-else语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/71_02.jpg?sign=1739288969-LeYCbMH9aFHfVCKJrFqHDHPHLS18Hi9d-0-d22789faf80deb7380674e561ccbe06d)
运行程序结果如图3-5所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/71_03.jpg?sign=1739288969-Xpl38SPT7APpsp2Hpdd3oMPP6JFokG0i-0-66d7f58c57c9a57353dc175dd37e8ba2)
图3-5 if-else语句
● 在此程序中,利用if-else实现判断给定的数据是奇数还是偶数。如果a%2等于0,就输出“a是偶数”,否则输出“a是奇数”。
(3)多重if语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/71_04.jpg?sign=1739288969-Qgmn8yXRAxNv4o81pxfoSTr4PurtLxn1-0-7327d1e4403a1e24ffb4b891d1b38845)
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/72_01.jpg?sign=1739288969-BgdivsDmfRmNK6ubWBMHZiCzaLFIOk8J-0-f37cbeeb0fd46d55331e6e96db1e3510)
● 在此程序中,多重if语句,在条件1不满足的情况下,才会进行条件2的判断;当前面的条件均不成立时,才会执行else块内的代码。
下面是多重if语句的示例。
【例3-6】 多重if语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/72_02.jpg?sign=1739288969-YLMfNdUvkEbG8bq0dYiAC2IEJtKqpb95-0-d41fe6cbca38b46c859b2cbcc9eff9a0)
程序运行结果如图3-6所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/72_03.jpg?sign=1739288969-XzDWYCuNfl4E2zUXQylwBRlh8MrdVJeT-0-fda01a296ec4af3baa79a3fe497df09a)
图3-6 多重if语句
● 在此程序中,利用多重if-else,实现分数大于90输出“优秀”,分数大于70小于90输出“良好”,小于70输出“继续加油”。
2.switch语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/72_04.jpg?sign=1739288969-6nVEmbxvAu6gWlwbK05epN1wXCIaafJq-0-a0ac26e0178dae4f088fbe603db8d905)
当需要对选项进行等值判断时,使用switch语句更加简洁明了。
执行过程:当switch后表达式的值和case语句后的值相同时,从该位置开始向下执行,直到遇到break语句或者switch语句块结束;如果没有匹配的case语句则执行default块的代码。
下面是switch语句的示例。
【例3-7】 switch语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/73_01.jpg?sign=1739288969-xHGCiLOOvlS7cS6waRivYK5vj7Yn7osp-0-f661e944e1c8208f15838a1371192dfb)
程序运行结果如图3-7所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/73_02.jpg?sign=1739288969-iyjeUUlRFbx2NJa6TfzpdaAi6Gy5ar8L-0-877b985464a9f6744bda43d05069943f)
图3-7 switch语句
● 在此程序中使用简单的switch语句,当num小于1000时输出“奖励牙膏”num小于1500大于1000输出“奖励香皂”,num小于2000大于1500时输出“奖励洗衣粉”,num等于其他数值时输出“奖励洗发露”。
3.while循环语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/73_03.jpg?sign=1739288969-qmQ4EVAn6JYSfbIqWkIUsSYaRBqzDZit-0-dea5ec5af56d0485ed13886d0e6ca6f2)
while循环结构在每次执行循环体之前,先对循环条件进行判断。如果true则重复执行循环体部分。
下面是while语句的示例。
【例3-8】 while语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/73_04.jpg?sign=1739288969-a8K1zcQU0eRfk9S1yMVUnsCp2VEGglXb-0-2a2b8240759dfb109f82cdb0fbf6b736)
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/74_01.jpg?sign=1739288969-y1UAisBmFo28vfmMZJI6oEejtu7xMszo-0-d199fcddc8d9baa844d5b6f9d45cbf26)
程序运行结果如图3-8所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/74_02.jpg?sign=1739288969-0KSuDgbuGZaFWmzsWMtD8Ej2NPBzCfuF-0-cda7d0bd94cb9f7ceffecbb1230362c9)
图3-8 while语句
● 在此程序中,利用while循环,输出大于10小于13的数。当x小于13时,输出x的值并且x加1,直到x大于13,结束循环。
4.do-while循环语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/74_03.jpg?sign=1739288969-CdDNZ3PVPByDsD06YB1DPbqqZ9ExGDv7-0-d62f10d329655ff397f41ea5472a1920)
do-while循环先执行循环体,然后判断循环条件,如果循环条件成立则执行下一次循环,否则终止循环。
下面是do-while语句的示例。
【例3-9】 do-while语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/74_04.jpg?sign=1739288969-EwvYgiJMi08CE5NT2oSog7YEScwj6DrH-0-72c6689664f1221477c80098c22fa3f3)
程序运行结果如图3-9所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/75_01.jpg?sign=1739288969-XxkVkdTqVm9yDXLaCGpQkXYHMFiTUV3k-0-cd98d0b2724ac2796d21b19dabbbd74c)
图3-9 do-while语句
● 在此程序中使用简单的do-while循环,先执行do后面的语句,后执行while判断。先执行do后面的语句输出x的值并且x加1,再进行判断x是否小于13。
5.for循环语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/75_02.jpg?sign=1739288969-JalzPeQdhPk4uXkbJgTHnDqv1CNPMKPl-0-5a65786f06c8b43ae9c413d9e78a3d63)
for循环在执行时,先执行循环的初始化语句,初始化语句只在循环开始前执行一次。每次执行循环体之前,先计算循环条件的值,如果循环条件值为true,则执行循环体部分,循环体部分执行结束后。执行迭代语句。因此,对于for循环而言,循环条件总比循环体要多执行一次。最后一次执行条件值为false则不再执行循环体。
for循环注意事项有以下几点:
1)初始化语句、循环条件、迭代语句这三部分都可以省略,但三者之间的分号不可以省略。当循环条件省略时,默认值为true。
2)初始化语句、迭代语句这两个部分可以为多条语句,语句之间用逗号分隔。
3)在初始化部分定义的变量,其范围只能在for循环语句内有效。
下面是for语句的示例。
【例3-10】 for语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/75_03.jpg?sign=1739288969-UJOgzgYmNBm90ZXVnPPtlMJ8U7yOPsD4-0-3b82072e8b5eb5f2dd5268b6651260ae)
程序运行结果如图3-10所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/75_04.jpg?sign=1739288969-czmysx5DcbNYciH0xweDh7d02JD5UoBL-0-c4c749a0d388a4e2ed092f541a0d7fc5)
图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语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/76_01.jpg?sign=1739288969-cPZudJEWWwoJvRhEb2M9yP0KsfyZ4hLN-0-2bd1987ce84bf7e6c60fe6c8b7b2791c)
程序运行结果如图3-11所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/76_02.jpg?sign=1739288969-DftfjYy1JNKGyKibEgOJHubY84Ft0NUc-0-6d9e81c708beedc4186033cdae1b2ae7)
图3-11 break语句
● 在此程序中,利用break语句跳出此循环。即当i等于4时,利用break语句跳出循环。
7.continue语句
在循环体中出现continue语句时,其作用是结束本次循环,进行当前所在层的下一次循环。continue语句的功能是根据条件有选择性地执行循环体。
下面是continue语句的示例。
【例3-12】 continue语句
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/76_03.jpg?sign=1739288969-jIlp4UAbB7WfgbAkH1uoVc43OnwHCucR-0-4575167d8115ff8219fae584f79e4941)
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/77_01.jpg?sign=1739288969-r4KcWRzxFykgYByNLOHd93xSrXqTkB2q-0-1b6916da6f8696b9628bad3a8e0f0a63)
程序运行结果如图3-12所示。
![](https://epubservercos.yuewen.com/B95AF2/21122066801630906/epubprivate/OEBPS/Images/77_02.jpg?sign=1739288969-pvpatjMhPrQ6mbs6zzMbahkipvqBuvbj-0-6346963c3399b0b697751c658491521d)
图3-12 continue语句
● 在此程序中,利用continue跳出本次循环。即当i等于1时,利用continue语句跳出本次循环,继续下次循环。