E>>n右移n位,空位用原最高位的位值补足,相当于E/2
E>>>n右移n位,空位补0
关系操作符
关系操作符共六个:
>(大于)>=(大于等于)<(小于)<=(小于等于)!
=(不等于)==(相等)
关系操作符的结果为boolean型数据(true或false)。
注:
==操作符只有在比较双方均完全一致时,其值为true,如比较的是两个对象,即使两个对象的内容相同,结果也为false,
只有这两个对象为同一对象时才为true。
逻辑操作符
逻辑操作符的操作对象和结果均为boolean型,共六个:
!
(逻辑非)&&(逻辑与)||(逻辑或)
^(逻辑并或)&(逻辑与)|(逻辑或)
按位与‘&‘也可作为逻辑与使用,但未作优化,而‘&&‘操作符是经过优化的。
对‘|‘操作符也类似。
其他操作符
条件操作符E1?
E2:
E3
表达式E1若成立,执行表达式E2,否则执行E3。
逗号操作符
","可用于分隔语句。
如intx,y;
for(x=0,y=0;x<10;x++){...};
操作符的优先级和结合规则
优先级:
一元〉算术〉移位〉关系〉按位〉逻辑〉三元〉(复合)赋值〉逗号
结合规则:
除一元、三元和赋值操作符是自右至左结合外,其他均自左至右结合。
语句的分类
Java语句按是否改变运行的状态可分为执行语句(如表达式语句)和非执行语句(如声明语句)。
任何语句的末尾都以“;”结束。
执行语句按其组成可分三类:
空语句
只有一个语句结束符“;”,无任何内容。
基本语句(单语句)
独立的、完整的不能再分割为更小的可执行单元。
复合语句(块语句)
包含在{}内的一条或若干条语句。
Java的基本语句的结构可分为4类:
(1)顺序结构语句
(2)分支语句(3)循环语句(4)例外处理语句
后三种语句又称为流控制语句,我们将主要介绍分支语句和循环语句,而例外处理语句包括try、catch、finally以及throw语句。
这些语句是Java所特有的。
我们将在后面作专门的介绍。
分支语句
分支语句包括if-else,break,switch,return等语句。
分支语句提供了一种控制机制,使得程序可以跳过一些语句,转去执行特定的语句。
条件语句if-else.
if-else语句根据判定条件的真假来执行两种操作中的一种,其格式为:
if(boolean-expression)
statement1;
else
statement2;
其中,要注意的有:
布尔表达式boolean-expression是任意一个返回布尔型数据的表达式(这比C、C++的限制要严格)。
每个单一的语句后都必须有分号。
语句statement1,statement2可以是复合语句,这时要用花括号{}。
{}外面不加分号。
else子句是任选的。
若布尔表达式的值为true,则程序执行statement1,否则执行statement2。
if-else语句的一种特殊形式为:
if(expression1){
statement1
}elseif(expression2){
statement2
}……
}elseif(expressionN){
statementN
}
else子句不能单独作为语句使用,它必须和if配对使用。
else总是与离它最近的if配对。
可以通过使用花括号{}来改变配对关系。
例3.1:
比较两个数的大小,并按从小到大的次序输出。
publicclassCompareTwo{
publicstaticvoidmain(Stringargs[]){
doubled1=23.4;
doubled2=35.1;
if(d2>=d1)
System.out.println(d2+">="+d1);
else
System.out.println(d1+">="+d2);
}
}
例3.2:
判断某一年是否为闰年。
闰年的条件是符合下面二者之一:
①能被4整除,但不能被100整除;②能被400整除。
publicclassLeapYear{
publicstaticvoidmain(Stringargs[]){
intyear=1989; //method1
if((year%4==0&&year%100!
=0)||(year%400==0))
System.out.println(year+"isaleapyear.");
else
System.out.println(year+"isnotaleapyear.");
year=2000; //method2
booleanleap;
if(year%4!
=0)
leap=false;
elseif(year%100!
=0)
leap=true;
elseif(year%400!
=0)
leap=false;
else
leap=true;
if(leap==true)
System.out.println(year+"isaleapyear.");
else
System.out.println(year+"isnotaleapyear.");
}
}
该例中,方法1用一个逻辑表达式包含了所有的闰年条件,方法2使用了if-else语句的特殊形式。
多分支语句switch
switch语句是一种多分支选择语句,它可根据switch中表达式的值,来执行多个操作中的一个,它的一般格式如下:
switch(expression){
casevalue1:
statement1;
break;
casevalue2:
statement2;
break;
…………
casevalueN:
statemendN;
break;
[default:
defaultStatement;]
}
表达式expression可以返回任一简单类型的值(如整型、字符型),多分支语句把表达式返回的值与每个case子句中的值(一个常量)相比。
如果匹配成功,则执行该case子句后的语句序列。
default子句是任选的。
当表达式的值与任一case子句中的值都不匹配时,程序执行default后面的语句。
如果表达式的值与任一case子句
中的值都不匹配且没有default子句,则程序不做任何操作,直接跳出switch语句。
break语句用来在执行完一个case分支后,使程序跳出switch语句,即终止switch语句的执行。
switch语句的功能可以用if-else来实现,但在某些情况下,使用switch语句更简炼,且程序的执行效率提高。
例3.3根据考试成绩的等级打印出百分制分数段。
publicclassGradeLevel{
publicstaticvoidmain(Stringargs[]){
System.out.println("“nOutPutis:
");
chargrade=‘C‘; //normaluse
switch(grade){
case‘A‘:
System.out.println(grade+"is85~100");
break;
case‘B‘:
System.out.println(grade+"is70~84");
break;
case‘C‘:
System.out.println(grade+"is60~69");
break;
case‘D‘:
System.out.println(grade+"is<60");
break;
default:
System.out.println("inputerror");
}
}
}
break语句
在switch语中,break语句用来终止switch语句的执行。
使程序在switch语句后的第一个语句开始执行。
在Java中,可以为每个代码块加一个括号。
一个代码块通常是用花括号{}括起来的一段代码。
加标号的格式如下:
BlockLabel:
{codeBlock}
break语句的第二种使用情况就是跳出它所指定的块,并从紧跟该块的第一条语句处执行。
其格式为:
breakBlockLabel;
例如:
a:
{…… //标记代码块a
b:
{…… //标记代码块b
c:
{…… //标记代码块c
breaka;
……//willnotbeexecuted
}
……//willnotbeexecuted
}
……//willnotbeexecuted
}
……//executefromhere
与C、C++不同,Java中没有goto语句来实现任意的跳转,因为goto语句破坏程序的可读性,而且影响编译的优化。
Java用break来实
现goto语句所特有的一些功能。
返回语句return
return语句用于从当前执行的方法中退出,并返回到调用该方法的语句处继续程序的执行。
返回语句有两种格式:
returnexpression
返回一个值给调用该方法的语句,返回值的数据类型必须与方法声明中的返回值类型一致。
可以使用强制类型转换来使类型一致。
return
当方法说明中用void声明返回类型为空时,可以使用这种格式,它不返回任何值。
不带参数的return语句有时可省略。
return语句通常用在一个方法体的最后。
循环语句
循环语句包括while,do-while,for,continue等语句。
循环语句的作用是反复执行一段代码,直到满足循环终止条件为止,
一个循环一般应包括四部分内容:
初始化部分(initialization):
用来设置循环的一些初始条件,计数器清零等。
循环体部分(body):
这是反复循环的一段代码,可以是单一的一条语句,也可以是复合语句。
迭代部分(iteration):
这是在当前循环结束,下一次循环开始前执行的语句,常常用来使计数器加1或减1。
终止部分(termination):
通常是一个布尔表达式,每一次循环要对该表达式求值,以验证是否满足循环终止条件。
下面分别介绍Java中的while语句,do-while语句和for语句。
while语句
while语句的一般格式为:
[初始化]
while(条件表达式E){
语句S; //循环体
}
当条件表达式E的值为true时,循环执行花括号中的语句S。
S中包括迭代部分。
while语句首先计算条件表达式E是否成立,当条件成立(true)时,才去执行循环中的语句。
所以有可能循环体一次也不执行。
do-while语句
do-while语句的一般格式为:
[初始化]
do{
语句S; //循环体
}while(条件表达式E);
do-while语句首先执行循环体,然后再计算终止条件,若结果为true,则循环执行语句S,直到条件表达式E的结果为false。
与while语句不同的是,do-while语句的循环体至少执行一次。
for语句
for语句的一般格式为:
for(初始表达式;条件表达式;迭代表达式){
语句S; //循环体
}
for语句执行时,首先执行初始化操作,然后判断终止条件是否满足,如果满足,则执行循环体中的语句,最后执行迭代部分。
完成一次循环后,重新判断终止条件。
可以在for语句的初始化部分声明变量,它的作用域为整个for语句。
for语句通常用来执行循环次数确定的情况(如对数组元素进行操作)。
在初始化部分和迭代部分可以使用逗号语句来分隔多个操作。
例如:
for(i=0,j=10;i<j;i++,j--){
……
}
continue语句
continue语句用来结束本次循环,跳过循环体中下面尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环。
也可以用continue跳转到括号指明的外层循环中,这时的格式为
continueouterLable;
例3.4:
下例分别用while、do-while和for语句实现累计求和。
publicclassSum{
publicstaticvoidmain(Stringargs[]){
System.out.println("“n**whilestatement**");
intn=10,sum=0; ∥initialization
while(n>0){ ∥termination
sum+=n; ∥body
n--; ∥iteration
}
System.out.println("sumis"+sum);
System.out.println("“n**do_whilestatement**");
n=0; ∥initialization
sum=0;
do{
sum+=n; ∥body
n++; ∥iteration
}while(n<=10); ∥termination
System.out.println("sumis"+sum);
System.out.println("“n**forstatement**");
sum=0;
for(inti=1;i<=10;i++){
sum+=i;
}
System.out.println("sumis"+sum);
}
}
可以从中来比较这三种循环语句,从而在不同的场合选择合适的语句。
数组
数组是有序数据的集合,数组中的每个元素具有相同的类型。
数组名和下标可唯一地确定数组中的元素。
数组可分为一维数组和多维数组。
一维数组
声明方式:
typearrayName[];
或type[]arrayName;
type可以是Java中任意的数据类型,arrayName为数组名。
如:
intintArray[];
声明了一个名为intArray的整型数组,数组中的每个元素为int型数据。
Java在数组的声明中并不为数组元素分配内存,因此[]中不用指出数组中元素个数,即数组长度。
在访问数组的任何元素之前,我们必须为它分配内存空间,这可用new操作符,其格式如下:
arrayName=newtype[arraySize];
其中,arraySize指明数组的长度。
如:
intArray=newint;为该数组分配了3个int型整数所需的内存空间。
通常,这两部分可以合在一起,格式如下:
typearrayName[]=newtype[arraySize];
如:
intintArray[]=newint;
用new操作符为数组分配内存空间后,就可以引用数组中的每一个元素。
数组元素的引用方式为:
arrayName[index]
其中:
index为数组下标,它可以为整型常数或表达式。
如a,b(i为整型),c[6*I]等。
下标从0开始,一直到数组的长度减1。
对于上面例子中的intArray数组来说,它有3个元素,分别为:
intArray[0],intArray[1],intArray。
(注意:
没有intArray。
)
另外,与C、C++中不同,Java对数组元素要进行越界检查以保证安全性。
对于每个数组都有一个属性length指明它的长度。
例如:
intArray.length指明数组intArray的长度。
数组的初始化
对数组元素可以按照上述的例子进行赋值。
也可以在定义数组的同时进行初始化。
如:
inta[]={1,2,3,4,5};
用逗号(,)分隔数组的各个元素,系统自动为数组分配一定的内存空间。
例3.5:
数组的使用:
publicclassArrayTest{
publicstaticvoidmain(Stringargs[]){
inti;
inta[]=newint;
for(i=0;i<5;i++)
a=i;
for(i=a.l