上一期我们学习了对象与类,对新手来说是最难理解的部分,但没关系,后续的课程会再次复习这一块内容。本期来学习一下运算符与类型转换。
学习目标
- 学会基本运算符的使用并能熟练运用
- 了解各基本数据类型之间的转换
运算符
算术运算符
操作符 | 描述 | 举例 |
---|---|---|
+ | 加法 – 相加运算符两侧的值 | A + B 等于 30 |
– | 减法 – 左操作数减去右操作数 | A – B 等于 -10 |
* | 乘法 – 相乘操作符两侧的值 | A * B等于200 |
/ | 除法 – 左操作数除以右操作数 | B / A等于2 |
% | 取余 – 左操作数除以右操作数的余数 | B%A等于0 |
++ | 自增: 操作数的值增加1 | B++ 或 ++B 等于 21 |
— | 自减: 操作数的值减少1 | B– 或 –B 等于 19 |
下面我们通过几行简单的代码来看一看它们的使用方法吧。
public class Operators {
public static void main(String[] args) {
int a = 2;
int b = 12;
float c = 13.3f;
System.out.println(a + b); // 输出 a + b 的值
System.out.println(a - c); // 输出 a - c 的值
System.out.println(a * c); // 输出 a x c 的值
System.out.println(b / a); // 输出 b / a 的值
System.out.println(11 % 2); // 求 11 除以 2 的余数
}
}
// 运行结果
// 14
// -11.3
// 26.6
// 6
// 1
你可以试着模拟一下运行结果,System.out.println(String str)
用于输出文本到控制台。
拓展:a++与++a的区别
你可能已经发现了,自增/自减运算符有++a和a++这两种格式,它们有什么区别呢?
int a1 = 5;
int a2 = 5; // 注意这里的a1与a2相等
int x = 2 * ++a1;
int y = 2 * a2++;
System.out.println("++a的结果 a="+a1+",x="+x);
System.out.println("a++的结果 a="+a2+",y="+y);
// 运行结果
// ++a的结果 a=6,x=12
// a++的结果 a=6,y=10
从运行结果来看,我们可以发现a1、a2最后都自增1变成了6,但是输出的x、y却不同。
很明显可以看出,++a是先把a赋值成6,再进行乘法运算。而a++则是先进行乘法运算,再把a赋值成6。
关系运算符
运算符 | 描述 | 举例 |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假。 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A> B)为假。 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A <B)为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A> = B)为假。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真。 |
这里的关系运算符都能很快知道它们的作用,下面直接看一段代码来学习一下:
int e = 1;
int f = 6;
int g = 9;
int h = 1;
System.out.println("e是否大于f > " + (e > f));
System.out.println("g是否小于f > " + (g < f));
System.out.println("e是否不等于g > " + (e != g));
System.out.println("e是否等于h > " + (e == h));
// 运行结果
// e是否大于f > false
// g是否小于f > false
// e是否不等于g > true
// e是否等于h > true
观察一下就能发现,关系运算符的返回值是布尔值(true/false)。
逻辑运算符
操作符 | 描述 | 举例 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假。 |
| | | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | (A | | B)为真。 |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A && B)为真。 |
这里的 && || !
就相当于数学里面的 ∧且
∨或
¬非
符号,很好理解。
我们再用上面的e f g h变量来举例:
int e = 1;
int f = 6;
int g = 9;
int h = 1;
System.out.println("e等于f且e等于h > " + (e == f && e == h));
System.out.println("e不等于f且e等于h > " + (e != f && e == h));
System.out.println("f大于g或h小于等于e > " + (h > g || h <= e));
System.out.println("取反 g不等于h 的结果 > " + !(g != h));
// 运行结果
// e等于f且e等于h > false
// e不等于f且e等于h > true
// f大于g或h小于等于e > true
// 取反 g不等于h 的结果 > 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 |
赋值运算符在讲变量的时候就已经学习了=赋值,现在再来学习一下其他几种赋值运算符,他们都可以用=和相应的算术运算符代替,但是这里的4种可以简化代码。
int i = 3;
int i2 = 4;
int i3 = i * i2;
System.out.println("i(3) 乘以 i2(4) 的值为 > " + i3);
int i4 = i3 *= i2; // 等价于 i4 = i3 * i2
System.out.println("i3(12) 乘以 i2(4) 的值为 > " + i4);
// 运行结果
// i(3) 乘以 i2(4) 的值为 > 12
// i3(12) 乘以 i2(4) 的值为 > 48
可以看到,A *= B
代替了原有的A = A * B
,它们的效果是相同的。现在我们对上面的代码进行位置调整,再来看一下运行结果:
int i = 3;
int i2 = 4;
int i3 = i * i2;
int i4 = i3 *= i2; // 等价于 i4 = i3 * i2
System.out.println("i(3) 乘以 i2(4) 的值为 > " + i3);
System.out.println("i3(12) 乘以 i2(4) 的值为 > " + i4);
// 运行结果:
// i(3) 乘以 i2(4) 的值为 > 48
// i3(12) 乘以 i2(4) 的值为 > 48
可以发现两个结果都变成了48,这是为什么呢?
因为在第四行使用了i3 *= i2并且将它的结果赋给了i4,并且i3的结果也改变了。
也就是说,一旦使用了+= -= *= /=这些符号,就相当于给变量赋值而非简单的得到它们的结果,如果你希望i4得到正确的结果又不想改变i3的值,就去掉=保留*即可。
运算符优先级
运算符也有优先级,因此它可以识别四则运算,但是请注意,只能使用()而非[]或{}。
下面给出一张优先级表格,了解一下即可,不要求掌握。
类别 | 操作符 |
---|---|
后缀 | () [] . (点操作符) |
一元 | expr++ expr– |
一元 | ++expr –expr + – ~ ! |
乘性 | * /% |
加性 | + – |
移位 | >> >>> << |
关系 | > >= < <= |
相等 | == != |
按位与 | & |
按位异或 | ^ |
按位或 | | |
逻辑与 | && |
逻辑或 | | | |
条件 | ?: |
赋值 | = + = – = * = / =%= >> = << =&= ^ = | = |
逗号 | , |
类型转换
类型转换也是一个很重要的内容,要求掌握,在后续的对象与类中还会用到。
类型转换分为显式转换
和隐式转换
,下面分别来看一看它们的区别吧。
隐式转换
所谓隐式转换就是从小类型到大类型,例如整数属于小数,因此你可以直接给float或double赋值一个整数。
int abc = 199;
float abc2 = abc;
System.out.println("abc2的值为" + abc2);
// 运行结果
// abc2的值为199.0
显式转换(强制类型转换)
顾名思义,就是从大类型到小类型,例如小数变成整数。
int abc = 199;
float abc2 = abc;
abc2 += 3.1415926;
System.out.println("abc2的值为" + abc2);
abc = (int) abc2;
System.out.println("强制转换后abc的值为" + abc);
// 运行结果
// abc2的值为202.14159
// 强制转换后abc的值为202
这里有一个新的用法,括号写在等号后面,代表强制类型转换,括号后面紧跟着要转换的值,括号内为要强制转换成的数据类型。
课后练习
- 想一想什么是关系运算符、逻辑运算符、算术运算符、赋值运算符,它们有哪些?
- 尝试使用已学习的运算符完成一些你认为复杂的逻辑判断并输出结果。
- 结合“#3 变量、方法、修饰符”、””#4 类与对象”的内容,创建一个类和一个静态方法,在方法内用运算符完成你的函数,并在main()函数中调用它完成计算并输出结果。