Java 运算符与类型转换

笔记/Java/Java基础/Java基础语法/Java 运算符与类型转换

背景与动机#

运算符决定数据如何参与计算,类型转换决定不同类型的数据能否一起运算。

Java 的类型规则比较严格:有些转换编译器会自动完成,有些转换必须明确写出来。理解这点能避免很多“看起来能算,实际报错或精度丢失”的问题。

核心原理拆解#

1. 常见运算符#

Java 常见运算符包括:

  • 算术运算符:+-*/%
  • 比较运算符:>>=<<===!=
  • 逻辑运算符:&&||!
  • 位运算符 / 逻辑与:&|^~
  • 赋值运算符:=+=-=*=
  • 自增自减:++--

2. &&& 的区别#

两者都可用于布尔表达式,但含义和执行方式不同:

对比项&&&
名称逻辑与 / 按位与短路与
是否短路否,两边都会求值是,左边为 false 时右边不执行
常见用途布尔逻辑、整数按位运算日常条件判断
int x = 0;
if (false & (x++ > 0)) {
// 不会进入
}
System.out.println(x); // 1,右边仍然执行了
x = 0;
if (false && (x++ > 0)) {
// 不会进入
}
System.out.println(x); // 0,右边被短路

boolean 来说,& 是“两边都算完再判断”,&& 是“前面已经能确定结果就不再算后面”。日常写条件判断优先用 &&;需要两边副作用都发生时再用 &

同理,||| 也类似:| 不短路,|| 左边为 true 时右边不执行。

3. 整数除法会丢掉小数部分#

int result = 5 / 2;
System.out.println(result); // 2

两个整数相除,结果仍然是整数,小数部分会被截断。如果需要小数结果,至少让一边是浮点数:

double result = 5.0 / 2;
System.out.println(result); // 2.5

4. 自动类型转换#

当小范围类型赋值给大范围类型时,Java 可以自动转换:

int a = 10;
long b = a;
double c = b;

这类转换通常不会丢失主要数值信息,所以编译器允许。

5. 强制类型转换#

大范围类型赋值给小范围类型时,需要强制转换:

double price = 19.9;
int n = (int) price;
System.out.println(n); // 19

强制转换可能导致精度丢失或数值溢出,所以必须显式写出。

6. 字符串拼接#

+ 遇到字符串时会变成字符串拼接:

System.out.println("age=" + 18);

如果表达式中前面已经是字符串,后面的 + 会继续按拼接处理:

System.out.println("result=" + 1 + 2); // result=12
System.out.println(1 + 2 + " result"); // 3 result

最小可运行代码示例#

public class OperatorDemo {
public static void main(String[] args) {
int a = 5;
int b = 2;
System.out.println(a / b);
System.out.println(a % b);
System.out.println(a > b && b > 0);
double price = 19.9;
int intPrice = (int) price;
System.out.println(intPrice);
System.out.println("sum=" + (a + b));
}
}

常见陷阱与错误示例#

1. 误以为整数除法会自动保留小数#

double result = 5 / 2;
System.out.println(result); // 2.0

虽然接收变量是 double,但 5 / 2 已经先按整数除法算完了。

2. 强制转换导致精度丢失#

double d = 3.99;
int n = (int) d;
System.out.println(n); // 3

强制转成 int 不会四舍五入,而是直接截断小数部分。

3. 字符串拼接顺序导致结果误判#

System.out.println("x=" + 1 + 2);

输出是 x=12,不是 x=3。需要先计算时应加括号:

System.out.println("x=" + (1 + 2));

面试高频问题#

1. 自动类型转换和强制类型转换有什么区别#

自动类型转换通常是小范围到大范围,编译器自动完成;强制类型转换通常是大范围到小范围,需要显式写出,并可能发生精度丢失。

img
img

2. Java 中 5 / 2 的结果是什么#

结果是 2,因为两个操作数都是整数,执行整数除法。

3. &&& 有什么区别#

& 不短路,两边都会求值;&& 是短路与,左边为 false 时右边不再执行。条件判断通常用 &&

4. &&|| 有什么短路特性#

&& 左边为 false 时右边不会执行;|| 左边为 true 时右边不会执行。

一句话总结#

Java 运算要同时看“运算符”和“操作数类型”:类型决定计算方式,强制转换要警惕精度丢失,字符串拼接要注意表达式顺序。

文章目录

文章目录