1、第2章JaVa基本语法通过第1章的学习,我们已经掌握了JaVa开发环境的安装、配置,并且通过例1.1学习了如何编写、编译以及运行一个最简单的Java应用程序。本章我们将学习Java编程语言的基本语法,包括变量、操作符、表达式、语句、字符串、数组、控制流以及如何使用帮助文档。在本章中,我们使用下面的编程框架:publicclassTestSketchpublicstaticvoidmain(Stringargs)/以下添加测试代码)读者如果需要测试各小节中讲解的语句,用待测试的语句覆盖编程框架中的省略号,然后编译运行即可。2.1 变量所谓变量,就是由标识符命名的数据项。每个变量都必须声明数据类型
2、变量的数据类型决定了它所能表示值的类型以及可以对其进行什么样的操作。变量既可以表示基本数据类型(如整型int、字符型char等)的数据,也可以表示对象类型(如字符串)的数据。当变量是基本数据类型时,变量中存储的是数据的值,而当变量是对象(引用)类型时,变量中存储的是对象的地址,该地址指向对象在内存中的位置,如图2.1所示。salary197employee图2.1变量示意图在图2.1中,salary是一个基本类型的变量,其中存储的值是197;而employee是一个对象类型的变量,所以其中存储的值是所指向对象在内存中的地址。注意,JaVa语言中字符类型(Char)是基本数据类型,而字符串(S
3、tring)则是对象类型。本节将介绍Java语言中的几种基本数据类型。2.1.1 基本数据类型1 .整型JaVa语言中提供了4种整型数据类型:byteShort、int和Iong,如表2.1所示。类型大小/格式描述byte8位二进制字节整型short16位二进制短整型int32位二进制整型long64位二进制长整型表2.1整型数据类型三三=三三三这4种类型都只能表示整数(包括负数),由于占用存储空间大小的不同,所能表示的数值范围也有所不同,占用空间越大,表示的范围越大。此外,在不同的平台上,相同数据类型的大小和格式均是固定的,不会改变。注意:许多语言中,基本数据类型的格式和大小与程序运行的平台
4、有关,这是产生程序跨平台困难的主要原因之一。JaVa语言中,对每种基本数据类型都限定了固定的格式和大小,因此消除了数据类型对平台的依赖性。可以这样给一个整型变量赋值:intsalary=l97;如果给一个长整型变量赋值,则在数字后面加一个L,表示该数值是长整型:longsalary=l97L;注意,读者如果需要测试上面的两条赋值语句是否正确,则可以用这两条语句覆盖编程框架TestSketch中的省略号,得到:publicclassTestSketchpublicstaticvoidmain(Stringargs)/以下添加测试代码intsalary=l97;longsalary=l97L;)然
5、后编译、运行TestSketchjava即可。2 .浮点类型浮点类型用来表示有小数的数值。浮点类型分为单精度浮点类型和双精度浮点类型两类,如表2.2所示。之所以称double为双精度,是因为double数据类型表示数据的精度是float的两倍。但是double类型的数据在运算时速度低于float,因此在精度要求不高的条件下,如果需要大量存储以及运算数据,则使用float类型。如果精度要求高,则使用double类型。表2.2浮点数据类型类型大小/格式描述float32位IEEE754规范单精度浮点类型double64位IEEE754规范双精度浮点类型double和float基本数据类型有对应的封
6、装类DOUble和Float,并且在DoUble和Float封装类中以类变量的方式定义了浮点数的3个特殊值:正无穷、负无穷和非数字。Double.POS工T工VE_工NF工N工TY(Float.PoS工T工VE_工NF工N工TY)Double.NEGATIVE_INFINITY(Float.NEGATIVE_INFINITY)Double.NaN(Float.NaN)可以为变量直接赋这些特殊的值,例如:doubleWeight=Double.POSITIVE_INFINITY;这条语句将变量weight的值置为正无穷。在JaVa编程语言中,浮点类型的数值默认为是双精度类型的,那么给单精度类型的
7、变量赋值时需要在数值后面加上F或f,以表示该数值是单精度类型的。如果使用下面的赋值语句:floatmiles=0.9;编译器将会报错,因为0.9默认为是double类型的,赋值给float类型的变量会丢失精度。正确的赋值方法应该是:floatmiles=0.9f;高等学校应用型特色规划教材或是:floatmiles=0.9F;但是给double类型的变量赋值时,可以在数值后面加上D(或d),也可以不加,例如:doublemiles=0.9;doublemiles=0.9D;doublemiles=0.9d;这些均是正确的。3 .字符类型读者可能对ASCII码都已经比较熟悉了,ASCII码的长度
8、是8位,最多只能表示128个字符,扩展的ASal编码也只能处理256个字符。因此,如果想用ASCn码来对世界上所有语言中的字符进行统一编码是不可能的。而UniCOde编码采用16位的编码方式,因此可以对65536种字符进行编码,能够容纳目前世界上已知的字符集。JaVa编程语言中所有的字符均使用Unicode编码,Unicode编码值通常用十六进制表示,如u0049是T的UIIiCode编码以表示是UniCode值,也称为转义字符。字符类型只能表示单个字符,如表2.3所示。表示字符类型的值是在字符两端加上单引号,如注意官和“g”是不同的,前者是一个字符,属于基本数据类型;后者表示的是一个字符串(
9、只是该字符串中只有一个字符),属于一个对象数据类型。表2.3字符数据类型类型大小/格式描述Char16位Unicode编码表示单个字符下面的例子是给一个字符类型的变量赋值:charkind=I;/给字符变量kind赋值T也可以给字符类型的变量直接赋Unicode编码值,例如:/给字符变量kind赋T的UniCOci编码值,等价于Charkind=I;charkind=u0049;读者还要特别注意的是一些常用的转义字符,如表2.4所示。表2.4常用转义字符转义字符含义Unicode编码值b退格uOOO8t制表u0009n硬回车uOOOar软回车uOOOd双引号u0022单引号u0027W反斜杠u
10、005c例如,要在屏幕上输出“ThiSiSaCharteSt”(双引号也要输出),如果使用语句:System,out.printIn(Thisisachartest);那么编译会通不过,因为编译器将前面一对引号作为一个字符串,后面一对引号也作为字符串,这样就产生了语法错误。这时候就要使用转义字符了,正确的语句可以是:System,out.printIn(Thisisachartest);4 .布尔类型布尔类型(boolean)的值只有两个:true或是false,分别表示真或者假,用于逻辑条件的判断。注意:在C/C+中,数值也可以充当布尔类型的值:O相当于false,非零值相当于trueo这就
11、很容易在程序中引入bug,例如下面的if语句:if(age=O)/判断age是否为O在C/C+中是可以编译运行的。但是该语句隐含了一个bug,因为不管age的实际值是什么,总是判定if语句不成立。而在JaVa中,该语句是不能编译通过的,必须使用:if(age=O)/判断age是否为02.1.2 变量JaVa编程语言中,要使用变量,必须先声明变量。按照如下方式声明变量:VariableTypeVariableName;例如:intlength;floatmiles;booleanflag;JaVa语言中,通过变量名来引用变量的值。因此必须给每个变量定义合法的变量名。变量名的定义必须符合以下几条规
12、则: 变量名是由Unicode字母或是数字组成的不间断序列(中间不能有空格),长度不限,并且必须以字母开头。 变量名不能是系统关键字(如int)、布尔值(true或false)或保留字(null)。 在相同的作用域内(参看2.1.3小节),不能重复声明同一变量名。注意:由于Unicode字符集非常庞大,当需要判断一个字符是否可以用作变量名的起始字母时,使用CharacterjsJavaIdentifierStart(Char),如果返回值为true,表示该字符可以作为变量名的字母;要判断一个字符是否可以作为变量名的组成部分,使用CharacterjsJavaIdentifierPart(Cha
13、r)o高等学校应用型特色规划教材习惯上,变量名以小写的字母开头,类名以大写的字母开头。如果变量名称由多个单词组成,那么首单词的字母全部小写,后续所有单词的首字母大写,其余部分小写,例如:mySalaryThisYearo变量名是区分大小写的,例如mySalary和mysalary就是不同的变量。建议不要同时声明类似的容易混淆的变量。2.1.3 变量的作用域变量总是在一定的区域内起作用,这个区域就是变量的作用域。实际上,在定义变量时,变量的作用域就随之确定了,变量的作用域与变量定义所处的位置是密切相关的。这里为了比较全面地介绍变量作用域的概念,涉及类以及异常处理的概念(详细内容请参阅后续章节)。
14、初学者可以暂时忽略关于类成员变量和异常处理参数变量作用域的介绍(图2.2中的和),重点掌握方法参数变量和局部变量的作用域(图2.2中的、和)。在介绍作用域之前,有必要了解一下块(block)的概念。块是用一对花括号“”括起来的任意数量的JaVa语句,块允许嵌套。例如图2.2中所示的区域就是一个块,称为方法块;同样区域也是一个块,称为类块。和也均是一个代码块。变量定义所在的位置决定了变量的作用域,根据变量定义所在的位置不同,可以分为以下4类: 类成员变量。 局部变量。 方法参数变量。 异常处理参数变量。类成员变量的作用域是整个类块。图2.2中,中的任何地方均可以使用变量ao编程人员可以在一个块中
15、声明局部变量,例如类ScopeDemo中的变量C和f都是局部变量。局部变量的作用域是从该变量的声明处起至所在块的结束。例如变量c的作用域是块,即变量c在块内都是有效的;而同样是局部变量的f的作用域是块,作用域要比变量C小。方法参数变量是用来传递参数值到方法中去的,它的作用域是所在方法的整个方法块。例如类ScopeDemo中的方法参数变量b,其作用域是整个方法块。异常处理参数变量类似于方法参数变量,只是其作用域仅限于捕获异常的catch块。例如类ScopeDemo中的异常处理参数变量e,其作用域仅限于块。下面的一段代码是变量作用域实例,请读者阅读后结合本节内容指出代码中几处访问变量出错的原因。例
16、2.1ScopeDemojava类ScopeDemo的类成员变量a,在类块publicclassScopeDemo图2.2变量作用域示意图publicclassScopeDemointa=50;publicvoidadd(intb)System,out.printIn(八);/正确System,out.printIn(b);/正确System,out.printIn(c);/错误intc=100;tryintc;/错误System,out.printIn(b);/正确System,out.printIn(c);/正确intf=200;System,out.printIn(f);/正确catch
17、Exceptione)System,out.printin(e.toString();/正确System,out.printIn(b);/正确System,out.printIn(c);/正确System,out.printIn(c);/正确System,out.printIn(f);/错误System,out.printin(e.toString();/错误System,out.printIn(b);/正确System,out.printIn(八);/正确2.1.4 变量的初始化变量在声明后,可以通过赋值语句对其进行初始化。初始化后的变量仍然可以通过赋值语句赋以其他不同的值。例如:doub
18、lesalary;/变量声明salary=200d;/初始化赋值salary=400d;/重新赋值,但不是初始化变量还可以声明及初始化同时进行:doublesalary=200d;/变量声明的同时进行初始化需要注意的是,给变量赋值类型必须要匹配,即变量的数据类型要和所赋值的数据类型一致。高等学校应用型特色规划教材V注意:方法参数变量和异常处理参数变量不能以上述方式来进行赋值与初始化。这两种类型的变量值是在方法调用或是抛出异常时传递进来的。Java语言中还有一种特殊的final类型的变量,称作常量。final类型的变量在初始化后就不能再重新对其赋值,常用于表示一些固定不变的值。使用final关键
19、字来定义常量的例子如下:finaldoublePI=3.1415926;/声明并初始化一个常量PI=3.14;/出错,不能修改已经初始化的常量的值PI被定义为一个常量,并初始化为3.1415926,以后在程序的任何地方都不能改变PI的值。有的时候会存在这样一种情形:我们需要一个常量,但是在声明它的时候还不能确定其值是多少。这时候,可以使用滞后初始化的方法,即声明常量时不进行初始化,在适当的时候再初始化。例如:finaldoubleACONSTANT;/声明,未初始化A_CONSTANT=0.9;/滞后初始化同样,该变量一旦初始化后,值也不允许修改。R注意:常量一旦初始化,不能对其重新赋值。习惯
20、上,常量名中所有的字符均大写。2.2操作符操作符可以对若干个操作数进行特定的运算。根据操作符需要操作数的不同,可以将操作符分为以下3类: 一元操作符。 二元操作符。 三元操作符。一元操作符只能对一个操作数进行运算。一元操作符可以用两种形式表述:前缀式和后缀式。前缀式是指操作符在前,操作数在后,例如:+a;+是一元操作符,a为操作数。后缀式正好相反,操作符在后,操作数在前,例如:a+;二元操作符对两个操作数进行运算。力(+)、减(一)、乘(*)、除(/)、求模()以及赋值(二)都是二元操作符。例如:a=7+8;二元操作符“+”对7和8这两个操作数进行运算得到结果15o二元赋值操作符“一再对15和
21、a这两个操作数进行运算,结果就是将a赋值为15oJava语言中还有一个特殊的三元操作符,对3个操作数进行运算。一般表示形式为: ondition?result1:result2;如果第一个操作数condition的值为true,那么取值result1;反之取值result20例如:min=xy?y:x;最终,min的值为X与y中较小的值。Q注意:三元操作符中的第一个操作数必须为布尔类型的值。下面按照操作符的功能分别加以分类讲解。2.2.1 算术操作符三三=三三三加(+)、减(一)、乘(*)、除(/)、求模()是JaVa编程语言中提供的算术操作符。算术操作符只能对浮点型和整型数据类型的操作数进行
22、运算。算术操作符的功能如表2.5所示。表2.5算术操作符操作符使用方法功能描述+x+y将X和y的值相加-y从X中减去y*x*y将X和y相乘/x/yX除以y%x%yX模y例如:intx;/变量声明x=100+50;/赋值,该语句执行完毕后,X的值为150x=x+100;/赋值,该语句执行完毕后,X的值为250还可以使用如下语句对变量进行赋值:x+=100;它等价于:x=x+100;操作符赋值运算时的简捷形式+=-=*二/=%二表2.6算术操作符用于赋值运算时的简捷形式每个算术操作符在用于赋值运算时可以有其对应的简捷形式,如表2.6所示。高等学校应用型特色规划教材在应用程序开发过程中,经常会用到的
23、是让一个变量加1或是减1(例如在循环中)。当然可以使用如下语句:i=i+l;或是:i+=l;但Java语言中提供了一种更加简捷的操作符,称为递增操作符(+)和递减操作符L)。因此,要让一个变量i加1,可以使用:i+;或是:+i;同样,让一个变量i减I,可以使用:i-;或是:-i;如前所述,i+是后缀方式,+i是前缀方式。虽然这两种方式最终都会使i的值加1,但还是存在不同之处的。下面的这段代码说明了它们的区别:inta=100;intb=100;intc=+a;/a先增加1,然后将a的值赋给Cintd=b+;/先将b的值赋给d,然后b的值再增加1System,out.printIn(a=+a);
24、System,out.printin(b=+b);System,out.printIn(c=+c);System,out.printin(d=+d);观察这段代码的输出结果,可以发现a、b、C和d的值分别为101、101、101、IO0。也就是说,a和b的值确实都增加了1。但是C和d的值为何不同呢?由于前缀方式的自增操作符是“先增加,后使用”,而后缀方式的自增操作符是“先使用,后增加”。这就产生了C和d值不同的结果。同样自减操作符具有类似的性质。y注意:由于自增(自减)操作符的特性,除了在循环中用于循环变量的自增(自减)操作,其他容易产生歧义的代码中尽量不要使用。2.2.2 关系与条件操作符三
25、三=三三三关系操作符是二元操作符,用于比较两个操作数的值并确定它们之间的关系,关系操作符的运算结果是一个布尔值。JaVa编程语言中共有6个关系操作符,如表2.7所示。表2.7关系操作符关系操作符使用方法功能描述xy若X大于y,取值true;否则取值false=x=y若X大于或是等于y,取值true;否则取值falsexy若X小于y,取值true;否则取值false=100的值为true。关系操作符在程序中经常和条件操作符联合使用,用作条件判断以控制程序的执行流程。JaVa语言中提供了6种条件操作符(见表2.8),条件操作符只能对布尔类型的操作数进行运算,并且运算结果也是布尔类型的值。表2.8条
26、件操作符条件操作符使用方法功能描述&x&y“条件与“:X和y均为true,取值true;否则取值falseIlly条件或:X和y至少有一个为true,取值true;否则取值false!x非:X为false,取值true;否则取值false&x&y“与”:X和y均为true,取值true;否则取值falseIy“或”:X和y至少有一个为true,取值true;否则取值falseAxy“异或”:X和y值相异,取值true;否则取值false观察表2.8,可以发现&和&都需要两个操作数的值均为true时,才取值true0但是这两个操作符还是有区别的,例如:(xy)&(xz);如果xy的值是false
27、那么xz的值将不再计算,(xy)&(xz)直接取值false;而:(y)&(z);即使xy的值是false,但xz的值仍需计算,尽管xz的值已经不会影响xy&xz的结果。这就是为什么称&为“条件与”的理由:只有在满足第一个操作数的值为true的条件下,才计算第二个操作数的值。类似的区别还存在于“|和之间。下面的几个例子说明了条件操作符的应用:高等学校应用型特色规划教材!(43)(43)a(56)(34)&(65)(43)II(56)(34)&(65)(43)I(56)/值为false;/值为true;/值为false;65的值不需计算/值为true;56的值不需计算/值为false;5的值仍
28、需计算/值为true;56的值仍需计算V注意:在操作数为布尔类型时,操作符&、I和八是作为条件操作符。但是当操作数为数值类型时,操作符&、I和八是作为位操作符,见2.2.3小节。2.2.3 位操作符在计算机内部,数据是以二进制编码存储的,Java编程语言允许我们对这些二进制编码进行位运算,位操作符如表2.9所示。表2.9位操作符位操作符使用方法功能描述&x&yX和y按位进行与运算IXIyX和y按位进行或运算AxyX和y按位进行异或运算-XX按位进行非运算xy将X的二进制编码右移y位xy将X的二进制编码左移y位xy将X的二进制编码右移y位三三三=三三例如,如的编码是Il00,7的编码是0111,
29、那么:12&7;/结果的二进制编码为OlO0,对应的值为412|7;/结果的二进制编码为1111,对应的值为15127;/结果的二进制编码为1011,对应的值为11因为:110011001100&0H1IOln八Olll0100Illl1011如果对12进行移位操作:122;/结果的二进制编码为11,对应的值为372;/结果的二进制编码为IIlO0,对应的值为28V注意:和都是右移操作符,但是两者是有区别的。使用时,前面的位填0;而使用时,前面填充的是符号位。2.2.4 其他类型操作符除了上面介绍的操作符外,JaVa还提供了如下类型的操作符,如表2.10所示。表2.10其他类型的操作符操作符功
30、能描述声明、创建数组以及访问数组中的特定元素访问类成员变量、实例成员变量(参数)定义、调用方法(数据类型)强制类型转换new创建对象、数组instancef判断一个对象是否为一个类的实例这里只对这些操作符的功能进行简单介绍,更多内容请参见相关章节。1 .操作符操作符口用于声明、创建数组。还可用于访问数组中的特定元素。例如:doublesalary=newdouble20;其中第一个口操作符声明salary是一个数组,而第二个口操作符创建一个可以存储20个double类型数据的数组。再如下面这条语句:salary0=22.2;上面这条语句中的口操作符用于访问数组中特定位置(这里是第一个元素,Ja
31、Va语言中数组标号是从。开始的,依次递增)的数组元素,这里是将数组Salary中的第一个元素赋值为22.2。1.1. 作符.操作符用于访问类的类变量、对象的实例变量或方法。3 .(参数)操作符操作符(参数)用于声明或是调用一个方法。4 .(数据类型)操作符操作符(数据类型)称为转型(CaSt),将一种数据类型转化为另一种数据类型。例如:doublesalary=23.45;intintSalary=(int)salary;高等学校应用型特色规划教材这样,通过将double型的salary强制转换成int型的intSalary,intSalary的值是230y注意:()除了用作操作符的功能外,还
32、可在表达式中用来指示操作数运算的执行顺序。5 .new操作符new操作符用于创建对象,例如:StringaString=newString(Thisisastring);6 .instanceOf操作符instancef操作符的用法是:anbjectinstanceOfaClass用于判断对象a110bject是否为类aClass的一个实例,返回的是布尔类型的值。2.2.5数字类型转换在实际的应用开发过程中,常常会需要在数字类型之间进行转换。一方面,使用算术操作符对数字进行运算时,系统在适当的时候会自动进行数字类型的转换;另一方面,程序开发人员还可以显式地进行数字类型之间的强制类型转换。1 .
33、自动数字类型转换下面的代码片段会输出133.34:intx=100;doubley=33.34;System.out.printin(x+y);实际上,在运算过程中,X首先被自动转换成double数据类型,然后再进行相加,得到一个double类型的运算结果。因此,上述代码片段中,如果把x+y的值赋给一个整型变量,编译器就会报错。例如:intx=100;doubley=33.34;intc=x+y;/错误,不能将一个CloUbI类型的值赋给int类型的变量三三=三三三使用算术操作符进行运算时,得到的数值类型取决于操作数的类型。在需要时,操作数会自动进行数据类型的转换,如表2.11所示。表2.11
34、算术运算返回值类型与操作数类型之间的关系算术运算结果数据类型操作数数据类型double至少有一个操作数是double类型float至少有一个操作数是float类型,并且没有操作数是double类型int操作数中没有float和double数据类型,也没有long数据类型long操作数中没有float和double数据类型,但至少有一个是long数据类型2 .强制类型转换虽然系统在需要的时候会自动进行数字类型的转换,但有的时候,我们希望能够主动将一种数据类型转换为另一种数据类型。这时候就可以使用显式的强制类型转换,也称为转型(CaSt)。例如要知道一个double类型数据的整数部分的值是多少:d
35、oublesalary=103.34;intintSalary=(int)salary;/intSalary的值为103这样的结果是把salary小数部分的值截去,然后把整数部分的值赋给整型变量mtSalaryo需要注意的是,在不同数值类型之间转换是有可能丢失信息的。例如将一个long类型的数值强制转化为int类型时,如果该IOng类型的值在int类型所能表示的范围之外,那么就不能进行正确的转换了。图2.3给出了数字类型之间的合法转换,该图中的实线箭头表示的转换不会丢失信息;虚线箭头表示的转换可能会丢失精度。注意:不仅数字类型之间可以进行类型转换(转型),对象之间也可以进行类型转换(转型)。但
36、布尔类型不能进行任何类型的转换。charbyteshortintlongfloatdouble图2.3数字类型之间的合法转换226操作符优先级不同的操作符具有不同的运算优先级,如表2.12所示。高等学校应用型特色规划教材表2.12操作符优先级操作符结合性.0从左向右!+一一()new从右向左*/%从左向右+-从左向右VV从左向右=instancef从左向右=J=从左向右&从左向右A从左向右I从左向右&从左向右Il从左向右?:从左向右=+=*=I=%=&=I=A=从右向左注:第一行中的()是指用于方法调用时的操作符,第二行中的()是指用于强制类型转换时的操作符。同一行上操作符的优先级别相同,但是
37、优先次序从左至右递减(右结合的操作符除外);同一列上操作符的优先级从上至下递减。注意:并不建议强记表2.12中操作符的优先级。在容易混淆的地方,建议在程序代码中使用圆括号明确指明运算的优先次序。例如,不建议使用类似下面的语句:c=x+y100+z;因为这种语句容易给程序的阅读带来困难,并给日后的维护带来麻烦。建议使用圆括号明确指出运算的执行次序,如:(x+)+y)/(100+z);或是:(+(+y)/(100+z);2.2.7表达式、语句和块在前面讲述变量和操作符的过程中,已经涉及表达式、语句和块的概念。这里再进行综合性的阐述。1 .表达式表达式是由变量、操作符或是方法调用所组成的一个运算序列
38、并且返回一个值。表达式用作变量的赋值或是控制程序的执行流程,例如:doubleSalary=100;/Stringname=Tom;/if(salary50&name.equals(,Tom11)/)else()上面的代码片段中,粗体部分(不包括分号)表示的是3个表达式:表达式和的作用是给变量赋值,表达式的作用是控制程序的执行流程。V注意:表达式总是完成一定的运算,然后返回一个值。例如表达式先完成赋值运算,然后返回值100o而表达式先运算salary50,返回true;然后皿1加6皿双”1)111”)是实例方法调用,判断name的值是否为Tom,返回值也是true;最后进行关系运算,得到结果
39、true作为表达式的返回值。2 .语句所谓语句,是指程序中的一个完整的执行单元。表达式后面添加分号(;)可以构成一条语句,例如:doublesalary=100;/声明语句,而Salary=100是表达式salary=200;/贝武值语句,而salary=200是表达式i-;/自减语句,而i-是表达式i+;/自增语句,而i+是表达式方法调用后面添加分号可以构成方法调用语句:System,out.printIn(HelloWorld);/方法调用语句三三=三三三除此以外,还有控制流语句,例如if、for以及SWitCh等,用于控制程序的执行流程,参见2.4节。3 .块块由一对花括号之间的零条或多
40、条语句所构成。参见2.1.3小节“变量的作用域”。字符串2.3字符串是由字符组成的序列,用双引号括起来的一个字符序列构成了字符串,如“thisisastring0字符串不是JaVa语言中的基本数据类型,而是对象类型(String类的实例)。可以用很多方式来定义一个字符串,例如:StringaStrl=Thisisastring;StringaStr2=newString(Thisisastring);StringaStr3=;/空字符串StringaStr4=null;/空值前面已经提到,一个对象类型的变量中存储的值是所指向对象的地址。所以上面的对象变量aStrl中的值是一个地址,该地址指向内
41、存中的一个字符串对象“Thisisastring”o例如:StringaStr=abc;/aStr指向内存中的一个字符串对象abcaStr=xyz;/aStr指向内存中重新生成的一个对象xyz。注意:null是一个特殊的空值,可以赋值给任何对象类型的变量。上面的例子中aStr3和aStr4是不同的,aStr3指向内存中的一个字符串对象(但是该字符串对象中没有任何字符);aStr4由于是一个空值,所以不指向任何字符串对象。高等学校应用型特色规划教材字符串被创建后,其中的内容不能再改变。如果要改变字符串的内容,需要重新生成新的字符串对象。如图2.4所示,执行完语句时,aStr指向内存中的一个字符串
42、对象“abc”;执行语句时,在内存中先生成一个字符串对象“xyz”,然后aStr再指向该对象。可以使用打印语句将字符串的内容打印出来,例如:StringaStr=abc;System.out.printIn(aStr);2.3.1 字符串连接JaVa语言中,使用操作符+”可以把两个字符串连接起来形成新的字符串。例如:StringaStr=abc+xyz;/aStr=abcxyzStringaStr=abc+11+xyz;/aStr=abcxyz还可以用“+”把字符串和其他类型的值(包括基本数据类型和对象类型)连接起来,其他类型的值首先被转换为字符串,然后再进行字符串之间的连接运算。字符串和基本
43、数据类型的值连接:StringaStr=value=+2O;/aStr=value=20StringaStr=value=+1rue;/aStr=value=true字符串和对象类型的值连接时,首先会调用对象中的toString()方法得到一个字符串,然后再进行两个字符串的连接运算:Doubled=newDouble(33.34);/Ci是一个对象StringaStr=value=+d;/aStr=value=33.34。注意:每个对象中均有一个toString()方法,该方法返回对象的一个字符串形式的描述。2.3.2 修改字符串每个字符串都具有一个长度,可以使用字符串对象的实例方法Iength()来取得字符串的长度:StringaStr=HeIloWorId;intsize=aStr.length();/siz的值为10如果想知道字符串aStr中第i(OiaStr.length()-1)个位置的字符值是什么,使用实例方法CharAt来返回一个字符值,例如:StringaStr=HeIloWorId;charaChar=aStr.charAt(0);/aChar=HQ注意:JaVa语言中,字符串中字符的下标索引是从。开始的。还可以使用SUbString()方法来获取一个字符串的子串。例如:StringaSt