Java从入门到精通(第2版)
上QQ阅读APP看书,第一时间看更新

第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’);

请写出相应的输出结果,并分析原因。