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

自增/自减运算符

  • 前缀自增: ++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

重要注意事项

整数除法会丢弃小数部分,例如: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 hasTicket = 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

位运算符

  • 按位与: &
  • 按位或: |
  • 按位异或: ^
  • 按位取反: ~
  • 左移位: <<
  • 右移位: >>
  • 无符号右移: >>>

代码示例:

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

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; // 自动转换

强制类型转换(显式转换)

当需要将范围大的类型转换为范围小的类型时,需要强制转换:

double doubleValue = 100.04;
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;

运算符优先级

运算符的执行顺序规则

  1. 括号 () - 最高优先级,用于改变计算顺序
  2. 自增/自减 ++ -- - 前缀形式
  3. 乘法/除法/取模 * / %
  4. 加法/减法 + -
  5. 移位运算符 << >> >>>
  6. 关系运算符 < <= > >= instanceof
  7. 等于/不等于 == !=
  8. 位运算符 & ^ |
  9. 逻辑运算符 && ||
  10. 条件运算符 ?:
  11. 赋值运算符 = += -= *= /= %= - 最低优先级
// 优先级示例
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
  • 编写程序验证整数除法和浮点除法的区别

运算符练习器

输入表达式,查看计算结果:

// 计算结果将显示在这里