内容正文:
第2章 Java语言概述
2.1 Java语言的运算符和表达式
2.2 Java语言流程控制
第2章 Java语言概述
2.1 Java语言的运算符及表达式
运算符
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
三目条件运算符
其它运算符
第2章 Java语言概述
2.1 1.算术运算符
与C/C++相似,Java算术运算符用于整型或实型数的运算,可分为一元运算符和二元运算符两种。一元运算符如表2.1所示。
表2.1 一元算术运算符表
运算符
用 法
功能描述
+
+OP
正值
−
−OP
负值
++
++OP,OP++
加1(自增)
−−
−−OP,OP− −
减1(自减)
第2章 Java语言概述
i= j=
m= k=
3
4
6
8
注意:
++/--只能作用于变量,而不能作用于常量或表达式。
int i=2;
int j=3;
int m=++j+i;
int k=m+i++;
自增、自减运算符:
若放在操作数之前,则是先进行自增/自减运算,再把其结果用于后继的操作;
若放在操作数之后,则是先进行别的运算,然后再进行自增/自减运算。
第2章 Java语言概述
Java的二元运算符有+,-,*,/,%五种,其用法与C/C++类似,见表2.2所示。
第2章 Java语言概述
表2.2 二元运算符用法表
运算符
用 法
功能描述
+
OP1+OP2
加
−
OP1−OP2
减
*
OP1*OP2
乘
/
OP1/OP2
除
%
OP1%OP2
求余
第2章 Java语言概述
二元运算符的几点说明:
Java语言对运算符“+”进行了扩展,可以连接字符串。
例如:abc+12
abc+1+2
abc+(1+2)
//结果为abc12
//结果为abc12
//结果为abc3
两个整数相除,其结果为整数,取结果的整数部分。若有一个操作数为小数,结果为小数。
例如:3/2
1/2
8/15*15
3.0/2
1/2.0
//结果为1
//结果为0
//结果为0
//结果为1.5
//结果为0.5
第2章 Java语言概述
取模运算符(%)是求两数相除的余数。既可以对整数取模,也可以对小数取模。
例如:20%7
16.2%5
//结果为6
//结果为1.2
第2章 Java语言概述
实际应用中,算术运算的操作数常常具有不同的类型,比如说,一个操作数为int型,另一个操作数为long型,一旦碰到这种情况,就需要进行类型的转换。一般原则是保证结果的数据类型与精度最高的操作数数据类型一致。转换规则如表2.3所示。
不同类型操作数进行运算时的类型转换:
第2章 Java语言概述
表2.3 类型转换规则
类型1
类型2
结 果
byte/short
byte
int
byte/short
int
int
byte/short/int
long
long
byte/short/int/long
float
float
byte/short/int/long/float
double
double
第2章 Java语言概述
2.1.2 关系运算符
关系运算符用于两个值之间的关系比较,其返回值为布尔类型。表2.4给出了关系运算符的使用方法。
表2.4 关系运算符表
运算符
用 法
功能描述
>
OP1>OP2
大于为真
>=
OP1>=OP2
大于等于为真
<
OP1<OP2
小于为真
<=
OP1<=OP2
小于等于为真
= =
OP1= =OP2
等于为真
! =
OP1! =OP2
不等于为真
第2章 Java语言概述
注意:
Java中关系运算符的结果则要么为true,要么为false。
在关系运算符的使用中,算术类型只能与算术类型比较,布尔类型、复合类型也只能与同类型相比较。
例:3>=3,结果为true。
第2章 Java语言概述
2.1.3逻辑运算符
与C/C++不同,Java中,逻辑运算符只能对布尔逻辑型数据进行操作,其返回值同样为布尔值。其用法如表2.5所示。
第2章 Java语言概述
表2.5 逻辑运算符表
操作数OP1
操作数OP2
OP1&OP2
OP1 | OP2
! OP1
true
true
true
true
false
true
false
false
true
false
false
false
false
false
true
false
true
false
true
true
利用&和|做运算时,运算符左右两边表达式都被运算执行,结果再做与或运算。
利用&&和||时,如果计算运算符左边表达式即可确定与或结果,右边表达式将不执行。
&和|,同&&和||有什么区别呢?
第2章 Java语言概述
执行下列程序段后,b,x,y的值正确的是( )
int x=6,y=8;
boolean b;
b=x<y||++x==--y;
(A)true, 6,8 (B)false,7,7
(C)true,7,7 (D)false,6,8
A
上例中,若将表达式改为b=x<y|++x==--y;
则答案为( )
C
第2章 Java语言概述
2.1.4 位运算符
位运算符用来对二进制数进行测试、置位或移位等操作,操作数只能为整型或字符型数据。真值表如表2.6所示。
第2章 Java语言概述
表2.6 位运算符表
运算符
用 法
功能描述
~
~OP
按位取反
&
OP1&OP2
按位与
|
OP1|OP2
按位或
^
OP1^OP2
按位异或
>>
OP1>>OP2
OP1右移OP2位
<<
OP1<<OP2
OP1左移OP2位
>>>
OP1>>>OP2
OP1无符号右移OP2位
第2章 Java语言概述
表2.7 位操作真值表
OP1位值
OP2位值
~OP1
OP1&OP2
OP1|OP2
OP1^OP2
0
0
1
0
0
0
1
0
0
0
1
1
0
1
1
0
1
1
1
1
0
1
1
0
第2章 Java语言概述
下面我们看一个按位异或的例子:
...
int x=17;
int y=10;
System.out.println("The value is"+x^y);
...
该段程序的输出结果为27,其实际运算如下:
x: 10001
y: 01010
^: 11011=27
第2章 Java语言概述
思考题:
将一个十进制整数110从右端开始的4~7位变为0.
x: 0110 1110
y: 0000 1110
^: 0110 1110
第2章 Java语言概述
第2章 Java语言概述
上面三种运算符,均属于移位运算符。在不产生溢出的情况下,左移一位相当于乘2,故有:
x*12=x* (8+4) =x<<3+x<<2
右移运算符“>>”将操作数移出右端的低位舍弃,把最高位作为补位,所以,右移一位相当于除2取商,与左移相似,有:
x/8=x>>3
运算符“>>>”是无符号右移,不考虑最高位的符号位,所以补位均为0。
优点:移位比直接乘除执行速度快 。
第2章 Java语言概述
2.1.5 赋值运算符
赋值运算符“=”把一个数据赋给一个变量,其一般形式为
variable_type variable_name=expression;
例如:
int x=100;
int y=200;
float z=100.0;
第2章 Java语言概述
Java中赋值语句可以分为简单赋值运算符和复合赋值运算符两类。当 “=”前面加上不同的运算符组成一些复杂的赋值语句后,就成了复合赋值运算符。如:
x/=2; // 等价于 x=x/2;
x%=4; // 等价于 x=x%4;
赋值运算符的基本用法可见表2.8。
第2章 Java语言概述
表2.8 复合赋值运算符用法表
运算符
用 法
等价于
+=
OP1+=OP2
OP1=OP1+OP2
−=
OP2−=OP2
OP1=OP1−OP2
*=
OP1*=OP2
OP1=OP1*OP2
/=
OP1/=OP2
OP1=OP1/OP2
%=
OP1%=OP2
OP1=OP1%OP2
|=
OP1|=OP2
OP1=OP1|OP2
&=
OP1&=OP2
OP1=OP1&OP2
^=
OP1^=OP2
OP1=OP1^OP2
>>=
OP1>>=OP2
OP1=OP1>>OP2
<<=
OP1<<=OP2
OP1=OP1<<OP2
>>>=
OP1>>>=OP2
OP1=OP1>>>OP2
第2章 Java语言概述
2.1.6 条件运算符
条件运算符是一个三元运算符,其一般形式为
expression ? statement1 :statement2;
其语义为:首先计算表达式expression的值,如果该值为真(true),则将statement1的值作为整个表达式的值,反之,将statement2作为整个表达式的值。
需要注意的是,该运算符规定statement1和statement2需返回相同类型的数据,且不能为void。
第2章 Java语言概述
例:用三目运算符求三个小数的最大值和最小值。
public class FindMaxMin
{
public static void main(String args[])
{
double d1=1.1,d2=-9.9.d3=96.9;
double temp,max,min;
//求三个数的最大值
temp=d1>d2?d1:d2;
max=temp>d3?temp:d3;
第2章 Java语言概述
//求三个数的最小值
temp=d1<d2?d1:d2;
min=temp<d3?temp:d3;
//显示结果
System.out.println(“max=”+max);
System.out.println(“min=”+min);
}
}
第2章 Java语言概述
2.1.7 对象运算符
Java中对对象的操作有专门的对象运算符instanceof。它用来测试一个对象是否是某个类或其子类的实例,若是则返回true,反之返回false。
例如:
String str=“java”;
boolean b;
b=str instanceof String;
结果b为true。
第2章 Java语言概述
2.1.8 运算符的优先级
运算符是有优先级的,它决定表达式中各运算执行的先后顺序。总的来说,运算符优先级具有如下规则:
(1) 一元运算符比二元运算符优先级高。
(2) 算术运算符比关系运算符优先级高。
(3) 关系运算符比按位运算符优先级高。
(4) 大于和小于运算符比等于和不等于运算符优先级高。
(5) 按位运算符比逻辑运算符优先级高。
(6) 逻辑与(&&)比逻辑或(||)优先级高。
(7) 赋值运算符优先级最低。
第2章 Java语言概述
表2.9 运算符的优先级及结合性
运算符
优先级
结合性
[ ]( )
最高
最低
左向
++ −− ! ~ instanceof
右向
New
右向
* / %
左向
+ −
左向
>> >>> <<
左向
<> <= >=
左向
== !=
左向
&
左向
^
左向
|
左向
&&
左向
||
左向
?:
右向
= += −= *= /= %= ^=
右向
&= /= <<= >>= >>>=
右向
,
左向
第2章 Java语言概述
2.1.9.表达式
一个表达式包含有多个操作,其顺序是由各运算符的优先级和是否有括号操作符决定。
例如:
int a=5,b=8,c,d;
c=a++*b;
d=++a*b;
//c=40,a=6
//d=56,a=7
第2章 Java语言概述
2.2 流程控制语句
Java同其他编程语言一样,提供了许多流程控制语句。本节我们讨论其流程控制语句的基本语法及特点。
第2章 Java语言概述
2.2.1 概述
Java所提供的流程控制语句几乎与C/C++完全相同。具体来说,Java的流程控制可通过如下一些语句来实现:
for语句
do-while语句
while语句
流程控制
控制转移语句
循环语句
分支语句
switch语句
if-else语句
return语句
break语句
continue语句
第2章 Java语言概述
对于Java中流程控制语句的使用情况,我们可通过表2.10来描述。
第2章 Java语言概述
表2.10 控制语句的用法
类 型
用法描述
if-else
if(boolean)statement1;
else statement2;
switch
switch(expression0)
{case expression1:statement1;…
case expressionN:statementN;
default:statementN+1;}
break
Break [label];
continue
Continue [lable];
return
Return expression;
for
for(expression1;expression2;expression3)
statement;
while
while(boolean)statement;
do-while
do
statement;
while(boolean);
label
lable:statement;
第2章 Java语言概述
2.2.2 分支语句
一、条件语句
if语句
简单条件语句
复合条件语句
第2章 Java语言概述
① 简单条件语句
if (condition )
{
statement;
}
或
if (condition)
statement1;
else
statement2;
第2章 Java语言概述
比如当程序需要根据不同的输入信息执行不同的操作(例如经常碰到的对话框的选项操作)时,可以使用if和else语句来实现这个目的:
…
// response is either OK or Cancel depending
// on the button that the user pressed
…
if (response = = OK) {
// 在这里添加执行OK动作的代码
} else {
// 在这里添加执行Cancel动作的代码
}…
第2章 Java语言概述
② 复合条件语句
if(condition1) statement1;
else if (condition2) statement2;
else if(condition3) statement3;
...
else statementN;
注意:使用Java复合条件语句时,一个if语句后可以跟任意个else if语句,但只能有一个else语句。
第2章 Java语言概述
例:编写应用程序,程序运行后,根据屏幕提示输入一个字符串,回车后统计字符串中的字符ABCD(不区分大小写)各有多少个并输出。
第2章 Java语言概述
import java.io.*
public class IfElseTest
{
public static void main(String args[]) throws IOException
{
String str;
BufferedReader buf;
int aCount=0, bCount=0, cCount=0, dCount=0,Count=0;
//将输入的内容放入缓冲区buf
buf=new BufferedReader(new InputStreamReader(System.in));
System.out.println(“请输入一串字符,回车后统计ABCD的个数”);
//读取缓冲区的一行内容,赋给str
str=buf.readLine();
第2章 Java语言概述
for(int i=0;i<str.length();i++)
{
char ch=str.charAt(i);
if(ch==‘a’|ch==‘A’)
++aCount;
else if(ch==‘b’|ch==‘B’)
++bCount;
else if (ch==‘c’|ch==‘C’)
++cCount;
else if(ch==‘d’|ch==‘D’)
++dCount;
else
++Count;
}
第2章 Java语言概述
System.out.println(“字母a或A的个数”+aCount);
System.out.println(“字母b或B的个数”+bCount);
System.out.println(“字母c或C的个数”+cCount);
System.out.println(“字母d或D的个数”+dCount);
System.out.println(“其它字符的个数”+Count);
}
}
第2章 Java语言概述
运行结果如下:
第2章 Java语言概述
二、switch语句-多分支语句
switch是Java所提供的多分支选择语句。现实生活中常常会碰到多种可能性的情况,虽然可用复合条件语句来处理,但会使程序变得冗长繁琐,可读性也会降低。switch语句更简练,可读性更强,而且提高了程序的执行效率。
第2章 Java语言概述
switch(整型或字符型表达式)
{
case value1:
expression1;
break;
case value2:
expression2;
break;
…
case valueN:
expressionN;
break;
default:
expression;}
Value1, value2…… valueN必须是整型或字符型常量,且值不能相同。
Default可省。当表达式的值与所有case的值都不匹配时,执行该句。
第2章 Java语言概述
对于上例求ABCD(不区分大小写)的程序,可以将for语句部分改动如下:
第2章 Java语言概述
for(int i=0;i<str.length();i++)
{ char ch=str.charAt(i);
switch(ch)
{
case ‘A’:case’a’:
++aCount;break;
case ‘B’:case’b’:
++bCount;break;
case ‘C’:case’c’:
++cCount;break;
case ‘D’:case’d’:
++dCount;break;
default:
++Count;break;}}
第2章 Java语言概述
运行结果如下:
第2章 Java语言概述
下面再给出一个用switch语句显示月份的程序。
第2章 Java语言概述
import java.io.*;
public class SwitchTest2
{
public static void main(String args[]) throws IOException
{
int month;
String str;
BufferedReader buf;
buf=new BufferedReader(new InputStreamReader(System.in));
System.out.println(“请输入月份”);
str=buf.readLine();
month=Integer.parseInt(str);
该函数用来将数字字符串变为整型数据
第2章 Java语言概述
switch (month) {
case 1: System.out.println("Now is: January"); break;
case 2: System.out.println("Now is: February"); break;
case 3: System.out.println("Now is: March"); break;
case 4: System.out.println("Now is: April"); break;
case 5: System.out.println("Now is: May"); break;
case 6: System.out.println("Now is: June"); break;
case 7: System.out.println("Now is: July"); break;
case 8: System.out.println("Now is: August"); break;
case 9: System.out.println("Now is: September"); break;
第2章 Java语言概述
case 10: System.out.println("Now is: October"); break;
case 11: System.out.println("Now is: November"); break;
case 12: System.out.println("Now is: December"); break;
default: System.out.println("You input a unvalid number! Try again. ");
break;
}
}
}
第2章 Java语言概述
运行结果如下:
第2章 Java语言概述
使用switch语句,我们须注意如下事项:
(1) switch语句只能取代if语句的部分功能,因为其只能对switch后括号内表达式的值与常量进行比较,而if语句可作多种比较。
(2) case 常量表达式出现次序可相互调换,不影响执行结果。
(3) 括号内的表达式只能为整型或字符型。
(4) 同一个switch语句不能有两个case常量值相等。
(5) 每一步之后必须用break语句终止,否则失去开关的效果。
第2章 Java语言概述
2.2.3 循环语句
循环结构是程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。
与C/C++一样,Java提供了三种格式的循环控制语句:while语句、do-while语句和for语句,下面我们分别加以介绍。
第2章 Java语言概述
一、while 语句
while语句的语法为
while (expression)
{ statement;}
首先,while语句执行并检查条件表达式expression,它返回一个boolean类型数(true或者false)。如果表达式返回true,while语句执行语句statement。之后while语句继续测试条件表达式并执行直到条件返回false。
注意:在循环体中必须有能够对循环条件进行修改的语句,否则会导致死循环。
第2章 Java语言概述
下面我们给出一个例子WhileDemo。此函数的功能是:首先接收用户输入的字符串(该字符串以字符‘*’结束),然后使用while语句来测试字符串的各个字符,并复制字符串到另一串中,直到碰到字符‘*’才结束。字符串的用法可参阅第五章。
第2章 Java语言概述
import java.io.*;
import java.lang.*;
public class WhileDemo
{
public static void main(String[] args)throws IOException
{
String sourceStr;
System.out.println("Please input a string ended with character * ");
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
sourceStr=buf.readLine();
第2章 Java语言概述
StringBuffer destinateStr = new StringBuffer();
int i=0;
char c=sourceStr.charAt(i);
System.out.println("The source string is:"+sourceStr);
System.out.println("The result string is:"+destinateStr);
}
}
字符串分两类:
创建后不能修改和变动的字符串常量为String类;
创建后可以再修改和变动的字符串变量-StringBuffer类。
在字符串destinateStr的末尾添加字符c
while (c!='*')
{
destinateStr.append(c);
c = sourceStr.charAt(++i);
}
第2章 Java语言概述
运行结果如图:
第2章 Java语言概述
二、do-while 语句
如果需要循环执行的语句至少执行一次,可使用do-while语句,它实现“直到型until”结构,do-while的基本格式为
do
{
statement;
} while (boolean_expression);
第2章 Java语言概述
do
{
destinateStr.append(c);
c = sourceStr.charAt(++i);
} while (c != '*');
以上例为例,只需将循环部分改为:
第2章 Java语言概述
三、for 语句
for语句是最标准的循环语句。与C/C++相同,它是Java语言中最灵活的一种控制结构,它有多种变形,可实现不同的循环功能。for语句的一般格式为
for (初始条件;终止条件;增量)
{
statement;
}
第2章 Java语言概述
括号内的三个表达式均可以为空。实际上,为了实现无限循环,这三
个表达式都可以省略。例如:
...
for ( ; ; ) // 表示无限循环
{
...
}
下例中使用了一个for循环语句来输入/输出一个数组(数组的内容参见第3章)的所有元素。
第2章 Java语言概述
public class forTest
{
public static void main(String[] args)
{
int[] intArray = new int[5];
for (int i=0;i<intArray.length;i++)
intArray[i]=i;
for (int i=0; i<intArray.length; i++)
System.out.println("intArray["+i+"]"+intArray[i]);
}
}
“+i+”能输出具体的i值,而不是字符i
第2章 Java语言概述
运行结果如图:
第2章 Java语言概述
2.3.5 转移语句
Java语言提供了3个转移语句: return,break和continue语句。它们的功能就是改变while、do-while、for及switch语句的正常运行。比如说,我们在介绍for语句的时候曾经提到过死循环 for(; ;)的问题,如果利用转移语句的break语句,就能达到改变循环顺序的目的,从而跳出死循环。下面我们对上述的三个转移语句分别加以介绍。
第2章 Java语言概述
一、return语句
对于有返回值类型(返回值类型非void)的方法,方法体一定有一个return语句。
格式:
return 表达式;
注意:表达式的类型与方法的返回类型一致。
第2章 Java语言概述
二、break语句
break语句用在循环结构和switch语句中,用于从循环体内部跳出或从switch语句的case子句中跳出。
(1)不带标号的break语句
格式:
break;
功能:跳出它所在的循环(只能跳出一重循环),
并从该循环的后继语句开始执行。
第2章 Java语言概述
例:下面的程序段是一个方法的定义,方法名为isPrime()。返回值类型为boolean。方法实现的功能是:如果n是素数,返回逻辑值true,否则返回false。
boolean isPrime(n)
{ boolean b=true;
return b;
}
for(int k=2;k<=n/2;k++)
{
if(n%k==0)
{
b=false;
break;
}
}
第2章 Java语言概述
(2)带标号的break语句
格式:
break 标号;
功能:从多重循环体内部跳出标号所标志的那重循
环,即终止标号所标志的那层循环,执行循环后
面的语句。
第2章 Java语言概述
例:
label:for(int i=0;i<10;i++)
{…;
for(int k=1;k<10;k++)
{
…;
if(k==3)
break label;
}
}
…
第2章 Java语言概述
三、continue 语句
continue语句只能用在循环结构中。
(1)不带标号的continue语句
continue;
功能:跳过本轮循环的剩余语句,进入循环的下一轮。
第2章 Java语言概述
例:
for(int i=0;i<10;i++)
{…;
for(int k=1;k<10;k++)
{
…;
if(k==3)
continue;
}
}
…
第2章 Java语言概述
(2)带标号的continue语句
continue 标号;
功能:可以从多重循环的内层循环跳到外层循环,执行标号所示的循环的下一轮。
第2章 Java语言概述
例:
label:for(int i=0;i<10;i++)
{…;
for(int k=1;k<10;k++)
{
…;
if(k==3)
continue label;
}
}
…
第2章 Java语言概述
Application程序
Java程序
Applet小程序
附:Java程序的分类
Applet小程序
第2章 Java语言概述
Java源程序
(*.java文件)
javac
字节码
(*.class文件)
编辑网页文件
文件名.html
Java Applet小程序的执行过程
在网页中打开
“文件名.html”
在命令行运行 appletviewer 文件名.html
运行
或
第2章 Java语言概述
例:一个简单的Java Applet程序
import java.applet.Applet;
import java.awt.Graphics;
public class MyApplet extends Applet
{
public void paint(Graphics g)
{
g.drawString("this is my first java program!",15,20);
}
}
第2章 Java语言概述
编译生成MyApplet.class后,为它编写一个HTML文件,假设命名为page1.htm。
<HTML>
<HEAD><TITLE>Java 小程序</TITLE></HEAD>
<BODY>
<APPLET CODE=" MyApplet " WIDTH=200 HEIGHT=60></APPLET>
</BODY>
</HTML>
第2章 Java语言概述
运行java小程序
方法一、通过支持Java的网页浏览器运行html文档。
方法二、调用appletviewer命令运行网页page1.html
第2章 Java语言概述
Application程序
Java Application程序是独立完整的程序。
在命令行调用独立的解释器软件即可运行Java Application 程序。
Java Application 程序中必须有一个public static void main(String args[])方法,该方法是程序执行的入口点。
两种程序的对比:
第2章 Java语言概述
Applet小程序
Java Applet程序是在WWW浏览器这个特定的环境下运行的,严格的说并不是一个完整独立的程序,而是一个已经构建好的框架程序中的一个模块。这个框架程序包括浏览器本身和Java中Applet的类库模块。
运行Java Applet的解释器不是独立的软件,而是嵌在WWW浏览器中的浏览器软件的一部分。当希望运行Java Applet程序时,必须把它嵌在通用语言HTML中并激活浏览器中的这个解释器,或调用能够模拟浏览器框架环境的软件,如AppletViewer。
第2章 Java语言概述
Java Applet程序不需要有main()方法,但Java Applet程序中的主类必须是类库中已经定义好的类java.applet.Applet的子类。
Java Applet程序可以直接利用浏览器或AppletViewer提供的图形用户界面,而Java Application程序必须另外书写专用代码来建立自己的图形用户界面。
由于不一定非要有main()作为程序入口,Java Applet更多的是体现状态与状态的切换,而不是固定的顺序化的执行过程,这使它更适合于图形界面下的面向对象编程模式。
第2章 Java语言概述
练习:
2. 编写一个Applet程序,用char类型常量、float类型常量、long类型常量赋值给3个int类型整数,并用一个输出语句分两行输出。
1. 编写一个Application程序,判断从命令行输入的字符如果是小写字母,则把它转换成大写字母;如果是大写字母,则不进行转换。
第2章 Java语言概述
$$