1、Java的基本语法基本数据类型点击查看本小节知识架构变量与常量点击查看本小节知识架构 Java中的运算符点击查看本小节知识架构2.22.22.32.32.42.42.12.1程序的结构点击查看本小节知识架构 2.52.5点击查看本小节知识架构学习目标掌握理解了解熟悉掌握基本数据类型、基本语法1了解变量与常量42理解流程控制3熟悉运算符“万丈高楼平地起”,要建成一栋高楼大厦的前提是将地基打牢。同样,要想使用Java语言开发出一款功能完备的项目,首先需要掌握好Java语言的基础知识并能灵活地运用。学好基础知识是学好任何一门语言的关键,只有掌握牢固基础知识,才能够在学习的道路上越走越远。本章将对Ja
2、va语言的基本语法、数据类型、变量的使用、运算符以及程序的结构等基础知识进行讲解。2.1 Java的基本语法的基本语法2.1.1语句和表达式返回目录2.1.2基本格式2.1.3注释2.1.4标识符与关键字2.1.5进制转换在Java程序中要完成的所有任务都可分解为一系列的语句。在编程语言中,语句是简单命令,它会命令计算机执行某种操作。如上所示是两条简单的Java语句,还有些语句能够提供一个值,例如将两个数相加,生成一个值的语句称为表达式,这个值可以存储下来供程序使用,语句生成的值称为返回值。另外,有些表达式生成数字值,有些表达式生成布尔值等。2.1 Java的基本语法2.1.1 语句和表达式语
3、句表示程序中发生的单个操作,接下来先看两条简单的Java语句,具体示例如下。如上所示是两条Java语句,但为了让程序便于他人阅读和理解,建议写代码时遵循格式规范,每条语句占一行。Java程序中通常每条语句占一行,但这只是一种格式规范,并不能决定语句到哪里结束,Java语句都以分号(;)结尾,可以在一行写多条语句,具体示例如下。2.1 Java的基本语法2.1.1 语句和表达式如上所示为声明一个类的格式,接下来按照这个格式来声明一个类,具体示例如下。Java语言的语法简单明了,容易掌握,它有着自己独特的语法规范,因此要学好Java语言,首先需要学习它的基本语法。1.类类(class)是Java的
4、基本结构,一个程序可以包含一个或多个类,Java使用class关键字声明一个类,其语法格式如下。2.1 Java的基本语法2.1.2 基本格式3.块Java中使用左大括号()和右大括号()将语句编组,组中的语句称为代码块或块语句,具体示例如下。2.修饰符修饰符(modifier)用于指定数据、方法、类的属性以及用法,具体示例如下。2.1.2 基本格式如上所示的两条语句在大括号内,称为块语句。2.1 Java的基本语法在编写程序时,为了使代码易于阅读,通常会在实现功能的同时为代码加一些注释。注释是对程序的某个功能或者某行代码的解释说明,它只在Java源文件中有效,在编译程序时,编译器会忽略这些注
5、释信息,不会将其编译到class字节码文件中去。另外,注释还能屏蔽一些暂时不用的语句,等需要时直接取消此语句的注释即可,注释是代码调试的重要方法。1.单行注释用于对程序某一行代码进行解释。在注释内容前面加双斜杠“/”,Java编译器会忽略掉这部分信息,具体示例如下。2.1.3 注释2.1 Java的基本语法在Java中根据功能的不同,注释主要分为单行注释、多行注释和文档注释3种。2.多行注释用于注释内容有多行的情况。在注释内容前面以单斜杠加一个星号“/*”开头,并在注释内容末尾以一个星号加单斜杠“*/”结束,具体示例如下:3.文档注释用于对一段代码概括地解释说明,使用javadoc命令将注释内
6、容提取生成正式的帮助文档。以单斜杠加两个星号“/*”开头,并以一个星号加单斜杠“*/”结束。2.1.3 注释2.1 Java的基本语法脚下留心在Java中,有的注释能嵌套使用,有的则不能嵌套,下面列出两种具体的情况。(1)多行注释中可以嵌套单行注释,具体示例如下。(2)多行注释中不能嵌套多行注释,具体示例如下。2.1.3 注释2.1 Java的基本语法上面的代码编译报错:Syntax error on tokens,delete these tokens,原因在于编译器会对第一个“/*”和第一个“*/”进行匹配,第二个“/*”被当做注释的内容,第二个“*/”找不到匹配,故编译报错。现实世界中每
7、种事物都有自己的名称,从而与其他事物进行区分。例如,生活中每种交通工具都有一个用来标识的名称,如图所示。2.1.4 标识符与关键字2.1 Java的基本语法在Java语言中,同样也需要对程序中各个元素通过命名加以区分,这种用来标识变量、函数、类等元素的符号称为标识符。Java语言规定,标识符由字母、数字和下画线组成,并且只能以字母或下画线开头。在使用标识符时应注意以下几点。(1)命名时应遵循见名知义的原则。(2)系统已用的关键字不得用作标识符。(3)下画线对解释器有特殊的意义,建议避免使用下画线开头的标识符。(4)标识符是区分大小写的。2.1.4 标识符与关键字2.1 Java的基本语法关键字
8、是指Java语言中规定了特定含义的标识符,如if、class等,因此不能再使用关键字作为其他名称的标识符,下面列出了Java中常用的关键字。2.1.4 标识符与关键字2.1 Java的基本语法2.1.4 标识符与关键字 对于这些关键字,要特别注意以下三点。(1)enum是JDK5.0新增关键字,用于定义一个枚举。(2)goto和const关键字也被称为保留字,是Java现在还未使用,但可能在未来的Java版本中使用的关键字。(3)true、false和null是特殊的直接量,虽然不是关键字,但是却作为一个单独标识类型,也不能直接使用。2.1 Java的基本语法2.1.5 进制转换 进制就是进位
9、制,是人们规定的一种进位方法。对于任何一种进制X进制,就表示某一位置上的数运算时是逢X进一位。二进制就是逢二进一,八进制是逢八进一,十进制是逢十进一,十六进制是逢十六进一。同一数值可以在不同进制之间的转换,具体转换方式介绍如下。1.二进制与十进制的转换 1)二进制转十进制 按权相加法,即将二进制每位上的数乘以权(N进制,整数部分第i位的权为Ni-1,小数部分第i位权为N-i),然后相加的和即是十进制。2.1 Java的基本语法如将二进制数101.101转换为十进制,具体示例如下。2.1.5 进制转换2.1 Java的基本语法上述表达式可以简写,具体示例如下。2)十进制转二进制十进制数转换为二进
10、制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。(1)整数部分除2取余法,即每次将整数部分除以2,余数为权位上的数,商继续除以2,直到商为0为止,余数逆序读取即是二进制值。如将十进制数10转换为二进制,转换方法如图所示。2.1.5 进制转换2.1 Java的基本语法图中余数逆序读取的值为1010,即是十进制10的二进制值。(2)小数部分。乘2取整法,即将小数部分乘以2,取整数部分,剩余小数部分继续乘以2,直到小数部分为0为止,整数部分顺序读取即是二进制值。如将十进制值0.125转换为二进制,转换方式如图所示。2.1.5 进制转换2.1 Java
11、的基本语法在图中整数顺序读取值为0.001,即是十进制0.125的二进制值。2.二进制与八进制的转换 数学关系23=8、24=16,而八进制和十六进制由此关系衍生而来的,即用三位二进制表示一个八进制,用四位二进制表示一个十六进制。1)二进制转八进制取三合一法,即从二进制的分界点(小数点)向左(向右)每三位取成一位,将这三位二进制按权相加,得到的数就是一位八进制数,然后按顺序进行排列,小数点的位置不变,得到的数即是八进制数。2.1.5 进制转换2.1 Java的基本语法如果无法凑足三位,则补0,凑足三位。如将二进制数1101.1转换为八进制,转换方式,如图所示。2.1.5 进制转换2.1 Jav
12、a的基本语法在图中,先从小数点开始每三位取成一位,不足补0,将三位二进制按权相加,所得数按顺序读取值为15.4,即是二进制1101.1的八进制值。2)八进制转二进制 取一分三法,即将一位八进制数分解成三位二进制数,用三位二进制按权相加去凑这位八进制数,小数点位置照旧。如将八进制数63.2转换为二进制,转换方式,如图所示。二进制与八进制转换过程中的数值的对应关系,如表所示。2.1.5 进制转换二进制二进制八进制八进制二进制二进制八进制八进制000010040011101501021106011311172.1 Java的基本语法 3.二进制与十六进制的转换 这种转换和二进制与八进制转换类似,只不
13、过是将十六进制一位与二进制四位相转换。1)二进制转十六进制 取四合一法,即从二进制的分界点(小数点)向左(向右)每四位取成一位,将这四位二进制按权相加,得到的数就是一位十六进制数,然后,按顺序进行排列,小数点的位置不变,得到的数即是十六进制数。如果无法凑足四位,则补0凑足四位。如将二进制数101011.101转换为十六进制,转换方式,如图所示。2.1.5 进制转换2.1 Java的基本语法在图中,先从小数点开始每四位取成一位,不足补0,将四位二进制按权相加,所得数按顺序读取值为2B.A,即是二进制101011.101的十六进制值。二进制与十六进制的转换 2)十六进制转二进制 取一分四法,即将一
14、位十六进制数分解成四位二进制数,用四位二进制按权相加去凑这位十六进制数,小数点位置照旧。如将十六进制数6E.2转换为二进制,转换方式如图所示。2.1.5 进制转换2.1 Java的基本语法 2.1.5 进制转换二进制二进制十六进制十六进制二进制二进制十六进制十六进制00000100080001110019001021010A001131011B010041100C010151101D011061110E011171111F 二进制与十六进制转换过程中的数值的对应关系,如表所示。2.1 Java的基本语法 2.1.5 进制转换 4.八进制与十六进制的转换 这种转换不能直接转换,先将八进制(或十六
15、进制)转换为二进制,然后再将二进制转换为十六进制(或八进制),小数点位置不变。5.八进制、十六进制与十进制的转换(1)间接法,先将进制数转换为二进制,然后再将二进制转换为目标进制。(2)直接法,和二进制与十进制的转换类似。2.1 Java的基本语法2.2 基本数据类型基本数据类型2.2.1整数类型返回目录2.2.2浮点数类型2.2.3字符类型2.2.4布尔类型 Java语言中只包含8种基本数据类型,根据存储类型分为数值型、字符型和布尔型,如图所示。2.2 基本数据类型整数类型变量用来存储整数值,即数据中不含有小数或分数。在Java中,整数类型分为字节型(byte)、短整型(short)、整型(
16、int)和长整型(long)四种,四种类型所占内存空间大小和取值范围如表所示。2.2.1 整数类型2.2 基本数据类型表中列出了四种整数类型变量所占内存空间大小和取值范围。如一个byte类型的变量会占用1个字节大小的内存空间,存储的值必须在-2727-1之间的整数。将一个超出int取值范围的整数值赋给long变量,系统不会自动把这个整数值当成long类型来处理。此时必须声明long型常量,即在整数值后面添加l或L字母。如果整数值未超过int型的取值范围,则可以省略字母l或L。在Java中直接给出一个整型值,其默认类型就是int类型。使用中通常有两种情况,具体如下。2.2.1 整数类型2.2 基
17、本数据类型(1)直接将一个在byte或short类型取值范围内的整数值赋给byte或short变量,系统会自动把这个整数当成byte或short类型来处理。浮点数类型变量用来存储实数值。在Java中,浮点数分为两种:单精度浮点数(float)和双精度浮点数(double)。Java的浮点数遵循IEEE 754标准,采用二进制数据的科学计数法来表示。浮点数类型所占内存空间大小和取值范围,如表所示。2.2.2 浮点数类型2.2 基本数据类型类型类型占用空间占用空间取值范围取值范围float32位(4字节)-3.410383.41038double64位(8字节)-1.79103081.791030
18、8表中列出了两种浮点数类型变量所占内存空间大小和取值范围。如一个float类型的变量会占用4B的内存大小,存储的值必须在-3.4*10383.4*1038。在Java中,使用浮点型数值时,默认的类型是double类型,在数值后面可加上d或D,作为double类型的标识。在数值后面加上f或F,则作为float类型的识别。若没有加上,Java就会将该数据视为double类型,而在编译时候就会发生错误,提示可能会丢失精确度。具体示例如下。2.2.2 浮点数类型2.2 基本数据类型 字符型变量用来存储单个字符,字符型值必须使用英文半角格式的单引号“”括起来。Java语言使用char表示字符型,占用2B
19、内存空间,取值范围为065535的整数。Java语言采用16位Unicode字符集编码,为每个字符制定一个统一并且唯一的数值,支持中文字符。具体示例如下。2.2.3 字符类型2.2 基本数据类型 布尔类型变量用来存储布尔类型的值,布尔类型的值只有true(真)和false(假)两种。Java的布尔类型用boolean表示,占用1B内存空间。具体示例如下。2.2.4 布尔类型2.2 基本数据类型2.3 变量与常量变量与常量返回目录2.3.1变量的定义2.3.2变量的类型转换2.3.3变量的作用域2.3.4常量 在程序执行过程中,其值不能被改变的量称为常量,其值能被改变的量称为变量。变量与常量在编
20、写程序中需要经常使用,本节将详细介绍变量与常量的使用方法。2.3 变量与常量如需声明多个相同类型变量时,可使用下面的语法格式。2.3 变量与常量2.3.1 变量的定义 变量的使用是程序设计中一个十分重要的环节,定义变量就是告诉编译器这个变量的数据类型,这样编译器才知道需要配置多少内存空间给它,以及它能存放什么样的数据。在程序运行过程中,空间内的值是变化的,这个内存空间就称为变量。为了便于操作,给这个空间取个名字,称为变量名。变量的命名必须是合法的标识符。内存空间内的值就是变量值,在声明变量时可以不赋值,也可以直接赋给初值。声明变量的语法格式如下:接下来,通过具体的代码学习变量的定义,具体示例如
21、下。2.3.1 变量的定义2.3 常量与变量 对于变量的命名并不是任意的,应遵循以下4条规则。(1)变量名必须是一个有效的标识符。(2)变量名不可以使用Java关键字。(3)变量名不能重复。(4)应选择较有意义的单词作为变量名。Java的数据类型在定义时就已经明确了,但程序中有时需要进行数据类型的转换,Java允许用户有限度地进行数据类型转换。数据类型转换方式分为自动类型转换和强制类型转换两种。1.自动类型转换 自动类型转换也称隐式类型转换,指两种数据类型转换过程中不需要显式地进行声明。Java会在下列的条件成立时,自动做数据类型的转换。(1)转换的两种数据类型彼此兼容。2.3.2 变量的类型
22、转换2.3 常量与变量(2)目标数据类型的取值范围比原类型大。类型转换只限该行语句,并不会影响原先定义的变量类型,而且自动类型转换可以保持数据的精确度,不会因为转换而丢失数据内容。Java支持自动类型转换的类型,如图所示。2.3.2 变量的类型转换2.3 常量与变量自动类型转换示例说明如下。2.3.2 变量的类型转换2.3 常量与变量在Java中,任何基本类型的值和字符串进行连接运算“+”时,基本类型的值将自动类型转换为字符串类型,字符串用String类表示,是引用类型。具体示例如下。2.强制类型转换 强制类型转换也称为显式转换,指两种数据类型转换过程中需要显式地进行声明。当转换的两种数据类型
23、彼此不兼容,或者目标数据类型的取值范围小于原类型时,而无法进行自动类型转换时,就需要进行强制类型转换。打开Eclipse开发工具,新建一个Java项目,在src根目录下新建一个test包。并在该包下新建TestTypeCast测试类,如例所示。2.3.2 变量的类型转换2.3 常量与变量 程序的运行结果如图所示。2.3.2 变量的类型转换2.3 常量与变量 在图中,由控制台中打印的结果可以看出运行代码时出现了编译错误,提示第5行代码类型不兼容,出现这样错误的原因是将int转换到byte时,int类型的取值范围大于byte类型的取值范围,转换会导致精度损失,也就是用1B的变量来存储4B的变量值。
24、对第5行代码进行强制类型转换,修改为下面的代码:程序的运行结果如图所示。2.3.2 变量的类型转换 当试图强制把取值范围大的类型转换为取值范围小的类型时,将会引起溢出,从而导致数据丢失。图中运行结果为-128,出现这种现象的原因是,int类型占4B,byte类型占1B,将int类型变量强制转换为byte类型时,Java会将int类型变量的3个高位字节截断,直接丢弃,变量值发生了改变,如图所示。2.3 常量与变量 变量的作用域是指它的作用范围,只有在这个范围内,程序代码才能访问它。变量声明在程序中的位置决定了变量的作用域。变量一定会声明在一对大括号中,该大括号所包含的代码区域就是这个变量的作用域
25、,下面通过一个示例来分析变量的作用域。如例所示。2.3.3 变量的作用域2.3 常量与变量 程序的运行结果如图所示。2.3.3 变量的作用域2.3 常量与变量 在图中,由控制台中打印的结果可以看出运行代码时出现了编译错误,提示“找不到符号”。报错的原因在于:第8行代码中的变量y超出了其作用域。将第8行代码放置在第6行代码之后,再次编译程序不再报错,程序的运行结果如图所示。常量就是一个固定的值,是不能被改变的数据。Java程序中使用的直接量称为常量,是在程序中通过源代码直接给出的值,在整个程序执行过程中都不会改变,也称最终量。2.3.4 常量2.3 常量与变量1.整型常量 整型常量是整数类型的数
26、据,可分为二进制、八进制、十进制和十六进制4种:(1)二进制:由数字0和1组成,用0b或0B开头的字面值,如0b110、0B110。(2)八进制:由数字0,7组成,用0开头的字面值,如0110。(3)十进制:由数字0,9组成的字面值,如110。(4)十六进制:由数字09和字符A,F组成,用0 x或0X开头的字面值,如0 x12、0XAbA。2.浮点数常量 浮点数就是实数,包含有小数点,可以用标准小数形式和科学计数法形式两种方式表示,具体表示如下:(1)标准小数:由整数部分、小数点和小数部分构成,如1.5、2.2。(2)科学计数法:由一个标准式加上一个以10为底的幂构成,两者间用e或E隔开,如1
27、.2e+6、5E-8。在Java中,分为float单精度浮点数和double双精度浮点数两种类型,单精度浮点数以f或F结尾,双精度浮点数以d或D结尾。不加后缀会默认为双精度浮点数。2.3.4 常量2.3 常量与变量 3.字符常量 字符常量有三种形式,具体表示如下:(1)用单引号括起来的字符,如a、0。(2)转义字符,如n、t、0。(3)用Unicode值表示的字符,格式是uXXXX,其中XXXX代表一个十六进制的整数,如u0000。2.3.4 常量2.3 常量与变量 4.字符串常量 字符串常量就是用双引号括起来的字符序列,如欢迎学习Java、A。2.3.4 常量2.3 常量与变量 5.布尔常量
28、 布尔常量就是布尔类型的两个值true和false,用于表示真和假。6.null常量 null常量只有一个值null,表示对象引用为空。多学一招:转义字符多学一招:转义字符 Java定义了一种特殊的标记来表示特殊字符,这种标记称为转义序列,转义序列由()后面加上一个字符或者一些数字位组成。如t表示Tab字符的转义符,u000A表示换行符n。转义序列中的序列号作为一个整体翻译,而不是分开翻译。一个转义序列被当做一个字符。常用的转义序列如下。(1)b,退格键,Unicode码为u0008。(2)t,Tab键,Unicode码为u0009。(3)n,换行符,Unicode码为u000A。(4)r,回
29、车符,Unicode码为u000D。反斜杠被称为转义字符,它是一个特殊字符。有特殊意义的字符,无法直接表示,需要用转义序列来表示。(1),单引号字符,Java中单引号表示字符的开始和结束,直接写单引号字符(),编译器会匹配前两个是一对,会报错,所以需要使用转义字符。2.3.4 常量2.3 常量与变量(2),双引号字符,Java中双引号表示字符串的开始和结束,要显示双引号需要使用转义字符,如欢迎学习Java。(3),反斜杠字符,Java中的反斜杠是转义字符,要显示反斜杠,需要使用转义字符。2.3.4 常量2.3 常量与变量2.4 Java中的运算符中的运算符2.4.1算术运算符返回目录2.4.2
30、赋值运算符2.4.3关系运算符2.4.4逻辑运算符2.4.5位运算2.4.6运算符的优先级2.4 Java中的运算符 程序是由许多语句组成的,而组成语句的基本单位就是表达式与运算符。Java提供了很多的运算符,这些运算符除了可以处理一般的数学运算外,还可以做逻辑运算、位运算等。根据功能的不同,运算符可以分为算术运算符、赋值运算符、关系运算符、逻辑运算符和位运算符。算术运算符在数学上经常会用到。Java中算术运算符主要用于进行基本的算术运算,如加法、减法、乘法、除法等。Java中的算符运算符及其使用范例,如表所示。2.4.1 算术运算符2.4 Java中的运算符 算术运算符中有些特殊的运算符,使
31、用时需要特别注意。1.除法运算符/(1)若除法运算符的两个操作数都是整型,则计算结果也是整型,除数不能为0。(2)若除法运算符的两个操作数只要有一个是浮点数,则计算结果也是浮点数。2.4.1 算术运算符2.4 Java中的运算符2.取模运算符%取模运算符也称取余运算符,运算得到的是除法运算的余数。运算结果的正负取决于被取模数(被除数)的符号,与模数(除数)的符号无关。2.4.1 算术运算符2.4 Java中的运算符3.+、-:自增、自减运算符(1)自增、自减运算符是单目运算符,即只有一个操作数。(2)操作数只能是变量,不能是常量或表达式。根据所放位置不同,分为前缀和后缀,运算规则:前缀,先算后
32、用;后缀,先用后算。2.4.1 算术运算符2.4 Java中的运算符2.4.2 赋值运算符 赋值运算符用于为变量指定值,不能为常量或表达式赋值。当赋值运算符两边的数据类型不一致时,使用自动类型转换或强制类型转换原则进行处理。Java中的赋值运算符和使用范例如表所示。2.4 Java中的运算符2.4.2 赋值运算符 赋值语句的结果是将表达式的值赋给左边的变量。具体示例如下:除了=运算符外,其他都是扩展赋值运算符,编译器首先会进行运算,再将运算结果赋值给变量。具体示例如下。变量在赋值时,如果两种类型彼此不兼容,或者目标类型取值范围小于原类型时,需要进行强制转换。而使用扩展运算符赋值时,强制类型转换
33、将自动完成,不需要显式声明强制转换。2.4 Java中的运算符2.4.2 赋值运算符 变量在赋值时,如果两种类型彼此不兼容,或者目标类型取值范围小于原类型时,需要进行强制转换。而使用扩展运算符赋值时,强制类型转换将自动完成,不需要显式声明强制转换。具体示例如下。2.4 Java中的运算符 关系运算符即比较运算符,用于比较两个变量或常量的大小,比较运算的结果是一个布尔值,即true或false。Java中的关系运算符和使用范例,如表所示。2.4.3 关系运算符2.4 Java中的运算符 使用关系运算需要特别注意,除=运算符之外,其他关系运算符都只支持左右两边的操作数都是数值类型的情况。只要进行比
34、较的两个操作数是数值类型,不论它们的数据类型是否相同,都能进行比较。基本类型变量、常量不能和引用类型的变量、常量使用=进行比较。boolean类型的变量、常量不能与其他任意类型的变量、常量使用=比较。如果引用类型之间没有继承关系,也不能使用=进行比较。具体示例如下。2.4.3 关系运算符2.4 Java中的运算符 逻辑运算符用于操作两个布尔型的变量和常量,其结果仍是布尔类型值。Java中的逻辑运算符和使用范例,如表所示。2.4.4 逻辑运算符2.4 Java中的运算符2.4.4 逻辑运算符2.4 Java中的运算符 有些逻辑运算符有其独特的用法,使用时需要特别注意,具体如下。1.&、&运算符&
35、和&运算符都表示与操作,运算符前后的两个操作数的值皆为true,运算的结果才会为true,否则为false。两者在使用上有一定的区别:使用&运算符,要求对运算符前后的两个操作数都进行判断;而使用&运算符,当运算符前面的操作数的值为false,则其后面的操作数将不再判断,因此&被称为短路与,如例所示。2.4.4 逻辑运算符2.4 Java中的运算符2.4.4 逻辑运算符2.4 Java中的运算符 程序的运行结果如图所示。2.4.4 逻辑运算符2.4 Java中的运算符 在例中,定义了整型变量i和j,并初始化为0。第6行代码中使用&运算符,运算符左边值为false,此时无论右边表达式的结果是什么,
36、整个表达式的值都为false。由于&运算符的两边的操作数都会运算,所以执行表达式+i0后,i的值为1。与之相对应的第10行代码,使用&运算符,运算符左边值为false,右边的表达式将不再运算,因此变量j的值仍为0。2.|、|运算符|和|运算符都表示或操作,运算符前后的两个操作数的值只要有一个为true,运算结果就会为true,否则为false。两者在使用上也有一定的区别:当使用|运算符,要求对运算符前后的两个操作数都进行判断;而使用|运算符,当运算符前面的操作数的值为true,则其后面的操作数将不再判断,因此|被称为短路或。如例所示。2.4.4 逻辑运算符2.4 Java中的运算符程序的运行结
37、果如图所示。2.4.4 逻辑运算符2.4 Java中的运算符例中,定义了整型变量i和j,并初始化为0。第6行代码中使用|运算符,运算符左边值为true,此时无论右边表达式的结果是什么,整个表达式的值都为true。由于|运算符的两边的操作数都会运算,执行表达式+i0后,i的值为1。与之相对应的第9行代码,使用|运算符,当前面表达式为true,后面表达式将不再运算,因此变量j的值仍为0。3.运算符表示异或运算符,两个操作数结果相同则为false,两个操作数结果不同则为true。位运算操作是指进行二进制位的运算,Java中的位运算符和使用范例如表所示。2.4.5 位运算2.4 Java中的运算符2.
38、4.5 位运算2.4 Java中的运算符位运算符只能操作整数类型的变量或常量。位运算的运算法则具体如下。1.&按位与运算符,参与按位与运算的两个操作数相对应的二进制位上的值同为1,则该位运算结果为1,否则为0。例如,将byte型的常量12与6进行与运算,12对应二进制为0000 1100,6对应二进制为0000 0110,具体演算过程如下所示。2.4.5 位运算2.4 Java中的运算符运算结果为0000 0100,对应数值4。2.|按位或运算符,参与按位或运算的两个操作数相对应的二进制位上的值有一个为1,则该位运算结果为1,否则为0。例如,将byte型的常量12与6进行或运算,具体演算过程如
39、下所示。2.4.5 位运算2.4 Java中的运算符运算结果为0000 1110,对应数值14。3.取反运算符为单目运算符,即只有一个操作数,二进制位值为1,则取反值为0;值为0,则取反值为1。例如,将byte型的常量12进行取反运算,具体演算过程如下所示。2.4.5 位运算2.4 Java中的运算符运算结果为1111 0011,对应数值-13。4.按位异或运算符,参与按位异或运算的两个操作数相对应的二进制位上的值相同,则该位运算结果为0,否则为1。例如,将byte型的常量12与6进行异或运算,具体演算过程如下所示。2.4.5 位运算2.4 Java中的运算符运算结果为0000 1010,对应
40、数值10。5.右移运算符,将操作数的二进制位整体右移指定位数,右移后左边空位以符号位填充,右边移出去的舍弃,即如果第一个操作数为正数,则左空位补0;如果第一个操作数为负数,则左空位补1。例如,将byte型的常量12与-12(二进制码为1111 0100)分别进行右移3位运算,具体演算过程如下所示。2.4.5 位运算2.4 Java中的运算符运算结果分别为0000 0001和1111 1110,对应数值分别为1和-2。7.无符号右移运算符,将操作数的二进制位整体右移指定位数,右移后左边空位补0,右边移出去的舍弃。例如,将byte型的常量12与-12(二进制码为1111 0100)分别进行无符号移
41、3位运算,具体演算过程如下所示。2.4.5 位运算2.4 Java中的运算符运算结果分别为0000 0001和0001 1110,对应数值分别为1和30。进行位移运算遵循如下规则。(1)对于低于int类型(byte、short和char)的操作数总是先自动转换为int类型后再位移。(2)对于int类型的位移,当位移数大于int位数32时,Java先用位移数对32求余,得到的余数才是真正的位移数。例如,a33和a1的结果完全一样,而a32的结果和a相同。(3)对于long类型的位移,当位移数大于long位数64时,Java先用位移数对64求余,得到的余数才是真正位移数。2.4.5 位运算2.4
42、Java中的运算符对于低于int类型的操作数进行无符号位移时,需要注意,如果操作数是负数,在自动转换过程中会发生截断,数据丢失,导致位移结果不正确。如例所示。2.4.5 位运算2.4 Java中的运算符程序的运行结果如图所示。图中,分别对int和byte常量-12进行无符号位移操作,其结果不相同,出现这样现象的原因在于:在对byte变量进行位移操作时会先自动转换为int型再位移,-12的二进制码为1111 0100,自动转换为int后的二进制码为1111 1111 1111 1111 1111 1111 1111 0100,无符号右移3位为0001 1111 1111 1111 1111 11
43、11 1111 1110(即536870910),再强制转换为byte类型,数据被截断为1111 0100,即-2。具体演算过程如下所示:2.4.5 位运算2.4 Java中的运算符 优先级就是在表达式运算中的顺序,运算符有不同的优先级。运算符的运算顺序称为结合性,Java大部分运算符是从左向右结合的,只有单目运算符、赋值运算符和三目运算符是从右向左运算的。表列出Java中运算符的优先级,数字越小优先级越高,如表所示。2.4.6 运算符的优先级2.4 Java中的运算符2.4.6 运算符的优先级2.4 Java中的运算符 不要过多依赖运算符的优先级来控制表达式的执行顺序,而应使用()来控制表达
44、式的执行顺序。过于复杂的表达式,应分成几步来完成。2.5 程序的结构程序的结构2.5.1顺序结构返回目录2.5.2选择结构2.5.3循环结构2.5.4循环中断 一般来说程序的结构分顺序结构、选择结构和循环结构三种,这三种不同的结构有一个共同点,就是它们都只有一个入口,也只有一个出口。这些单一入口、单一出口的结构可以让程序易读、好维护,也可以减少调试的时间。下面将详细介绍这三种不同的程序结构。2.5 程序的结构 结构化程序中最简单的结构就是顺序结构。顺序结构是按照程序语句出现的先后顺序一句一句地执行,直到程序结束。顺序结构执行流程,如图所示。2.5.1 顺序结构2.5 程序的结构 在日常生活中,
45、大家经常能遇到需要进行选择的场景,例如,在利用提款机提款时,会进入到选择取款金额的画面,用户可以根据个人需求选择提取不同的金额,提款机根据用户的选择给出相应的金额,其程序的流程就是利用条件选择语句设计而成的。选择结构也称分支结构,是根据条件的成立与否决定要执行哪些语句的一种结构。选择结构执行流程,如图所示。2.5.2 选择结构2.5 程序的结构 Java提供了两种分支结构语句:if语句和switch语句。其中,if语句使用布尔表达式或布尔值作为分支条件来进行分支控制;而switch语句用于对多个整数值进行匹配,从而实现多分支控制。1.if语句 if条件语句是一个重要的编程语句,用于告诉程序在某
46、个条件成立的情况下执行某段语句,而在另一种情况下执行另外的语句。关键字if之后是作为条件的“布尔表达式”,如果该表达式返回的结果为true,则执行其后的语句;若为false,则不执行if条件之后的语句。其语法格式如下。2.5.2 选择结构2.5 程序的结构 若if语句的主体块只有一条语句,则可以省略左右大括号。if语句的执行流程,如图所示。2.5.2 选择结构2.5 程序的结构 if语句的具体用法,如例所示。程序的运行结果如图所示。2.5.2 选择结构2.5 程序的结构 例中,首先定义了变量r并将其初始化为-2,接着执行if判断语句,判断结果为false,所以跳过if语句块继续执行,因此输出圆
47、半径-2的周长的值为0.0。执行语句r=6后,if语句的布尔表达式r=0成立,表达式结果为true,因此进入并执行if的主体语句块,最后输出圆半径6的面积为113.04。2.if-else语句 if-else语句是指满足某个条件,就执行某种处理,否则执行另一种处理。即当布尔表达式成立时,则执行if语句主体;判断条件不成立时,则执行else的语句主体,其语法格式如下:2.5.2 选择结构2.5 程序的结构 若if或else的主体语句块只有一条时,则可以省略相应的左右大括号。if-else语句的执行流程如图所示。if-else语句的具体用法,如例所示。2.5.2 选择结构2.5 程序的结构程序的运
48、行结果如图所示。2.5.2 选择结构2.5 程序的结构在例中,定义变量r并初始化为-2,执行if语句的布尔表达式,r=0不成立,表达式结果为false,则跳过if语句块不执行而执行else语句块,并打印相应提示信息。多学一招:三目运算符在Java中有一种特殊的运算符叫做三目运算符,它与if-else语句类似,具体语法如下:当判断条件成立时,执行表达式1,否则将执行表达式2。三目运算符通常用于对变量赋值。具体示例如下。2.5.2 选择结构2.5 程序的结构3.if-else if-else语句由于if语句体或else语句体可以是多条语句,所以如果需要在if-else里判断多个条件,可以“随意”嵌
49、套。比较常用的是if-else if-else语句,可用于对多个条件进行判断,进行多种不同的处理。其语法格式如下。2.5.2 选择结构2.5 程序的结构 当布尔表达式1为true时,会执行语句块1。当布尔表达式1为false时,则执行布尔表达式2,如果布尔表达式2为true则执行语句块2。以此类推,如果所有的条件都为false,则意味所有条件均未满足,那么else后面中的语句块n+1会执行。if-else if-else语句的执行流程如图所示。2.5.2 选择结构2.5 程序的结构 接下来通过一个案例来实现对学生优异成绩的划分,如例所示。2.5.2 选择结构2.5 程序的结构 程序的运行结果如
50、图所示。2.5.2 选择结构2.5 程序的结构 在例中,首先定义变量score,并初始化为58,它不满足第一个布尔表达式score=90,因此会执行第二个布尔表达式,依次类推,当所有的布尔表达式都不成立,将执行else语句块,因此打印结果E。4.switch语句 虽然嵌套的if-else语句可以实现多重选择处理,但语句较为复杂,容易将if和else匹配混淆,从而造成逻辑混乱。这种情况下,可以使用switch语句来实现多重选择的处理。switch语句只针对某个表达式的值作出判断,并做出相应的处理。其语法格式如下:2.5.2 选择结构2.5 程序的结构 使用switch语句时需要注意以下几点。(1