欢迎光临
我们一直在努力

【3.Java基础】Java运算符详解:从算数运算到逻辑判断,一篇文章全部掌握

文章目录

  • 【3.Java基础】Java运算符详解:从算数运算到逻辑判断,一篇文章全部掌握
    • 导入语
    • 1 ~> 算术运算符
      • 1.1 基本算术运算
      • 1.2 易错点:整除问题
      • 1.3 取余运算
    • 2 ~> 自增和自减运算符
      • 2.1 `++` 和 `–`
      • 2.2 前置 vs 后置(初学者第一道坎)
      • 2.3 自增自减经典陷阱
    • 3 ~> 赋值运算符
      • 3.1 基本赋值 `=`
      • 3.2 复合赋值运算符
      • 3.3 复合赋值自带强制转换
    • 4 ~> 比较运算符
      • 4.1 六个比较运算符
      • 4.2 易错点:不要把 `==` 写成 `=`
    • 5 ~> 逻辑运算符
      • 5.1 三个逻辑运算符
      • 5.2 短路特性
      • 5.3 逻辑运算符的真值表
    • 6 ~> 条件运算符(三元运算符)
      • 6.1 三元运算符的语法
      • 6.2 实战案例
      • 6.3 三元运算符可以嵌套
    • 7 ~> 位运算符(初识)
    • 8 ~> 运算符优先级
      • 8.1 Java 运算符优先级总表
      • 8.2 实战中的优先级问题
    • 9 ~> 表达式中的类型自动提升
    • 10 ~> 常见编译运行错误
    • 思考 && 总结
    • 结尾

【3.Java基础】Java运算符详解:从算数运算到逻辑判断,一篇文章全部掌握

📖 文章简介: 本文系统讲解Java中的六大类运算符:算术运算符(含自增自减的前置后置区别)、赋值运算符、比较运算符、逻辑运算符(含短路特性)、位运算符、以及三元运算符。每种运算符均附完整代码示例和运行结果,同时覆盖运算符优先级规则、表达式类型自动提升机制,以及自增陷阱、整除取整、浮点数相等判断、短路特性等初学高频踩坑点。文末附常见编译运行错误对照表,适合刚学完变量和类型的初学者快速建立起对Java运算符的完整认识。


在这里插入图片描述

🎬 个人主页: 源码骑士

❄ 专栏传送门: 《java编程练习题》《全栈开发》

⭐️热衷从源码视角拆解技术底层原理,将复杂架构讲得通俗易懂


🎬 源码骑士的简介: 5年Android Framework系统开发经验,曾主导多项系统级性能优化专项 技术栈覆盖Android系统全链路(Binder/Handler/AMS/WMS/启动流程)及Java后端全家桶(Spring + MyBatis + Redis + Oracle) 累计产出原创技术文章100+篇,文章以流程图为特色,被读者评价为"看一篇胜过啃一周源码"


导入语

变量你已经会声明了、类型你也搞懂了。下一步是什么?让这些变量动起来。

变量存了数据,接下来你要对数据做各种操作——加减乘除、比较大小、判断真假。这些操作靠的就是运算符。运算符是连接变量和逻辑的桥梁,没有了它,你写出来的代码就是一串安静的数字和文字,什么也干不了。

这篇文章的目标:把 Java 中所有常用的运算符掰开揉碎讲清楚。每一种运算符都跟着代码示例,每一个容易踩坑的地方都标出来。看完之后,运算符这一关就不会再卡住你。


1 ~> 算术运算符

1.1 基本算术运算

算术运算符就是对数值做加减乘除运算,跟数学课上学的一样:

运算符含义示例结果
+ 加法 5 + 3 8
减法 5 – 3 2
* 乘法 5 * 3 15
/ 除法 5 / 2 2(不是2.5!)
% 取余(求模) 5 % 2 1(5除以2余1)

public class ArithmeticDemo {
public static void main(String[] args) {
int a = 10;
int b = 3;

System.out.println("a + b = " + (a + b)); // 输出:13
System.out.println("a – b = " + (a b)); // 输出:7
System.out.println("a * b = " + (a * b)); // 输出:30
System.out.println("a / b = " + (a / b)); // 输出:3
System.out.println("a % b = " + (a % b)); // 输出:1
}
}

1.2 易错点:整除问题

整数除以整数,结果还是整数(小数部分直接丢掉,不是四舍五入)。

System.out.println(5 / 2); // 输出:2(不是2.5!)
System.out.println(5.0 / 2); // 输出:2.5(浮点数参与 → 小数除法)
System.out.println((double)5/2); // 输出:2.5(强制转换其中一个操作数)

规则: 除号两边的操作数只要有一个是浮点数,就按小数除法算。全是整数就按整数除法算,结果直接截断小数部分。

1.3 取余运算

取余(%)就是求除法运算后剩下的"零头":

System.out.println(10 % 3); // 输出:1(10 ÷ 3 = 3 余 1)
System.out.println(10 % 5); // 输出:0(整除,余数为0)
System.out.println(10 % 3); // 输出:1(Java中结果的正负号跟被除数一致)
System.out.println(10 % 3); // 输出:-1

取余的一个常见用途:判断奇偶数 —— num % 2 == 0 就是偶数,num % 2 == 1 就是奇数。


2 ~> 自增和自减运算符

2.1 ++ 和 —

这两个运算符是编程语言独有的,数学课上学不到:

运算符含义示例等价于
++ 自增,让变量加 1 a++ 或 ++a a = a + 1
自减,让变量减 1 a– 或 –a a = a – 1

2.2 前置 vs 后置(初学者第一道坎)

自增自减运算符可以写在变量前面(前置),也可以写在后面(后置),但结果不同:

写法规则一句话
++a(前置) 先加再用 先给 a 加 1,再用 a 的值
a++(后置) 先用再加 先用 a 的值,再给 a 加 1

public class IncrementDemo {
public static void main(String[] args) {
int a = 5;

// 前置:先加再用
int b = ++a; // a 先自增为 6,然后赋给 b
System.out.println("a = " + a); // 输出:6
System.out.println("b = " + b); // 输出:6

// 后置:先用再加
int c = 5;
int d = c++; // 先把 c 的值 5 赋给 d,c 再自增为 6
System.out.println("c = " + c); // 输出:6
System.out.println("d = " + d); // 输出:5
}
}

对比记忆:

int x = 3;
int y = ++x; // 前置:x 变成 4,y = 4

int m = 3;
int n = m++; // 后置:n = 3,m 变成 4

2.3 自增自减经典陷阱

int i = 1;
i = i++; // ❌ 你以为 i = 2?实际结果 i = 1!
System.out.println(i); // 输出:1

原因分析: i = i++ 的执行过程是:

  • 先把 i 当前的值(1)压入临时存储区
  • i 自增为 2
  • 赋值 i = 临时存储区的值(1)
  • 最终 i 又变回了 1
  • 建议: 初学阶段不要把自增自减和赋值写在同一行里,分两行写清晰又不会踩坑。


    3 ~> 赋值运算符

    3.1 基本赋值 =

    int age = 20; // 把 20 赋给变量 age
    String name = "张三"; // 把 "张三" 赋给 name

    3.2 复合赋值运算符

    复合赋值就是把运算和赋值合二为一:

    写法等价于示例(设 a = 10)
    a += 5 a = a + 5 a 变成 15
    a -= 5 a = a – 5 a 变成 5
    a *= 5 a = a * 5 a 变成 50
    a /= 5 a = a / 5 a 变成 2
    a %= 5 a = a % 5 a 变成 0

    public class AssignmentDemo {
    public static void main(String[] args) {
    int num = 10;

    num += 3; // num = 10 + 3 = 13
    System.out.println("num += 3 → " + num);

    num -= 5; // num = 13 – 5 = 8
    System.out.println("num -= 5 → " + num);

    num *= 2; // num = 8 * 2 = 16
    System.out.println("num *= 2 → " + num);
    }
    }

    3.3 复合赋值自带强制转换

    short s = 10;
    s = s + 1; // ❌ 编译报错:s + 1 结果是 int,不能直接赋给 short

    short s2 = 10;
    s2 += 1; // ✅ 编译通过:复合赋值自带强制转换

    复合赋值运算符(+=、-= 等)内部会自动帮你做类型转换,所以 s2 += 1 不会报错而 s = s + 1 会。但建议不要依赖这个特性,类型匹配着写最安全。


    4 ~> 比较运算符

    4.1 六个比较运算符

    比较运算符用来比较两个值的大小关系,运算结果是 boolean 类型(true 或 false):

    运算符含义示例(设 a=5, b=3)结果
    == 等于 a == b false
    != 不等于 a != b true
    > 大于 a > b true
    < 小于 a < b false
    >= 大于等于 a >= 5 true
    <= 小于等于 a <= 4 false

    public class ComparisonDemo {
    public static void main(String[] args) {
    int score = 85;

    boolean isPass = score >= 60; // true
    boolean isExcellent = score >= 90; // false
    boolean isFullMark = score == 100; // false

    System.out.println("及格?" + isPass);
    System.out.println("优秀?" + isExcellent);
    System.out.println("满分?" + isFullMark);
    }
    }

    4.2 易错点:不要把 == 写成 =

    = 是赋值,== 是比较。这个错翻译过来就是"把B赋给A"和"A等于B吗"的混淆,初学者太常犯了。好在编译器一般能帮你检测出来:

    int x = 10;
    if (x == 5) { // ✅ 判断 x 是否等于 5
    System.out.println("x = 5");
    }

    // if (x = 5) { } // ❌ 编译报错:= 的结果是 int,if 需要 boolean

    另外,== 比较引用类型(如 String)时比较的是内存地址,不是内容。字符串内容比较用 .equals(),后面学到再细讲。


    5 ~> 逻辑运算符

    5.1 三个逻辑运算符

    逻辑运算符用来连接多个 boolean 条件,运算结果也是 boolean:

    运算符含义规则
    && 与(AND) 两边都是 true,结果才为 true
    || 或(OR) 只要有一边是 true,结果就是 true
    ! 非(NOT) 取反,true 变 false,false 变 true

    public class LogicDemo {
    public static void main(String[] args) {
    int age = 20;
    boolean hasTicket = true;

    // &&:两边都为真才为真
    boolean canEnter = age >= 18 && hasTicket;
    System.out.println("能进场?" + canEnter); // true

    // ||:只要一边为真就为真
    boolean isFreeOrVIP = age < 12 || age > 60;
    System.out.println("免票或老年?" + isFreeOrVIP); // false

    // !:取反
    boolean isChild = !(age >= 18);
    System.out.println("是未成年?" + isChild); // false
    }
    }

    5.2 短路特性

    && 和 || 有一个重要特性叫短路:

    • &&:如果左边是 false,右边根本不会执行(因为不管右边是什么,整个表达式都一定是 false)
    • ||:如果左边是 true,右边根本不会执行(因为不管右边是什么,整个表达式都一定是 true)

    public class ShortCircuitDemo {
    public static void main(String[] args) {
    int a = 5;

    // 短路示例:
    boolean result = (a < 3) && (a++ > 10);
    System.out.println("a = " + a); // 输出:5(a++ 根本没执行!)

    int b = 5;
    boolean result2 = (b > 3) || (b++ > 10);
    System.out.println("b = " + b); // 输出:5(b++ 根本没执行!)
    }
    }

    利用短路特性的实战场景:

    // 常见写法:先判空,再访问属性
    if (user != null && user.getName().equals("admin")) {
    // 如果 user 为 null,短路特性保证后面的 getName() 不会被执行
    // 从而避免了 NullPointerException(空指针异常)
    }

    5.3 逻辑运算符的真值表

    aba && ba || b!a
    true true true true false
    true false false true false
    false true false true true
    false false false false true

    6 ~> 条件运算符(三元运算符)

    6.1 三元运算符的语法

    三元运算符是 Java 中唯一需要三个操作数的运算符:

    条件 ?1 :2;

    // 如果条件为 true,整个表达式的值是"值1"
    // 如果条件为 false,整个表达式的值是"值2"

    6.2 实战案例

    public class TernaryDemo {
    public static void main(String[] args) {

    // 案例一:求最大值
    int a = 10, b = 20;
    int max = (a > b) ? a : b;
    System.out.println("最大值:" + max); // 输出:20

    // 案例二:判断成绩等级
    int score = 75;
    String grade = (score >= 60) ? "及格" : "不及格";
    System.out.println("等级:" + grade); // 输出:及格

    // 案例三:判断奇偶数
    int num = 7;
    String type = (num % 2 == 0) ? "偶数" : "奇数";
    System.out.println(type); // 输出:奇数
    }
    }

    6.3 三元运算符可以嵌套

    int score = 85;
    String grade = (score >= 90) ? "优秀" : (score >= 60) ? "及格" : "不及格";
    System.out.println(grade); // 输出:及格

    建议: 嵌套一层还可以接受,嵌套两层以上就该换成 if-else 语句了。三元运算符的定位是简洁地表达二选一,不是取代 if-else。


    7 ~> 位运算符(初识)

    位运算符直接对整数的二进制位进行操作。初学阶段知道有这个东西即可,学 Android Framework 底层解析标志位时经常会用到。

    运算符含义示例(设 a=5(0101))
    & 按位与 5 & 3 = 1(0101 & 0011 = 0001)
    | 按位或 5 | 3 = 7(0101 | 0011 = 0111)
    ^ 按位异或 5 ^ 3 = 6(0101 ^ 0011 = 0110)
    ~ 按位取反 ~5 = -6
    << 左移 5 << 1 = 10(相当于乘以 2)
    >> 右移 5 >> 1 = 2(相当于除以 2)

    System.out.println(5 & 3); // 输出:1
    System.out.println(5 | 3); // 输出:7
    System.out.println(5 << 1); // 输出:10(5 × 2¹ = 10)
    System.out.println(5 << 2); // 输出:20(5 × 2² = 20)


    8 ~> 运算符优先级

    8.1 Java 运算符优先级总表

    当一行代码里出现多个运算符时,谁先算谁后算?这就是优先级问题。

    优先级(从高到低)运算符说明
    最高 () 括号里的先算
    ++ — ! 自增自减、逻辑非
    * / % 乘除取余
    + – 加减
    > < >= <= 比较
    == != 相等判断
    && 逻辑与
    || 逻辑或
    最低 = += -= 等 赋值(最后执行)

    8.2 实战中的优先级问题

    System.out.println(5 + 3 * 2); // 输出:11(先乘后加,等价于 5 + 6)
    System.out.println((5 + 3) * 2); // 输出:16(括号改变优先级)
    System.out.println(10 > 5 && 3 < 1); // 输出:false(先比较再逻辑运算)

    // 不加括号可能翻车的写法:
    boolean flag = true || false && false;
    // 实际执行顺序:true || (false && false)
    // 结果: true

    记住一条原则:不确定优先级的时候,加括号。 多打两个括号不会让代码变慢,但会让你和看代码的人都省去猜优先级的功夫。


    9 ~> 表达式中的类型自动提升

    当表达式中混用了不同类型的数据,Java 会自动把小类型提升为大类型:

    public class TypePromotionDemo {
    public static void main(String[] args) {
    // byte / short / char 参与运算时自动提升为 int
    byte b1 = 10;
    byte b2 = 20;
    int sum = b1 + b2; // byte + byte → int

    // int 和 double 混合运算,int 自动提升为 double
    int count = 10;
    double price = 9.9;
    double total = count * price; // int * double → double
    System.out.println(total); // 输出:99.0

    // 字符串拼接优先级
    System.out.println("结果:" + 10 + 20); // 输出:结果:1020
    System.out.println("结果:" + (10 + 20)); // 输出:结果:30
    System.out.println(10 + 20 + "是结果"); // 输出:30是结果
    }
    }

    特别注意字符串拼接: + 遇到 String 时不再做加法运算,而是做字符串拼接。"结果:" + 10 + 20 是先把 10 拼成 "结果:10",再把 20 拼成 "结果:1020"。要避免这种 bug,加括号就行。


    10 ~> 常见编译运行错误

    编号错误现象错误原因解决方案
    1 bad operand types for binary operator '+' 运算符左右两边类型不兼容 检查操作数类型,确保运算符适用
    2 integer division in floating-point context 整数除法结果赋给了浮点变量 改为 5.0 / 2 或 (double)5 / 2
    3 unexpected type 赋值运算符写在了不合法位置 检查表达式语法
    4 cannot find symbol 变量名拼写错误 检查变量名的大小写和拼写
    5 incompatible types: int cannot be converted to boolean 把 = 写成了 == 条件判断中用 == 而不是 =
    6 operator && cannot be applied to int,int 逻辑运算符用在了非 boolean 类型上 确保 && / || 的操作数是 boolean

    思考 && 总结

    本文覆盖了 Java 中六大类运算符,核心要点总结如下:

  • 算术运算符: + – * / %。整型除法结果也是整型(小数截断)。取余常用于判断奇偶数。(double)5/2 能得到 2.5。
  • 自增自减: ++a(先加再用)和 a++(先用再加)是初学者翻车最多的点。简单起见,初学阶段把它们单独写一行,不要和赋值混在一起。经典陷阱 i = i++ 结果 i 还是原来的值。
  • 比较运算符: 结果是 boolean 类型。注意 = 是赋值,== 才是判断相等。String 比较内容用 .equals(),不要用 ==。
  • 逻辑运算符: &&(全真才真)、||(有真就真)、!(取反)。利用短路特性能写出优雅的判空逻辑:user != null && user.getName().equals("admin")。
  • 三元运算符: 条件 ? 值1 : 值2,简洁表达二选一。嵌套一层以内是优雅,多了就是炫技。
  • 优先级: 不确定时加括号,永远是对的。
  • 运算符讲完了,接下来要学的是"流程控制"——条件判断(if-else)和循环(for/while)。有了变量、数据类型、运算符,再配上流程控制,你就能写出真正有逻辑的程序了。


    结尾

    各位小伙伴,本文的内容到这里就全部结束了,源码骑士在这里再次感谢您的阅读!

    源码骑士 — Android Framework & 全栈开发

    👀 关注:跟博主一起从源码视角深耕底层原理,见证每一次成长

    ❤️ 点赞:让优质内容被更多人看见,让知识传递更有力量

    ⭐ 收藏:把核心知识点存好,在需要时随时查、随时用

    💬 评论:分享你的经验或疑问,评论区一起交流避坑

    🔄 一键四连:不要忘记给博主"一键四连"哦!今日源码拆解达成!

    🗡️ 寄语:技术之路难免有困惑,但同行的人会让前进更有方向

    结语:希望对学习 Java 运算符的小伙伴有所帮助,接下来要进入流程控制啦!不要忘记给博主"一键四连"哦!

    往期回顾:

    【1.Java基础】Java初识:从零搭建开发环境到写出第一个HelloWorld

    【1.1Java基础】JDK安装常见问题教辅-从踩坑到排雷

    【1.2Java基础】Win10环境变量配置详解-从原理到排雷

    【2.Java基础】Java常量与变量-从基本类型到类型转换全面掌握

    赞(0)
    未经允许不得转载:171主机测评 » 【3.Java基础】Java运算符详解:从算数运算到逻辑判断,一篇文章全部掌握
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址