- 1. 运算符概述
- 2. 运算符详解
- 2.1 算数运算符
- 2.2 关系运算符
- 2.3 逻辑运算符
- 2.4 赋值运算符
- 2.5 条件运算符
- 2.6 字符串连接运算符
运算符是指对操作数的运算方式。组成表达式的Java操作符有很多种(什么是操作数和操作符,例如1+2,其中1和2都是操作数,+是操作符,操作符和操作数联合起来构成表达式)。运算符按照其要求的操作数数目来分,可以有单目运算符(1个操作数)、双目运算符(2个操作数)和三目运算符(3个操作数)。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符、字符串连接运算符和其他运算符。常见的运算符如下所示:
算术运算符包括:+(两个数字求和)、-(两个数字相减)、*(两个数字乘积)、/(两个数字相除)、%(两个数字取模或者求余)、++(单目运算符,对数字自加1)、–(单目运算符,对数字自减1)。
public class ArithmeticOperatorTest01 {
public static void main(String[] args) {
int a = 10;
int b = 3;
System.out.println(a + b); //13
System.out.println(a - b); //7
System.out.println(a * b); //30
System.out.println(a / b); //3
System.out.println(a % b); //1
int i = 10;
i++;
System.out.println("i = " + i); //11
int j = 10;
++j;
System.out.println("j = " + j); //11
int k = 10;
int m = k++;
System.out.println("k = " + k); //11
System.out.println("m = " + m); //10
int x = 10;
int y = ++x;
//上行代码执行结束后,我们可以确定 x 变量一定自加1 了,所以 x=11
System.out.println("x = " + x); //11
System.out.println("y = " + y); //11
}
}
运行结果:
第一:两个int类型数据进行数学运算之后的结果一定是int类型;第二:++或–可以出现在变量前也可以是变量后;第三:++无论出现在变量前还是变量后,只要执行了++,那么变量必然会自加1;第四:++出现在变量后会先进行赋值运算,再自加1;第五:++出现在变量前会先自加1,再进行赋值运算。
关系运算符主要是完成数据和数据之间的比较,比如:5>3,结果是true(真),5>10,结果是false(假),>、>=、<、<=、==、!=。
class RelationOperatorTest01 {
public static void main(String[] args) {
int a = 10;
int b = 10;
System.out.println(a > b);//false
System.out.println(a >= b);//true
System.out.println(a < b);//false
System.out.println(a <= b);//true
System.out.println(a == b);//true
System.out.println(a != b);//false
System.out.println("abc".equals("abc"));//true
}
}
任何一个关系运算符的运算结果都是布尔类型,最后的结果不是true就是false,没有其他值,
2.3 逻辑运算符逻辑运算符主要包括逻辑与(&),逻辑或(|),逻辑异或(^),短路与(&&),短路或(||)。所有逻辑运算符的特点是操作数都是布尔类型,并且最终的运算结果也是布尔类型。逻辑运算符的基本运算规则如下表所示:
测试:
public class LogicalOperatorTest01 {
public static void main(String[] args) {
System.out.println(5 > 3 & 5 > 4); //true
System.out.println(5 > 100 | 5 > 4); //true
System.out.println(!(5 > 3)); //false
System.out.println(!(5 < 3)); //true
System.out.println(true & true); //true
System.out.println(true & false); //false
System.out.println(true | false); //true
System.out.println(!false); //true
System.out.println(!true); //false
System.out.println(true ^ false); //true
System.out.println(true ^ true);//false
System.out.println(false^ false); //false
//重点研究逻辑与(&)和短路与(&&)的区别
int x = 100;
int y = 98;
int z = 99;
System.out.println(x > y & x > z); //true
System.out.println(x > y && x > z); //true
int m = 99;
int n = 100;
System.out.println(m > n & m > n++); //false
System.out.println("n = " + n); //101
//那我们来看一下短路与(&&)是怎样的?
int k = 99;
int f = 100;
System.out.println(k > f && k > f++); //false
System.out.println("f = " + f); //100
}
}
通过以上的测试,可以得出短路与(&&)在左边的表达式结果为false的时候,右边的表达式则不再执行,这种现象被称为短路现象,这种机制也显得短路与比较智能一些,效率更高一些,所以在实际开发中短路与(&&)的使用率要比逻辑与高一些。但这并不是绝对的,有的时候也可能会选择使用逻辑与(&),这取决于你是否期望右边的表达式一定执行。
2.4 赋值运算符赋值运算符目前也是只需要掌握=、+=、-=、=、/=、%=,其它和二进制相关的内容也是到后面遇到的时候再详细学习。赋值类的运算符包括基本赋值运算符(=)和扩展的赋值运算符(+=、-=、=、/=、%=)。
public class AssignmentOperatorTest01 {
public static void main(String[] args) {
//基本的赋值运算符
int i;
i = 10;
System.out.println("i = " + i);
i = 100;
System.out.println("i = " + i);
//扩展的赋值运算符
int x = 10;
x += 1; //等同于x = x + 1
System.out.println("x = " + x); //11
int y = 10;
y -= 1; //等同于y = y - 1
System.out.println("y = " + y); //9
int z = 10;
z *= 2; //等同于z = z * 2
System.out.println("z = " + z); //20
int m = 10;
m /= 3; //等同于m = m / 3
System.out.println("m = " + m); //3
int n = 10;
n %= 3; //等同于 n = n % 3
System.out.println("n = " + n); //1
}
}
x += 1和x = x + 1不是相同的
测试:
class AssignmentOperatorTest02 {
public static void main(String[] args) {
byte b = 10;
//以下程序编译报错,编译器提示错误信息为:
//Type mismatch: cannot convert from int to byte
//b = b + 1;
b += 1; //编译通过并可以正常运行
System.out.println("b = " + b); //11
//通过以上的测试得出:b = b + 1 和b += 1 是不一样的
//那么b += 1 等同于什么呢?
b = (byte)(b + 1);
System.out.println("b = " + b); //12
b += 1000; //编译通过,并且可以正常运行
System.out.println("b = " + b); //-12
}
}
根据以上代码测试得出,对于扩展类的赋值运算符在运算的过程中不会改变运算的结果类型,也就是说byte b = 100; b += 1000;b变量最初是byte类型,最后的运算结果还是一个byte类型。这是一条固定的语法规则,大家记住就行了,以后在使用扩展类赋值运算符的时候要谨慎,不小心就会精度损失的。
2.5 条件运算符条件运算符属于三目运算符,它的语法结构是:布尔表达式?表达式1:表达式2。它的运行原理是这样的,先判断布尔表达式的结果是true还是false,如果是true,则选择表达式1的结果作为整个表达式的结果,反之则选择表达式2的结果作为整个表达式的结果。
public class ConditionalOperatorTest01 {
public static void main(String[] args) {
//编译报错:这不是一个语句
//10;
boolean flag = true;
//编译报错:这不是一个语句
//flag ? 1 : 0;
//以上如果是一条完整的语句应该这样写
int k = flag ? 1 : 0;
System.out.println("k = " + k); //1
//三目运算符最经典的用法
boolean sex = true;
//当布尔变量sex 为true 则结果是'男',反之'女'
char gender = sex ? '男' : '女';
System.out.println("性别:" + gender); //男
sex = false;
gender = sex ? '男' : '女';
System.out.println("性别:" + gender); //女
//又如
int x = 100;
int y = 100;
System.out.println(x==y?"x 和y 相等":"x 和y 不相等");
}
}
2.6 字符串连接运算符
在java语言中所有的字符串都使用半角双引号括起来的,字符串属于引用数据类型,不属于基本数据类型的范畴,例如:String name = “jack”;,这就类似于int i = 10;是一样的,int是一种整数类型,i是变量,10是整数型字面量。那么String则是一种字符串类型,name是变量,”jack”是字符串型字面量。在java编程中对字符串的操作是非常频繁的,例如字符串的连接操作,此时就需要使用“+”字符串连接运算符了。
实际上“+”运算符在java语言中有两个作用,作用一是对数字进行求和运算,作用二就是字符串连接运算,,当“+”运算的时候,两边的操作数都是数字的话,一定会进行求和运算,只要其中有一个操作数是字符串类型,那么一定会进行字符串拼接运算,字符串拼接之后的结果还是字符串类型。需要注意的是,当一个表达式当中有多个“+”,并且在没有小括号的前提下,遵循自左向右的顺序依次执行。
class PlusTest01 {
public static void main(String[] args) {
int a = 10;
int b = 20;
//加号两边都是int 类型,执行求和运算
int c = a + b;
System.out.println("a + b = " + c); //a + b = 30
System.out.println(a + " + " + b + " = " + a + b);
System.out.println(a + " + " + b + " = " + (a + b));
//定义一个字符串类型变量
String name = "jack";
System.out.println("登录成功,欢迎"+ name + "回来!");
}
}
对于程序System.out.println(a + " + " + b + " = " + a + b);的分析见下图:
对于程序System.out.println(a + " + " + b + " = " + (a + b));的分析见下图:



