前言
今天继续学习Java语言基础,上一章我们了解了java的对象与数组,现在我们来学习java的运算符与流程语句
Java运算符
运算符是用类操作变量的符号,使变量能够进行运算,在java中提供了许多运算符,它们被分为以下几类
- 算术运算符
- 关系运算符
- 位运算符
- 逻辑运算符
- 赋值运算符
- 其他运算符
算数运算符
算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。
| 操作符 | 操作 |
|---|---|
| + | 加法 - 相加运算符两侧的值 |
| - | 减法 - 左操作数减去右操作数 |
| * | 乘法 - 相乘操作符两侧的值 |
| / | 除法 - 左操作数除以右操作数 |
| % | 取余 - 左操作数除以右操作数的余数 |
| ++ | 自增: 操作数的值增加1 |
| -- | 自减: 操作数的值减少1 |
其中,自增自减符是特殊的算数运算符,它只用使用一个变量便可进行运算,分为前缀自增自减符与后缀自增自减符
- 前缀自增自减符:++(--)a 在变量a先进行自增或自减,再进行运算
- 后缀自增自减符:a++(--) 变量a先进行表达式,再进行运算
关系运算符
关系运算符是用来描述两个变量之间的关系,例如两个变量是否相等,大小等,通常返回一个布尔值
| 运算符 | 描述 | 例子 |
|---|---|---|
| == | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假。 |
| != | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B) 为真。 |
| > | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A> B)为假。 |
| < | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A <B)为真。 |
| >= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A> = B)为假。 |
| <= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真。 |
位运算符
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。 位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:
| 操作符 | 描述 | 例子 |
|---|---|---|
| & | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| 〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
| << | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
| >> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
| >>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
|:如果相对应位都是 0,则结果为 0,否则为 1 例如(A | B)得到61,即 0011 1101^:如果相对应位值相同,则结果为0,否则为1
逻辑运算符
逻辑运算符是用来表示变量或者两个表达式之间的逻辑的。
&&:与运算符,当且仅当两个操作数都为真,条件才为真。||:或运算符,如果有又一个操作为真,则条件为真。!: 非运算符,用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。
使用与运算符时,如果第一个操作为假时则不判断第二个操作,称为短路逻辑运算符
赋值运算符
赋值运算符是用于变量赋值,将赋值运算符右边变量或表达式的值赋值给左边的变量
| 操作符 | 描述 | 例子 |
|---|---|---|
| = | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
| + = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
| - = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
| * = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
| / = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A,C 与 A 同类型时等价于 C = C / A |
| (%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
| << = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
| >> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
| &= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
| ^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
条件运算符
? ::条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
例如:
variable x = (expression) ? value if true : value if false
类型判断运算符
instanceof:该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
例如:
String name = "James";
boolean result = name instanceof String;
//result为true
流程控制
在实际的代码中,程序经常需要做条件判断、循环,因此,需要有多种流程控制语句,来实现程序的跳转和循环等功能。
条件语句(if ...else)
if语句用于判断表达式是否符合条件,根据条件选择执行的程序体,一个 if 语句包含一个布尔表达式和一条或多条语句。
if语句的语法如下
if(布尔表达式){
程序体
}
如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执语句块后面的代码。
if ...elseif后面跟着else的话,当布尔表达式为true时执行if语句内的程序体,为false时执行else内的程序体
if ...else语法
if(布尔表达式){
程序体
}else{
程序体
-if ...else if ...elseelseif语句可以在if语句判断后再进行一次判断,这种语句可以检测到多种可能的情况。
使用 if,else if,else 语句的时候,需要注意下面几点:
- if 语句至多有 1 个 else 语句,else 语句在所有的 else if 语句之后。
- if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。
- 一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。
if ...else if ...else语法
if(布尔表达式){
程序体
}else if(布尔表达式){
程序体
}else{
程序体
}
-if语句可以嵌套使用例如:
if(){
if(){
}else if(){
}else{
}
}
选择语句(switch ...case)
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
switch case语法:
switch(expression){
case value : //语句
break; //可选
case value : //语句
break; //可选
//你可以有任意数量的case语句
default ://可选 //语句 //默认值
}
switch case 语句有如下规则:
-
switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
-
switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
-
case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
-
当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
-
当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
-
switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断。
如果 case 语句块中没有 break 语句时,匹配成功后,从当前 case 开始,后续所有 case 的值都会输出。如果后续的 case 语句块有 break 语句则会跳出判断。
循环语句
循环语句根据某一布尔条件判断后,循环执行程序体,知道布尔表达式为假 Java中有三种主要的循环结构:
- while 循环
- do…while 循环
- for 循环
while循环
语法
while(布尔表达式){
//程序体
}
while循环是最基础的循环语句,当布尔表达式为真时,循环执行程序体,知道布尔表达式为假
do while循环
语法
do{
//程序体
}while(布尔表达式)
在while循环中,如果布尔表达式一开始就为假时,则不会执行程序体,do while语句可以先执行一遍程序体后再进行布尔表达式判断,如果为true这继续循环,为false结束循环。
for循环
虽然所有循环结构都可以用 while 或者 do...while表示,但 Java 提供了另一种语句 —— for 循环,使一些循环结构变得更加简单。
for循环执行的次数是在执行前就确定的。语法格式如下:
for(初始化;布尔表达式;更新){
//程序体
}
关于 for 循环有以下几点说明:
-
最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
-
然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
-
执行一次循环后,更新循环控制变量。
-
再次检测布尔表达式。循环执行上面的过程
另一种for循环
java还提供了另一种for循环,主要用于数组的增强型 for 循环。
语法:
for(声明语句 : 表达式) {
//代码句子
}
声明语句: 声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式: 表达式是要访问的数组名,或者是返回值为数组的方法。声明语句: 声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式: 表达式是要访问的数组名,或者是返回值为数组的方法。
例如:
public class Test { public static void main(String[] args){
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ){
System.out.print( x ); System.out.print(",");
}
System.out.print("\n");
String [] names ={"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name ); System.out.print(",");
}
}
}
break关键字
break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
break 跳出最里层的循环,并且继续执行该循环下面的语句。
语法
break 的用法很简单,就是循环结构中的一条语句
continue关键字
continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序立即跳转到更新语句。
在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。
语法
continue 就是循环体中一条简单的语句:continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序立即跳转到更新语句。
在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。
语法
continue 就是循环体中一条简单的语句