第5章 不可不知的数据分类法—数据类型
本章视频教学录像:1 小时46分钟
Java的数据类型在程序语言的构成要素里占有相当重要的地位。Java的数据类型可分为基本数据类型与引用数据类型两大类。本章介绍Java的基本数据类型和数据类型的转换,其中重点讲述整型、浮点类型、字符类型和布尔类型。最后对基本数据类型的默认值进行讨论。
本章要点(已掌握的在方框中打钩)
□ 掌握整数类型的分类
□ 掌握浮点数据类型的分类
□ 掌握字符类型数据
□ 掌握布尔类型数据
□ 熟悉基本数据类型默认值的意义与使用方法
5.1 数据类型的意义
本节视频教学录像:41分钟
为什么要有数据类型?在回答这个问题之前,我们先温习下先贤孔子在《论语·阳货》里的一句话:“子之武城,闻弦歌之声。夫子莞尔而笑,曰:‘割鸡焉用牛刀。’”
据此,衍生了中国一个著名的成语——“杀鸡焉用宰牛刀”?这是疑问句式。是的,杀鸡的刀用来杀鸡,宰牛的刀用来宰牛,用宰牛的刀杀鸡,岂不大材小用?
杀鸡的刀和宰牛的刀虽然都是刀,但属于不同的类型,如果二者混用,要么出现“大材小用”,要么出现“不堪使用”的情况。由此,可以看出,正是有了类型的区分,我们才可以根据不同的类型,确定其不同的功能,然后“各司其职”,不出差错。
除了不同类型的“刀”承担的功能不一样,而且如果我们给“杀鸡刀”和“宰牛刀”各配一个刀套,刀套的大小也自然是不同的。“杀鸡刀”放到“宰牛刀”的刀套里,势必空间浪费,而“宰牛刀”“放到杀鸡刀”的刀套里,势必放不下。在必要时,“宰牛刀”“经过打磨,可以做成“杀鸡刀”。
从哲学上来看,很多事物的表象千变万化,而其本质却是相同。类似的,在Java语言中,每个变量(常量)都有其数据类型。不同的数据类型可允许的操作也是不同的。比如,对于整型数据,它们只能进行加减乘除和求余操作。此外,不同的数据占据的内存空间大小也是不尽相同的。而在必要时,不同的数据类型也是可以做到强制类型转换的。
程序,本质上就是针对数据的一种处理流程。那么,针对程序所能够处理的数据,就是程序语言的各个数据类型划分。正是有了各种数据类型,程序才可以“有的放矢”进行各种不同数据操作。
在Java之中数据类型一共分为两大类:基本数据类型、引用数据类型。由于引用数据类型较为难理解,所以针对于此部分的内容,本章暂不作讨论,本章讨论的是基本数据类型。在Java中规定了8种基本数据类型变量来存储整数、浮点数、字符和布尔值,如下图所示。
一个变量就如同一个杯子或一个容器,在其内要装载某个特定的数值(如同杯子里可盛水或咖啡等)。杯子有大有小,杯子里装的水(咖啡)也有多有少。同样,不同类型的变量,其能表示的数据范围也是不同的。Java的基本数据类型占用内存位数及可表示的数据范围如下表所示。
5.2 整数类型
本节视频教学录像:20分钟
整数类型(Integer),简称整型,表示的是不带有小数点的数字。例如,数字10、20就表示一个整型数据。在Java中,有4种不同类型的整型,按照占据空间大小的递增次序,分别为byte(位)、short(短整型)、int(整数)及long(长整数)。在默认情况下,整数类型是指int型,那么下面先通过代码来观察一下。
举例来说,想声明一个短整型变量sum时,可以在程序中做出如下的声明。
short sum; //声明sum为短整型
经过声明之后,Java即会在可使用的内存空间中,寻找一个占有2个字节的块供sum变量使用,同时这个变量的范围只能在-32768 到 32767之间。
5.2.1 byte类型
在Java中,byte类型占据1字节内存空间,数据的取值范围为-128 ~ 127。
【范例5-1】 byte类型数据的使用(代码bytedemo.java)。
01 public class bytedemo
02 { 03 public static void main(String args[]) 04 { 05 byte byte_max=Byte.MAX_VALUE;//得到Byte型的最大值 06 07 System.out.println("BYTE的最大值:"+byte_max); 08 } 09 }
【运行结果】
程序运行结果如下图所示。
【范例分析】
每种基本的数据类型都有几个静态属性,如MAX_VALUE(最大值)、MIN_VALUE(最小值)、SIZE(大小)、TYPE(类型)等。要得到这些值,可用名称为该类型首字母大小对象(如byte类型对应Byte对象)通过点(.)操作符将其读取出来,参见代码05行。Byte 类将基本类型 byte 的值包装在一个对象中。一个 Byte 类型的对象只包含一个类型为 byte 的字段。Byte类常见的静态属性如下表所示。
属性名称
MAX VALUE
MIN VALUE
SIZE
TYPE
属性值
最大值:27-1=127
最小值:-27=-128
所占的内存位数(bit):8位
数据类型:byte
5.2.2 short类型
short类型数据占据2个字节内存空间,取值范围为-32768 ~ 32767。
【范例5-2】 short类型数据的使用(代码shortdemo.java)。
01 public class shortdemo 02 { 03 public static void main(String args[])
04 { 05 short short_max=Short.MAX_VALUE; //得到短整型的最大值 06 07 System.out.println("SHORT的最大值:"+short_max); 08 09 } 10 }
【运行结果】
程序运行结果如下图所示。
【范例分析】
代码05行的功能就是获得短整数所能表达的最大数值(Short.MAX_VALUE)。
5.2.3 int类型
int类型数据占据4个字节内存空间,取值范围为-2147483648 ~ 2147483647。
【范例5-3】 int类型数据的使用(intdemo.java)。
01 public class intdemo 02 { 03 public static void main(String args[]) 04 { 05 int int_max= java.lang.Integer.MAX_VALUE ; //得到整型的最大值 06 //int int_max= Integer.MAX_VALUE ; //与上一句功能相同 07 System.out.println("INT的最大值:"+int_max); 08 09 } 10 }
【运行结果】
程序运行结果如下图所示。
【范例分析】
代码05行的功能就是获得短整型所能表达的最大数值(Integer.MAX_VALUE)。由于java.lang包是Java语言默认加载的,所以第05行的语句可以简化为被注释的第06行。lang是language(语言)的简写。范例【5-1】和范例【5-2】使用的就是这种简写模式。
由于每一种类型毕竟都有其对应范围的最大或最小值,那么如果说在计算的过程之中,超过了此范围(大于最大值或小于最小值),那么就会产生数据的溢出问题。请参见如下的范例,整型数据的溢出(ShotDemo2.java)。
01 public class ShotDemo2 02 { 03 public static void main(String args[]) 04 { 05 int max=Integer.MAX_VALUE; //取得int的最大值 06 int min=Integer.MIN_VALUE; //取得int的最小值 07 System.out.println(max); //最大值:2147483647 08 System.out.println(min); //最小值:-2147483648 09 System.out.println(max+1); //得到最小值:-2147483648 10 System.out.println(max+2); //相当于最小值+1:-2147483647 11 System.out.println(min-1); //得到最大值:2147483647 12 } 13 }
【运行结果】
运行结果如下图所示。
【范例分析】
第07、08行分别输出int类型的最大值和最小值。那么比int类型的最大值还大1是什么值?比int类型的最小值还小1的是什么值?第09行和第11行分别给出了答案,比int类型的最大值还大1是最小值,而int类型的最小值还小1的是最大值。这里的最大值、最小值的转换是不是有点中国哲学里“物极必反,否极泰来”的味道呢?悟到这个道理,读者朋友才能找出实战练习(5.9节中)第2题中的错误。数据最大值、最小值会出现一个循环过程,这种情况就称为数据溢出(overflow)。
5.2.4 long类型
long类型数据占据8个字节内存空间,取值范围为-9223372036854775808 ~ 9223372036854775807。
【范例5-4】 long类型数据的使用(LongDemo.java)。
01 public class LongDemo 02 { 03 public static void main(String args[]) 04 { 05 long long_max=java.lang.Long.MAX_VALUE; //得到长整型的最大值 06 System.out.println("LONG的最大值:"+long_max); 07 } 08 }
【运行结果】
程序运行结果如下图所示。
【范例分析】
范例第05行定义长整型long_max,并将系统定义好的java.lang.Long.MAX_VALUE赋给这个变量。第07行输出这个值。
在范例【5-4】中,我们演示了整型数据的数据溢出问题,而要想解决数据的溢出问题,那么最好的做法是扩大数据的操作范围,比int范围大的是刚刚讲到的long类型,所以可将其扩充为long,有两种方式扩充。
⑴ 直接在数据前增加一个“(long)”;
⑵ 直接在数据后增加一个字母“L”。
具体用法参见【范例5-5】所示。
【范例5-5】 使用long类型解决int类型溢出问题(LongDemo.java)。
01 public class intOverflowToLong 02 {
03 public static void main(String args[]) 04 { 05 int max=Integer.MAX_VALUE; //取得int的最大值 06 int min=Integer.MIN_VALUE; //取得int的最小值 07 System.out.println(max); //最大值:2147483647 08 System.out.println(min); //最小值:-2147483648 09 System.out.println(max+(long)1); //int型+long型=long型,2147483648 10 System.out.println(max+2L); //int型+long型=long型,2147483649 11 System.out.println(min-1L); //int型-long型=long型,-2147483649 12 } 13 }
【运行结果】
运行结果如下图所示。
【范例分析】
第09行,数字1前面的long表示把1强制转换为长整型(默认情况下1为普通整型int),为了不丢失数据的精度,低字节类型数据与高字节数据运算,其结果自动转变为高字节数据,因此,int型与long型运算的结果是 long型数据。
第10行和第11行,整型数据2和1后的字母“L”也达到把2和1转变为长整型的效果。
请读者对照对比体会范例【5-4】和范例【5-5】的区别。类型转换的知识将在5.6节详述。
5.3 浮点类型
本节视频教学录像:10分钟
Java浮点数据类型主要有双精度double和单精度float两个类型。
double类型:共8个字节,64位,第1位为符号位,中间11位表示指数,最后52位为尾数。float类型:共4个字节,32位,第1位为符号位,中间8位表示指数,最后23位表示尾数。
5.3.1 float类型
下面举一个简单的例子。在程序中,声明一个float类型的变量num,并赋值为3.0,将num*num的运算结构输出到显示器上。
【范例5-6】 浮点类型的使用(floatDemo.java)。
01 //下面这段程序说明了浮点数类型的使用方法 02 public class floatDemo 03 { 04 public static void main(String args[]) 05 { 06 float num=3.0f; 07 System.out.println(num+"*"+num+"="+(num*num)); 08 } 09 }
【运行结果】
程序运行结果如下图所示。
【范例分析】
需要注意一点,含小数的实数默认为double类型数据,如果定义的是float型数据,为其赋值的时候,必须要执行强制转型,有两种方式。
⑴ 直接加上字母“F”,或小写字母“f”,例如:“float data = 1.2F ;”或“float data = 1.2f”。
⑵ 直接在数字前加强制转型为“float”,例如:“float data2 = (float) 1.2 ;”。
范例中06行定义了一个float类型变量num,并赋值为3.0f。其中3.0后的字母“f”其实就是上面讲到的第一种强制类型转换。07行将num做了简单的乘法运算输出。
5.3.2 double类型
当浮点数的表示范围不够大的时候,还有一种双精度(double)浮点数可供使用。双精度浮点数类型的长度为64个字节,有效范围为-1.7×10308~1.7×10308。
Java提供了浮点数类型的最大值与最小值的代码,其所使用的类全名与所代表的值的范围,可以在下表中查阅。
类似的,在类全名中,可以省去类库java.lang,直接取用类名称即可。下面的程序是输出float与double两种浮点数类型的最大与最小值,读者可以将下面程序的输出结果与上表一一进行比较。
【范例5-7】 取得单精度和双精度浮点数类型的最大、最小值(doubleAndFloatDemo. java)。
01 //下面这段程序用于取得单精度和双精度浮点数类型的最大、最小值 02 public class doubleAndFloatDemo 03 { 04 public static void main(String args[]) 05 { 06 System.out.println("float_max="+java.lang.Float.MAX_VALUE); 07 System.out.println("float_min="+java.lang.Float.MIN_VALUE); 08 System.out.println("double_max="+java.lang.Double.MAX_VALUE); 09 System.out.println("double_min="+java.lang.Double.MIN_VALUE); 10 } 11 }
【运行结果】
程序运行结果如下图所示。
下面为声明与设置float与double类型的变量时应注意的事项。
double num1=-6.3e64; //声明num1为double,其值为-6.3*10^64 double num2=-5.34E16; //e也可以用大写的E来取代
float num3=7.32f; //声明num3为float,并设初值为7.32f float num4=2.456E67; //错误,因为2.456*1067已超过float可表示的范围
5.4 字符类型(char)
本节视频教学录像:11分钟
字符,顾名思义,就是字母和符号的统称。字符类型在内存中占有2个字节,定义时语法为。
char a=‘字’; //声明a为字符型,并赋初值为‘字’
下面给出一个范例来说明它的用法。
【范例5-8】 直接给字符类型赋值(charDemo.java)。
01 //字符类型也可以直接赋给数值,下面的这段程序就是采用这种赋值方式 02 public class charDemo 03 { 04 public static void main(String args[]) 05 { 06 char ch1=97; 07 char ch2='a'; 08 System.out.println("ch1="+ch1); 09 System.out.println("ch2="+ch2); 10 } 11 }
【运行结果】
程序运行结果如下图所示。
需要注意的是:字符要用一对单引号(' ')括起。但如果把一个字符变量赋值成一个单引号,就会出问题,这样就有了转义字符的概念。转义字符就是用不容易混淆的字符来代替那些敏感字符,它们作为一个整体使用。
下表为常用的转义字符。
以下面的程序为例,将ch赋值为'\"'(要以单引号(')包围),并将字符变量ch输出在显示器上,同时在打印的字符串里直接加入转义字符,读者可自行比较一下两种方式的差异。
【范例5-9】 转义字符的使用(EscapeChar.java)。
01 //下面这段程序表明了转义字符的使用方法 02 public class EscapeChar 03 { 04 public static void main(String args[]) 05 { 06 char ch='\"'; 07 System.out.println(ch+"测试转义字符!"+ch); 08 System.out.println("\"hello world!\""); 09 } 10 }
【运行结果】
程序运行结果如下图所示。
总结可以得知,不管是用变量存放转义字符,还是直接使用转义字符的方式来输出字符串,程序都可以顺利运行。由于使用变量会占用内存资源,因此似乎显得有些不妥;当然也可以不必声明字符变量就输出转义字符,但如果在程序中加上太多的转义字符,以至于造成混淆而不易阅读时,利用声明字符变量的方式就是一个不错的选择。
但是需要注意的是,Java之中默认采用的编码方式为Unicode编码,此编码是一种采用十六进制编码方案,可以表示出世界上的任意的文字信息。所以在Java之中单个字符里面是可以保存中文字符的,一个中文字符占据2个字节。这点是与C/C++对字符型的处理是有区别的,在C/C++中,中文字符只能当作字符串处理。
【范例5-10】 单个中文字符的使用(ChineseChar.java)。
01 public class ChineseChar 02 { 03 public static void main(String args[]) 04 { 05 char c='中';//单个字符变量c,存储单个中文字母 06 System.out.println(c); 07 } 08 }
【运行结果】
程序运行结果如下图所示。
值得注意的是,char和int型数据的互相转型问题。遵循C语言常用的ASCII码的习惯,字母的表示范围是:大写字母A~Z对应整数65 ~ 90、小写字母a~z对应整数97 ~ 122、字符0~9对应整型数49 ~ 57,由此可以发现,大写字母和小写字母之间的差是32个长度,如果按照此规律,就可以轻易的编写一个大小写的转换操作。参见范例5-12所示。
提示
ASCII(American Standard Code for Information Interchange,美国标准信息交换码)是计算机中用得最广泛的字符集及其编码,由美国国家标准局(ANSI)制定,已被国际标准化组织(ISO)定为国际标准。
【范例5-11】 单个英文字符与ASCII(整型值)的转换(CharToInt.java)。
01 public class CharToInt 02 { 03 04 public static void main(String args[]) 05 { 06 char c='A'; 07 int x=c; //字符c直接给整型变量赋值 08 System.out.println(x); //输出字符A的ASCII码值:65 09 x=x+32; //编码值提升32 10 c=(char)x; //将数字的编码值变为字符值:a 11 System.out.println(c); 12 13 } 14 }
【运行结果】
程序运行结果如下图所示。
【范例分析】
范例07行,字符c直接给整型变量赋值x,此时x的值就是c对应的ASCII码值,也就是65,第08行输出这个结果。
范例第09行,整型变量x值增加32,也就是97,此值正是小写字母‘a’的ASCII值。第10行将x强制类型转换为字符型,第11行输出该字符‘a’。
5.5 布尔类型(boolean)
本节视频教学录像:3分钟
布尔(Boolean)本是一位英国数学家的名字。在Java中使用关键字boolean来声明布尔类型。被声明为布尔类型的变量,只有true(真)和false(假)两种。除此之外,没有其他的值可以赋值给这个变量。
布尔类型主要用于逻辑判断,就如我们日常生活中的“真”和“假”一样。比如,我们可以用布尔类型来表示某人的性别,“张三”是否是“男人”?如下图所示。
若想声明名称为Zhang3IsMan的变量为布尔类型,并设置为true值,可以使用下面的语句。
boolean Zhang3IsMan=true; //声明布尔变量Zhang3IsMan,并赋值为true
经过声明之后,布尔变量的初值即为true,当然如果在程序中需要更改status的值时,即可随时更改。将上述的内容写成了程序booleanDemo,读者可以先熟悉一下布尔变量的使用。
【范例5-12】 布尔值类型变量的声明(booleanDemo.java)。
01 //下面的程序声明了一个布尔值类型的变量 02 public class booleanDemo 03 { 04 public static void main(String args[])
05 { 06 //声明一布尔型的变量status,布尔型只有两个取值:true、false 07 boolean Zhang3IsMan=true; 08 System.out.println("Zhang3 is man?="+Zhang3IsMan); 09 } 10 }
【运行结果】
程序运行结果如下图所示。
【范例分析】
第07行定义一个布尔变量Zhang3IsMan,并赋值为true。第08行输出这个判断。
特别注意的是,Zhang3IsMan不能赋值为0或者1,或者其他整数,编译器将不予通过。
布尔值通常用来控制程序的流程,读者可能会觉得有些抽象,本书会陆续在后面的章节中介绍布尔值在程序流程中所起的作用。
5.6 数据类型的转换
本节视频教学录像:36分钟
Java有严格的数据类型限制,每种数据类型都有其独特的特性。这些不同的数据类型所定义的变量,它们之间的类型转换不是轻易完成的。但在特殊情况下,还是需要进行类型转换的操作,但必须遵循严格的步骤和规定。数据类型的转换方式可分为“自动类型转换”及“强制类型转换”两种。下面分别给予讨论。
5.6.1 自动类型转换
在程序中已定义好了数据类型的变量,若想转换用另一种数据类型表示时,Java会在下面2个条件皆成立时,自动进行数据类型的转换。
⑴ 转换前后的数据类型要相互兼容。在C/C++中,整型和布尔类型的关系是 “非零即为真”——凡是不是零的整数都可以认为是布尔值为真变量,二者是兼容的,所以可以相互转换。而在Java中,由于boolean类型只能存放true或flase,与整数及字符不兼容,因此boolean类型不可能与其他任何数据类型进行转换。整数与浮点数亦是兼容的,所以可相互转换。
⑵ 转换后的数据类型的表示范围不小于转换前的类型。以“扩大转换”来看可能比较容易理解。Java在进行数值运算时,以尽量不损失精度(正确性)为准则。例如,一个字符型的变量(本质上是2字节大小的整数)和一个整型变量(默认为4个字节大小整数)进行计算,在运算前,不同类型的操作数需要先转化为同一数据类型,然后再实施运算操作。因此需要将字符型的变量转换为整型变量,否则将4字节整型变量转换为2字节的字符型,很有可能导致整型变量的值会溢出,从而导致计算错误。字符与整数是可使用自动类型转换的。
假设参与某种运算有两个不同的操作数(操作数1和操作数2),二者具有不同的数据类型,在运算操作之前,它们需要转换为同一数据类型,其相互转换的规则如下表所示。
在接下来的范例中,我们来看看当两个数中有一个为浮点数时,其运算的结果会有什么样的变化。
【范例5-13】 声明两个变量,一个是整型,另一个是浮点型(IntAndFloat. java)。
01 //下面这段程序声明了两个变量,一个是整型,另一个是浮点型 02 public class IntAndFloat 03 { 04 public static void main(String args[]) 05 { 06 int a=156; 07 float b=24.1f; //声明一浮点型变量f,并赋值24.1 08 System.out.println("a="+a+",b="+b); 09 System.out.println("a/b="+(a/b)); //在这里整型会自动转换为浮点型 10 } 11 }
【运行结果】
程序运行结果如下图所示。
【范例分析】
从运行的结果可以看出,当两个数中有一个为浮点数时(代码第10行),其运算的结果会直接转换为浮点数。当表达式中变量的类型不同时,Java会自动把较小的表示范围转换成较大的表示范围后,再做运算。也就是说,假设有一个整数和双精度浮点数作运算,Java会把整数转换成双精度浮点数后再做运算,运算结果也会变成双精度浮点数。关于表达式的数据类型转换,在后面的章节中会有更详细的介绍。
现在,我们可以给出自动数据类型转型的规律:byte short int long float double,按照范围由小到大实现自动转型操作。
5.6.2 强制类型转换
当程序需要转换数据类型时,可实施强制性的类型转换,其语法如下。
(欲转换的数据类型)变量名称;
下面的程序说明了在Java里,整数与浮点数是如何转换的。
【范例5-14】 自动转换和强制转换的使用方法(AutoConvert.java)。
01 //下面的范例说明了自动转换和强制转换这两种转换的使用方法 02 public class AutoConvert 03 { 04 public static void main(String args[]) 05 { 06 int a=55; 07 int b=9; 08 float g,h; 09 System.out.println("a="+a+",b="+b); 10 g=a/b; 11 System.out.println("a/b="+g+"\n"); 12 System.out.println("a="+a+",b="+b); 13 h=(float)a/b; //在这里对数据类型进行强制转换 14 System.out.println("a/b="+h); 15 } 16 }
【运行结果】
程序运行结果如下图所示。
当两个整数相除时,小数点以后的数字会被截断,使得运算的结果保持为整数。但由于这并不是预期的计算结果,而想要得到运算的结果为浮点数,就必须将两个整数中的一个(或是两个)强制转换为浮点数,下面的3种写法都正确。
(float)a/b; //将整数a强制转换成浮点数,再与整数b相除 a/(float)b; //将整数b强制转换成浮点数,再以整数a除之 (float)a/(/float)b; //将整数a与b同时强制转换成浮点数,再相除
只要在变量前面加上欲转换的数据类型,运行时就会自动将此行语句里的变量做类型转换的处理,但这并不影响原先所定义的数据类型。
此外,若将一个超出该变量可表示范围的值赋给这个变量,这种转换称为缩小转换。由于在转换的过程中可能会丢失数据的精确度,因此Java并不会“自动”做这些类型的转换,此时就必须要做强制性的转换,例如 int x = (int)10.35(结果x=10),将double类型的值(10.35)强制转换为int类型(10),这样也丢失了很多的信息。
5.7 基本数据类型的默认值
本节视频教学录像:10分钟
在Java中,若在变量的声明时没有赋初值,则会给该变量赋默认值。下表列出了各种类型的默认值。
在某些情形下,Java会给予这些没有赋初始值的变量一个确切的默认值,这个值没有任何意义,但保证程序执行时,不运行有这种没有初始化值的变量存在。虽然这种方式给程序编写者带来了很多便利,但是过于依赖系统给变量赋初值,就不容易检测到是否已经给予变量应有的值了,这是个需要注意的问题。
5.8 高手点拨
本节视频教学录像:9分钟
1. 整型数的除法要注意
由于整数与整数运算,其结果还是整数,除法也不例外,而很多初学者受到数学上的惯性思维影响,没有能充分注意,导致在一些考试题(面试题)中失利,请参见下面的例程,写出程序的输出结果:
01 public class Demo 02 { 03 public static void main(String args[]) 04 { 05 int x=10; 06 int y=3; 07 int result=x/y; 08 System.out.println(result); 09 } 10 }
分析:由于x和y均是整数,在数据类型上,int型 / int型 = int型,所以x / y=10/3=3,而不是。本题的输出为3,即的整数部分。
2. C/C++语言和Java语言在布尔类型上存在显著差别
从C/C++语言过渡来学习Java的读者,请注意Java语言与C/C++在布尔类型上有很大区别,C/C++遵循的规则是 “非零即为真”,即所有不是零的数,都可认为是“true”,而仅把0当作false。
而Java语言的布尔类型变量,其赋值只能是true(真)和false(假)两种。除此之外,没有其他的值可以赋值给布尔变量。也不能用1和0分别代替true(真)和false(假)。一言蔽之,Java语言中的布尔类型与整型无关。
5.9 实战练习
本节视频教学录像:20分钟
1. 编写程序,要求运行后要输出long类型数据的最小数和最大数。
2. 改错题:指出错误之处并对其进行修改(本题改编自2013年巨人网络的Java程序员笔试题)。
程序功能:输出int类型最小值与最大值之间的所有数是否是偶数(能被2整除的数),操作符%为求余操作。
01 public class FindEvenNumber 02 { 03 public static void main(String[]args) 04 { 05 for(int i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++i)
06 { 07 boolean isEven=(i%2==0); 08 System.out.println(String.format("i=%d,isEven=%b",i,isEven)); 09 } 10 } 11 }
3. 请运行下面一段程序,并分析产生输出结果的原因(改编自网络Java面试题)。
01 public class CTest 02 { 03 public static void main(String[]args) 04 { 05 06 int x=5; 07 int y=2; 08 System.out.println(x+y+"K"); 09 System.out.println(6+6+"aa"+6+6); 10 } 11 }
【运行结果】
【面试题分析】
对于第08行,按照运算符从左至右的运算顺序,第一个运算表达式是5+2=7,之后运算表达式为7 + “K”,因为“K”是字符串,通过类型转换之后将7转换为字符,这里第二个加号“+”相当于一个字符串连接符。所以第08行的输出结果为7K。同理可分析第09行的输出,第一个运算表达式是6 + 6= 12,之后运算表达式为12 + “aa”,因为“aa”是字符串,整型12被转换为字符串“12”。通过加号连接符构成新的字符串“12aa”。类似的,系统会自动将“12aa”后面的两个整数“6”,逐个转换成字符“6”,然后通过加号“+”连接成新的字符串,最终形成输出的字符串“12aa66”。
请读者思考一下,如果将08行字符“K”的双引号“ ”换成单引号‘ ’,即。
System.out.println(x + y + ‘K’);
请写出相应的输出结果,并分析原因。