Java运算符详解
运算符是编程语言中用于执行操作的符号,Java提供了丰富的运算符类型
学习目标
掌握Java中各类运算符的使用方法、优先级规则以及实际应用场景
核心概念
Java运算符分为以下几类:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符和其他运算符。
算术运算符
用于执行基本数学运算的运算符
基本算术运算符
- 加法:
+
(5 + 3 = 8) - 减法:
-
(5 - 3 = 2) - 乘法:
*
(5 * 3 = 15) - 除法:
/
(5 / 3 = 1) - 取模:
%
(5 % 3 = 2)
代码示例:
int a = 10, b = 3;
int sum = a + b; // 13
int difference = a - b; // 7
int product = a * b; // 30
int quotient = a / b; // 3
int remainder = a % b; // 1
int sum = a + b; // 13
int difference = a - b; // 7
int product = a * b; // 30
int quotient = a / b; // 3
int remainder = a % b; // 1
自增/自减运算符
- 前缀自增:
++a
(先增加后使用) - 后缀自增:
a++
(先使用后增加) - 前缀自减:
--a
(先减少后使用) - 后缀自减:
a--
(先使用后减少)
代码示例:
int x = 5;
int y = ++x; // x=6, y=6
int z = x++; // z=6, x=7
int a = 10;
int b = --a; // a=9, b=9
int c = a--; // c=9, a=8
int y = ++x; // x=6, y=6
int z = x++; // z=6, x=7
int a = 10;
int b = --a; // a=9, b=9
int c = a--; // c=9, a=8
重要注意事项
整数除法会丢弃小数部分,例如:7 / 2 结果是 3 而不是 3.5。如果需要保留小数,应使用浮点类型。
关系与逻辑运算符
用于比较值和连接条件表达式的运算符
关系运算符
- 等于:
==
(5 == 5 → true) - 不等于:
!=
(5 != 3 → true) - 大于:
>
(5 > 3 → true) - 小于:
<
(5 < 3 → false) - 大于等于:
>=
(5 >= 5 → true) - 小于等于:
<=
(5 <= 3 → false)
代码示例:
int age = 25;
boolean isAdult = age >= 18; // true
boolean isTeen = age < 20; // false
boolean isTwentyFive = age == 25; // true
boolean isAdult = age >= 18; // true
boolean isTeen = age < 20; // false
boolean isTwentyFive = age == 25; // true
逻辑运算符
- 逻辑与:
&&
(两个条件都为真) - 逻辑或:
||
(至少一个条件为真) - 逻辑非:
!
(反转条件) - 短路与:
&
(不短路) - 短路或:
|
(不短路)
代码示例:
boolean hasTicket = true;
boolean hasId = false;
boolean canEnter = hasTicket && hasId; // false
boolean canBuy = hasTicket || hasId; // true
boolean cannotEnter = !canEnter; // true
boolean hasId = false;
boolean canEnter = hasTicket && hasId; // false
boolean canBuy = hasTicket || hasId; // true
boolean cannotEnter = !canEnter; // true
短路特性
&&
和 ||
具有短路特性:当第一个操作数已经能决定结果时,不再计算第二个操作数。例如:false && (任何表达式)
将直接返回 false。
赋值与位运算符
用于赋值和位级操作的运算符
赋值运算符
- 简单赋值:
=
- 加后赋值:
+=
- 减后赋值:
-=
- 乘后赋值:
*=
- 除后赋值:
/=
- 模后赋值:
%=
代码示例:
int count = 10;
count += 5; // count = 15
count -= 3; // count = 12
count *= 2; // count = 24
count /= 4; // count = 6
count %= 5; // count = 1
count += 5; // count = 15
count -= 3; // count = 12
count *= 2; // count = 24
count /= 4; // count = 6
count %= 5; // count = 1
位运算符
- 按位与:
&
- 按位或:
|
- 按位异或:
^
- 按位取反:
~
- 左移位:
<<
- 右移位:
>>
- 无符号右移:
>>>
代码示例:
int a = 5; // 二进制: 0101
int b = 3; // 二进制: 0011
int and = a & b; // 0001 → 1
int or = a | b; // 0111 → 7
int xor = a ^ b; // 0110 → 6
int leftShift = a << 1; // 1010 → 10
int b = 3; // 二进制: 0011
int and = a & b; // 0001 → 1
int or = a | b; // 0111 → 7
int xor = a ^ b; // 0110 → 6
int leftShift = a << 1; // 1010 → 10
Java类型转换
在不同数据类型之间转换的规则与方法
学习目标
理解自动类型转换和强制类型转换的区别,掌握类型转换的最佳实践
自动类型转换(隐式转换)
当满足以下条件时,Java会自动进行类型转换:
- 两种类型兼容(如都是数值类型)
- 目标类型比源类型范围大(如 int → double)
byte
→
short
→
int
→
long
→
float
→
double
// 自动类型转换示例
int intValue = 100;
long longValue = intValue; // 自动转换
double doubleValue = longValue; // 自动转换
float floatValue = 3.14f;
doubleValue = floatValue; // 自动转换
int intValue = 100;
long longValue = intValue; // 自动转换
double doubleValue = longValue; // 自动转换
float floatValue = 3.14f;
doubleValue = floatValue; // 自动转换
强制类型转换(显式转换)
当需要将范围大的类型转换为范围小的类型时,需要强制转换:
double doubleValue = 100.04;
long longValue = (long) doubleValue; // 强制转换,值为100
int intValue = (int) longValue; // 强制转换,值为100
// 注意数据丢失
double d = 123.456;
int i = (int) d; // i = 123 (小数部分丢失)
long longValue = (long) doubleValue; // 强制转换,值为100
int intValue = (int) longValue; // 强制转换,值为100
// 注意数据丢失
double d = 123.456;
int i = (int) d; // i = 123 (小数部分丢失)
数据丢失风险
强制转换可能导致数据丢失或精度降低,特别是当大范围类型值超出小范围类型容量时。
数值类型转换规则
操作 | 转换规则 | 示例 |
---|---|---|
byte → short/int/long/float/double | 自动转换 | byte b = 5; short s = b; |
short → int/long/float/double | 自动转换 | short s = 100; int i = s; |
char → int/long/float/double | 自动转换 | char c = 'A'; int i = c; // i=65 |
int → float | 自动转换(可能损失精度) | int i = 123456789; float f = i; |
long → float/double | 自动转换(可能损失精度) | long l = 12345678901L; float f = l; |
float → int/long | 需要强制转换 | float f = 3.14f; int i = (int)f; // i=3 |
double → float | 需要强制转换 | double d = 3.14; float f = (float)d; |
运算符优先级
运算符的执行顺序规则
- 括号
()
- 最高优先级,用于改变计算顺序 - 自增/自减
++ --
- 前缀形式 - 乘法/除法/取模
* / %
- 加法/减法
+ -
- 移位运算符
<< >> >>>
- 关系运算符
< <= > >= instanceof
- 等于/不等于
== !=
- 位运算符
& ^ |
- 逻辑运算符
&& ||
- 条件运算符
?:
- 赋值运算符
= += -= *= /= %=
- 最低优先级
// 优先级示例
int result = 5 + 3 * 2; // 11 (不是16)
int another = (5 + 3) * 2; // 16
boolean flag = 5 > 3 && 4 < 2; // false
int value = 10;
int calc = value++ * 2 + --value; // 10*2 + 10 = 20 + 10 = 30
int result = 5 + 3 * 2; // 11 (不是16)
int another = (5 + 3) * 2; // 16
boolean flag = 5 > 3 && 4 < 2; // false
int value = 10;
int calc = value++ * 2 + --value; // 10*2 + 10 = 20 + 10 = 30
最佳实践
当表达式复杂时,使用括号明确运算顺序,即使不是必需的。这可以提高代码可读性并避免潜在的错误。
动手练习
通过实际编码巩固运算符和类型转换知识
练习题目
- 编写程序计算半径为5的圆的面积(使用Math.PI)
- 实现华氏温度转摄氏温度:C = (F - 32) * 5/9
- 使用位运算符交换两个变量的值(不借助第三个变量)
- 计算表达式:3 + 4 * 5 / 2 - 6 % 3
- 编写程序验证整数除法和浮点除法的区别
运算符练习器
输入表达式,查看计算结果:
// 计算结果将显示在这里