11. 【Java教程】Java 运算符

简介: 11. 【Java教程】Java 运算符

我们已经学会了如何声明变量和赋值变量。那么你可能想知道如何对它们进行操作。本小节我们学习的运算符就可以对它们进行运算。


运算符是一些特殊的符号,它们对一个,两个或多个操作数执行特定的运算,然后返回一个结果。这里的操作数指的就是运算符操作的实体。


Java提供了一组丰富的运算符来操作变量。 我们可以将所有Java运算符分为以下几类:


算术运算符

关系运算符

位运算符

逻辑运算符

赋值运算符

其他运算符

本小节我们将按照以上分类介绍 Java 中的运算符,并在最后介绍运算符的优先级。

1. 算术运算符

1.1 概述

Java 语言提供了执行加减乘除四则运算的运算符。 算数运算符被用在数学表达式中,可以使用任意嵌套的小括号,其作用与数学中相同。下表列出了算术运算符:

(在例子中,初始化两个整型变量a、b:int a = 2; int b = 4; image.png

1.2 实例

以下是算数运算符的实例程序。

加法运算符使用实例:

public class ArithmeticOperators1 {
    public static void main(String[] args) {
        // 声明两个整型变量 num1,num2 分别赋值为 2, 3
        int num1 = 2, num2 = 3;
        // 使用加法运算符,对num1和num2执行相加操作,并将返回结果赋值给result
        int result = num1 + num2;
        System.out.println( num1 + " + " + num2 + " = " + result);
    }
}

运行结果

2 + 3 = 5

减法运算符使用实例:

public class ArithmeticOperators2 {
    public static void main(String[] args) {
        // 声明两个整型变量 num1, num2 分别赋值为 5, 3
        int num1 = 5, num2 = 3;
        // 使用减法运算符,让 num1 加上 num2,并将返回结果赋值给result
        int result = num1 + num2;
        System.out.println( num1 + " + " + num2 + " = " + result);
        // 计算 num2 - num1 的结果
        int result1 = num2 - num1;
        System.out.println( num2 + " - " + num1 + " = " + result1);
    }
}

运行结果:

1. 5 + 3 = 8
2. 3 - 5 = -2

乘法运算符使用实例:

public class ArithmeticOperators3 {
    public static void main(String[] args) {
        // 声明两个整型变量 num1, num2 分别赋值为 2, 5
        int num1 = 2, num2 = 5;
        // 使用乘法运算符,让 num1 与 num2 相乘,并将返回结果赋值给result
        int result = num1 * num2;
        System.out.println( num1 + " * " + num2 + " = " + result);
    }
}

运行结果:

2 x 5 = 10

除法运算符使用实例:

public class ArithmeticOperators4 {
    public static void main(String[] args) {
        // 声明两个整型变量 num1, num2 分别赋值为 10, 2
        int num1 = 10, num2 = 2;
        // 使用除法运算符,让 num1 除以 num2,并将返回结果赋值给result
        int result = num1 / num2;
        System.out.println( num1 + " / " + num2 + " = " + result);
    }
}

运行结果:

10 / 2 = 5

取余运算符使用实例:

public class ArithmeticOperators5 {
    public static void main(String[] args) {
        // 声明两个整型变量 num1, num2 分别赋值为 5, 2
        int num1 = 5, num2 = 2;
        // 使用取余运算符,让 num1 对 num2 取余,并将返回结果赋值给result
        int result = num1 % num2;
        System.out.println( num1 + " % " + num2 + " = " + result);
    }
}

编译执行代码,屏幕上将会打印:

5 % 2 = 1

自增、自减运算符使用实例:

public class ArithmeticOperators6 {
    public static void main(String[] args) {
        // 声明两个整型变量 num1, num2 分别赋值为 5, 2
        int num1 = 5, num2 = 2;
        // 打印 num1 和 num2
        System.out.println("num1=" + num1);
        System.out.println("num2=" + num2);
        num1 ++;
        num2 --;
        System.out.println("num1自增后:" + num1);
        System.out.println("num2自减后:" + num2);
    }
}1. publi

运行结果:

1. num1=5
2. num2=2
3. num1自增后:6
4. num2自减后:1

另外,整型之间的除法运算是整除,这也就意味着2 / 4的结果为0,如果我们想像数学一样得到一个小数,可以使用浮点类型的操作数。例如:

public class OperatorDemo1 {
    public static void main(String[] args) {
        // 分组初始化两个整型变量i1、i2,值分别为2、4
        int i1 = 2, i2 = 4;
        // 使i1除以i2,并将返回结果赋值给i3
        int i3 = i1 / i2;
        System.out.println("整型2除以整型4的结果为:" + i3);
        // 分组初始化两个浮点型变量f1、f2,值分别为2、4
        float f1 = 2f, f2 = 4f;
        // 使f1除以f2,并将返回结果赋值给f3
        float f3 = f1 / f2;
        System.out.println("浮点型2除以浮点型4的结果为:" + f3);
    }
}

运行结果:

1. 整型2除以整型4的结果为:0
2. 浮点型2除以浮点型4的结果为:0.5

要特别注意,在 Java 语言中,算数运算符不能作用于不同类型的操作数。我们来看一个反例:

public class OperatorDemo1 {
    public static void main(String[] args) {
        // 初始化布尔类型的变量b,值为true
        boolean b = true;
        // 初始化整型变量i,值为20
        int i = 20;
        // 使用加法运算符,让i与b相加
        int result = i + b;
    }
}

编译代码,将会报错:

javac OperatorDemo1.java
OperatorDemo1.java:7: 错误: 二元运算符 '+' 的操作数类型错误
        int result = i + b;
                       ^
  第一个类型:  int
  第二个类型: boolean
1 个错误

编译器给出明确提示:加法运算符的操作数类型错误。这是因为 Java 是强类型的语言,不同类型的操作数的算数运算是违规的,这个原理同样适用于其他算数运算符,此处不再一一列举。


还有一点,自增自减运算符是有前后之分的,++i表示先加1再引用i,i++表示先引用i再加1。将在下一小节举例介绍。



2. 关系运算符

2.1 概述

关系运算符又称为比较运算符,比较的结果是一个布尔类型的值(truefalse)。

Java 语言有几个可用于比较变量的运算符,如下表所示:

(在例子中,初始化两个整型变量a、b:int a = 2; int b = 4; image.png Tips:在比较两个操作数是否相等时,必须使用“==”而不是“=”。

3.2 实例

下面是一个比较运算符的实例程序:

public class OperateDemo2 {
    public static void main(String[] args) {
        // 初始化一个双精度浮点型变量d1,值为10
        double d1 = 10;
        // 初始化一个整型变量i1,值也为10
        int i1 = 10;
        System.out.println("id == i1的结果为:" + (d1 == i1));
        System.out.println("id != i1的结果为:" + (d1 != i1));
        System.out.println("id > i1的结果为:" + (d1 > i1));
        System.out.println("id < i1的结果为:" + (d1 < i1));
        System.out.println("id >= i1的结果为:" + (d1 >= i1));
        System.out.println("id <= i1的结果为:" + (d1 <= i1));
    }
}

运行结果:

id == i1的结果为:true
id != i1的结果为:false
id > i1的结果为:false
id < i1的结果为:false
id >= i1的结果为:true
id <= i1的结果为:true

Tips><>=<= 这几个运算符左右两边的操作数必须是byteshortintlongdoublefloatchar这几种数据类型;而==!=运算符的操作数既可以是基本数据类型,又可以是引用数据类型。

3. 位运算符

Java 语言还提供了对整数类型执行按位和移位操作的运算符,称作位运算符

它在实际的编码中并不常用,这部分内容了解即可。

假设a = 60,b = 13;它们的二进制格式表示将如下:

a = 0011 1100
b = 0000 1101
-----------------
a & b = 0000 1100
a | b = 0011 1101
a ^ b = 0011 0001
~a = 1100 0011

下表列出了位运算符的基本运算,假设整数变量 a 的值为 60 和变量 b 的值为 13: image.png

4. 逻辑运算符

4.1 概述

逻辑运算符可以在表达式中生成组合条件,例如在执行特定语句块之前必须满足的两个或多个条件。使用逻辑运算符,可以描述这些组合条件。逻辑运算的返回结果只能为真或假。

Java 语言中的逻辑运算符,如下表所示:

(在例子中,初始化两个整型变量a、b:int a = 0; int b = 1; image.png

4.2 短路运算

&&||运算符存在短路行为。短路的意思是:只有在需要的时候才会判断第二个操作数的真假。例如:

class LogicOperators {
    public static void main(String[] args){
        int a = 1, b = 2;
        if((a == 2) && (b == 2)) {
            System.out.println("a和b都等于2");
        }
        if((a == 1) || (b == 1)) {
            System.out.println("a等于1或b等于1");
        }
    }
}

运行结果:


a等于1或b等于1

程序解析:有两个整型变量a和b,值分别为1和2。第一个if语句的条件为逻辑与运算,其第一个操作数a == 2为假,所以无论第二个操作数是真是假,都不去判断,条件直接被判定为假;第二个if语句的条件为逻辑或运算, 其第一个操作数a == 1为真,所以无论第二个操作数是真是假,都不会去判断,条件直接被判定为真。这就是所谓的短路。

5. 赋值运算符

5.1 概述

赋值运算符是为指定变量分配值的符号。下标列出了常用 Java 中常用的赋值运算符: image.png

5.2 实例

我们来看一个赋值运算符的实例:

public class OperateDemo5 {
    public static void main(String[] args) {
        // 分组初始化三个变量 num1、num2、result,值分别为 20、10、0
        int num1 = 20, num2 = 10,  result = 0;
        System.out.println("初始值:");
        System.out.print("num1=" + num1 + '\t');
        System.out.print("num2=" + num2 + '\t');
        System.out.print("result=" + result + "\t\n");
        System.out.println("开始赋值运算:");
        result += num1;
        System.out.println("result += num1 结果为:" + result);
        result -= num2;
        System.out.println("result -= num2 结果为:" + result);
        result *= num1;
        System.out.println("result *= num1 结果为:" + result);
        result /= num2;
        System.out.println("result /= num2 结果为:" + result);
        result %= 15;
        System.out.println("result %= 15 结果为:" + result);
    }
}

运行结果:

初始值:
num1=20 num2=10 result=0  
开始赋值运算:
result += num1 结果为:20
result -= num2 结果为:10
result *= num1 结果为:200
result /= num2 结果为:20
result %= 15 结果为:5

6. 其他运算符

6.1 条件运算符(? :)

条件运算符也称为三元运算符。我们会在条件语句小节中再次对其介绍。

该运算符由三个操作数组成,用于判断布尔表达式。它的目的是确定应将哪个值分配给变量。条件运算符的语法为:

变量 = (布尔表达式) ? 值1 : 值2

如果布尔表达式为真,就将值1分配变量,否则将值2分配给变量。

下面是一个实例程序:

1. public class ConditionalOperators {
    public static void main(String[] args) {
        int age = 15;
        System.out.println(age >= 18 ? "在中国你已经成年" :  "在中国你还未成年"); 
    }
}

由于age变量值为15,小于18,age >= 18返回结果为假,因此编译执行后,屏幕将打印:

6.2 instanceof 运算符

Tips:了解 instanceof 运算符需要一些面向对象的前置知识。目前你可以选择性学习。

instanceof运算符将对象与指定类型进行比较,检查对象是否是一个特定类型(类类型或接口类型)。

instanceof 运算符的语法为:

( Object reference variable ) instanceof  (class/interface type)

如果instanceof左侧的变量所指向的对象,是instanceof右侧类或接口的一个对象,结果为真,否则结果为假。

public class InstanceOfOperators1 {
    public static void main(String[] args) {
        String name = "mybj";
        boolean b = name instanceof String; 
        System.out.println("结果为:" + b);
    }
}

由于字符串变量nameString类型,所以执行代码,屏幕会打印:

结果为:true

注意,instanceof运算符不能用于操作基本数据类型,如果将字符串类型name变量改为一个char类型的变量,编译代码将会报错:

InstanceOfOperators1.java:4: 错误: 意外的类型
        boolean b = name instanceof String;
                    ^
  需要: 引用
  找到:    char
1 个错误

7. 运算符的优先级

当多种运算符在一同使用的时候,会有一个执行先后顺序的问题。

下表中的运算符按优先顺序排序。运算符越靠近表格顶部,其优先级越高。具有较高优先级的运算符将在具有相对较低优先级的运算符之前计算。同一行上的运算符具有相同的优先级。 image.png 相同优先级的运算符出现在同一表达式中时,如何控制它们计算的先后呢。我们来看一个实例:

public class OperateorsPriority {
    public static void main(String[] args) {
        int a = 2;
        int b = 4;
        int c = 6;
        int result = a + b - c + a;
      System.out.println("result = " + result);
    }
}

在计算result的语句的右侧,+ 、-两个运算符优先级相同,如果我们不加以控制,将按照从左到右顺序计算,打印结果为result = 2;但是如果我们想先计算a + b和c + a的值,再计算两者之差,我们可以使用括号()将其顺序进行控制:(a + b) - (c + a),再执行代码将打印我们想要的结果:result = -2。



8. 小结

本小节我们按照分类介绍了Java的运算符,并且在最后给出了运算符的优先级表格。本节内容可能有些繁杂,但细节不必全部记住,你可以在需要的时候回过头来查查表格。当然,最好的方式还是多写多练,对照实例和表格自己敲敲代码,用心分析代码执行的流程,是增强记忆最好的方式。

相关文章
|
8天前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
152 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
28天前
|
消息中间件 Java 数据库
自研Java框架 Sunrays-Framework使用教程「博客之星」
### Sunrays-Framework:助力高效开发的Java微服务框架 **Sunrays-Framework** 是一款基于 Spring Boot 构建的高效微服务开发框架,深度融合了 Spring Cloud 生态中的核心技术组件。它旨在简化数据访问、缓存管理、消息队列、文件存储等常见开发任务,帮助开发者快速构建高质量的企业级应用。 #### 核心功能 - **MyBatis-Plus**:简化数据访问层开发,提供强大的 CRUD 操作和分页功能。 - **Redis**:实现高性能缓存和分布式锁,提升系统响应速度。 - **RabbitMQ**:可靠的消息队列支持,适用于异步
自研Java框架 Sunrays-Framework使用教程「博客之星」
|
30天前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
52 1
|
30天前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
39 0
|
30天前
|
Java 数据库连接 数据处理
探究Java异常处理【保姆级教程】
Java 异常处理是确保程序稳健运行的关键机制。它通过捕获和处理运行时错误,避免程序崩溃。Java 的异常体系以 `Throwable` 为基础,分为 `Error` 和 `Exception`。前者表示严重错误,后者可细分为受检和非受检异常。常见的异常处理方式包括 `try-catch-finally`、`throws` 和 `throw` 关键字。此外,还可以自定义异常类以满足特定需求。最佳实践包括捕获具体异常、合理使用 `finally` 块和谨慎抛出异常。掌握这些技巧能显著提升程序的健壮性和可靠性。
47 4
|
2月前
|
存储 Java
java中的常见运算符的计算方式
本文介绍了计算机中二进制数的原码、反码和补码的概念及其转换方式。原码是符号位加真值的绝对值;反码中正数不变,负数其余位取反;补码在反码基础上加1。文章还详细解释了Java中的常见运算符(如按位与、或、异或、移位等)如何基于二进制进行计算,并探讨了使用补码的原因,包括统一符号位处理和扩展表示范围。通过具体代码示例帮助理解这些概念。
java中的常见运算符的计算方式
|
2月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
1432 1
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
2月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
185 26
|
2月前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
90 0
|
2月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)