第三章表达式和流程控制本模块讨论变量、运算符和算术表达式并列出不同的管理运行程序路径的控制结构;第一节相关问题讨论──下列问题与本模块阐述的论题相关;-什么类型的变量对程序员有用例如,其它语言的程序员想了解Java编程语言是如何定义和处理全局变量和局部变量的--复合类可以有同名的变量吗如果可以,它们的作用域有多大--列出用于其它语言的控制结构;一般语言都采用什么方法进行流程控制和中断流程如在循环或开关语句中-第二节目标完成本模块的学习后,你应该能够:-区分实例变量和局部变量;-描述实例变量是如何被初始化的;-确认并更正编译器错误;-辨认、描述并使用Java软件运算符;-区分合法和非法原始类型赋值;-确认boolean表达式和它们在控制构造中的要求;-辨认赋值兼容性和在基本类型中的必要计算;-使用if, switch,f or,while和do句型结构和break和conti nue的标号形式作为程序中的流程控制结构;第三节表达式变量和作用域变量和作用域-局部local变量是在一个方法内定义的变量, 也被称作自动automatic、临时temporary或栈stack变量-当一个方法被执行时, 局部变量被创建;当一个方法被终止时, 局部变量被清除-局部变量必须使用之前初始化, 否则编译时将出错你已经看到了两种变量的描述方法:原始类型变量和引用类型变量;你也看到了变量被声明的位置:在方法内方法是面向对象的术语,它可引用函数或子程序,例如:main或在方法外但在类定义之内;变量也可被定义为方法参数或构造函数参数;在方法内定义的参数被称为局部local变量,有时也被用为自动automatic、临时temporary或栈stack变量;在方法外定义的变量是在使用new Xxxx 调用构造一个对象时被创建;在构造一个对象时,可创建两种变量;一是类变量,它是用stati c关键字来声明的;只要需要对象,类变量就将存在;二是实例变量,它不需用stati c关键字来声明;只要对象被当作引用,实例变量就将存在;实例变量有时也被用作成员变量,因为它们是类的成员;方法参数变量定义在一个方法调用中传送的自变量,每次当方法被调用时,一个新的变量就被创建并且一直存在到程序的运行跳离了该方法;当执行进入一个方法时,局部变量被创建,当执行离开该方法时,局部变量被取消;因而,局部变量有时也被引用为“临时或自动”变量;在成员函数内定义的变量对该成员变量是“局部的”,因而,你可以在几个成员函数中使用相同的变量名而代表不同的变量; 该方法的应用如下所示:class Ou rClass {int i; .re turn 1;} Different f rom the....return 2;运算符+ 能够进行String对象的链接并生成一个新的String:Stri ng sal utati on = "Dr. ";Stri ng name = "Jack " + "Arthur";Stri ng ti tle = salutati on + name;最后一行的结果是:Dr. J ack Arthur如果+运算符中有一个自变量为String对象,则其它自变量将被转换成Stri ng;所有对象都可被自动转换成String,尽管这样做的结果可能是意义含糊的;不是串的对象是通过使用toString 成员函数而转换成串的等价物的;右移位运算符>>和>>>右移位运算符>>和>>>算术或符号右移位如下所示:见3-13页●在移位的过程中, 符号位被拷贝逻辑或非符号右移位运算符>>>●作用于位图●在移位的过程中, 符号位不被拷贝Java编程语言提供了两种右移位运算符运算符>>进行算术或符号右移位;移位的结果是第一个操作数被2的幂来除,而指数的值是由第二个数给出的;例如:128 >> 1 give s 128/2 1= 64256 >> 4 give s 256/2 4 = 16-256 >> 4 gi ves -256/2 4 = -16逻辑或非符号右移位运算符>>>主要作用于位图,而不是一个值的算术意义;它总是将零置于最重要的位上;例如:1010 ... >> 2 give s 111010 ...1010 ... >>> 2 give s 001010 ...在移位的过程中, >>运算符使符号位被拷贝;注意──移位运算符将它们右侧的操作数模32简化为int类型左侧操作数, 模64简化为long类型右侧操作数;因而, 任何int x, x >>> 32都会导致不变的x值, 而不是你可能预计的零;注意------值得称赞的重要一点是: >>>运算符仅被允许用在整数类型, 并且仅对int和l ong值有效;如果用在short或byte值上, 则在应用>>>之前, 该值将通过带符号的向上类型转换被升级为一个int;有鉴于此,无符号移位通常已成为符号移位;左移位运算符<<左移位运算符<<128 << 1 等于12821 = 25616 <<2 等于1622 =64运算符<<执行一个左移位;移位的结果是:第一个操作数乘以2的幂,指数的值是由第二个数给出的;例如:128 << 1 giv es 12821 = 25616<<2 give s 1622=64类型转换类型转换●如果赋值的信息丢失,程序员必须采用类型转换的方法确认赋值●在short和char之间的赋值需要一个显式转型见3-16程序在赋值的信息可能丢失的地方,编译器需要程序员用类型转换typecast的方法确认赋值;例如,它可以“挤压”一个long值到一个int变量中;显式转型做法如下:long bigVal ue =99L;int squashe d =i nt bi gValue;在上述程序中,期待的目标类型被放置在圆括号中,并被当作表达式的前缀,该表达式必须被更改;一般来讲,建议用圆括号将需要转型的全部表达式封闭;否则,转型操作的优先级可能引起问题;注意──重温short 的范围是:-215至215-1;char 的范围是:0至215-1; 因而在short 和char 之间的赋值总需要一个显式转型升级和表当没有信息丢失时,变量可被自动升级为一个较长的形式如:int 至long 的升级l ong bi gval = 6; ; 4.}el se { "The re will be " + count + 6." pe ople f or l unch today.";7.} 在Java 编程语言中,i f 用的是一个布尔表达式,而不是数字值,这一点与C/C++不同;前面已经讲过,布尔类型和数字类型不能相互转换;因而,如果出现下列情况: if x 例2: colorN um { 0: ; 1: ; : ; ; 9.} 例2设定背景颜色为黑色,而不考虑case 变量col orN um 的值;如果col orNum 的值为0,背景颜色将首先被设定为红色,然后为绿色,再为黑色; 第五节 循环语句分支语句if, else 语句if 布尔表达式{语句或块; }if 条件为真 { 语句或块;} else { 语句或块;} 分支语句switch 语句switch 语句的句法是:switch expr1{case expr2:statements;break;case expr3:statements;break;default:statements; break; }循环语句使语句或块的执行得以重复进行;Java编程语言支持三种循环构造类型:for, while和do l oops;f or和while循环是在执行循环体之前测试循环条件,而do l oops是在执行完循环体之后测试循环条件;这就意味着for和while循环可能连一次循环体都未执行, 而do l oops将至少执行一次循环体;for循环for循环的句法是:f or i ni t_e xpr;boole an te stexpr; alte r_expr{state me nt or bl ock}例如:for int i = 0; i < 10; i++ {"Are y ou fi ni she d ye t";}"Finally";注意──Java编程语言允许在for 循环结构中使用逗号作为分隔符; 例如,for i= 0, j = 0; j<10; i++, j++是合法的;它将i值初始化为零,并在每执行完一次循环体后,增加一次它们的值;while循环循环语句while循环while 布尔表达式{语句或块}while循环的句法是:while布尔表达式{语句或块}例如:int i = 0;while i < 10 {"Are y ou fi ni she d ye t";i++;}"Finally";请确认循环控制变量在循环体被开始执行之前已被正确初始化,并确认循环控制变量是真时,循环体才开始执行;控制变量必须被正确更新以防止死循环;do循环循环语句do/while语句do {语句或块;}while 布尔测试do循环的句法是:do {语句或块;}while布尔测试例如:int i = 0;do {"Are y ou fi ni she d ye t";i++;} while i < 10;"Finally";象while循环一样,请确认循环控制变量在循环体中被正确初始化和测试并被适时更新;作为一种编程惯例,f or循环一般用在那种循环次数事先可确定的情况,而while和do用在那种循环次数事先不可确定的情况;第六节特殊循环流程控制特殊循环流程控制●break [标注];●continue[标注];label: 语句;下列语句可被用在更深层次的控制循环语句中:●break 标注;●continue标注;label: 语句;break语句被用来从switch语句、loop语句和预先给定了label的块中退出;continue语句被用来略过并跳到循环体的结尾;labe l可标识控制需要转换到的任何有效语句,它被用来标识循环构造的复合语句;例如loop: whil e true {for i nt i=0; i < 100; i++ {switch c = {case -1:case ` \n ` :..}} . {....while ... {if j > 10 {// jumps to the i ncreme nt porti on of// for-l oop at li ne 13continue te st;}} // e nd while} // e nd f or练习:使用表达式练习目标──你将编写、编译并运行两个使用标识符、表达式和控制结构的算法程序;一、准备为成功地完成本练习,你必须具备编译和运行Java程序的能力,并且熟悉流程控制构造;二、任务1级:创建一个阶乘应用程序一个数X的阶乘通常记作X等于XX-1X-2……1;例如4等于4×3×2×1=24;创建一个称作Factor的应用程序,利用该应用程序可打印2,4,6和10的阶乘;2级:求解一个几何题程序已知一个直角三角形,其弦最长边的长度由下列公式给出:编写一个称作hypotenuse的Java软件程序,从已知直角三角形的直角边计算最长边;提示:从mod3/templ ate s目录中提供的模板解决方案入手,从命令行输入;同时注意类;三、练习小结讨论──用几分钟的时间讨论一下在以上练习中你所获得的经验、感想和发现;经验解释总结应用四、检查你的进度在进入下一模块之前,请确认你已经能够:-区分实例变量和局部变量;-描述实例变量是如何被初始化的;-确认并更正“可能的赋值前的引用”的编译器错误;-辨认、描述并使用Java软件运算符;-区分合法和非法原始类型赋值;-确认boolean表达式和它们在控制构造中的要求;-辨认赋值兼容性和在基本类型中的必要转型;-使用if, swi tch,for,while和do句型结构和break和conti nue的标注形式作为程序的流程控制结构;五、思考题-多数编程语言都使用什么数据类型来集合相似的数据元素-你怎样对一组元素进行相同的操作如一个数组-Java编程语言使用什么数据类型-。