温故知新

上一节我们讲到了Java中的赋值操作符,用案例的方式讲解了赋值操作符的使用方式,以及其作用于基本数据类型和引用数据类型的不同效果。请回答一下几个问题:

  1. 赋值表达式的左值和右值分别需要符合什么规则?
  2. 赋值操作符作用于基本数据类型和作用于引用数据类型有什么异同?

如果发现有回答不上的问题,请回顾上节内容!如果还不懂,请直接@我!

更上一层楼

今天我们主要讲解以下内容哦!!!

  1. 算术操作符
  2. 自增自减操作符
  3. 关系操作符

算术操作符

基本算术操作符

Java中的基本算术操作符主要包括加号(+)、减号(-)、乘号(*)、除号(/)和取模(%)运算。

运算示例

public class Operation {
    public static void main(String [] args) {
        int a = 10;
        int b = 5;
        int c = a + b;
        int d = a - b;
        int e = a / b;
        int f = a * b;
        int g = 3 % 2;
        System.out.println("c="+c+";d="+d+";e="+e+";f="+f+";g="+g);
    }
}
//output
//c=15;d=5;e=2;f=50;g=1
//+-*/相对简单,就不多叙述了;重点是取模运算(%),也叫做取余运算
//即取整除之后的余数
组合操作符

在Java中可以把操作符和赋值操作符合并为一个操作符,如+=-=*=/=等;在这里我们主要举例基本算术操作符和赋值操作符的组合使用。Java中所有的操作符都可以与赋值操作符搭配,只要其有实际意义就行

运算示例

public class Operation {
    public static void main(String [] args) {
        int a = 10;
        //相当于 a = a + 5
        int a += 5;
        System.out.println(a);
        //相当于 a = a - 5
        int a -= 5;
        System.out.println(a);
        //相当于 a = a * 5
        int a *= 5;
        System.out.println(a);
        //相当于 a = a / 5
        int a /= 5;
        System.out.println(a);
    }
}
//output
//15
//5
//50
//2
加减算术操作符的特殊用法

+、-算术操作符,既可以作为一元操作符,也可以作为二元操作符(元的概念,几元指有几个值参与了操作!)

一元减号操作符的作用是转变数据的符号,如 1 => -1;而一元加号操作符的作用是将较小类型的操作数提升为int类型,如把一个short数提升为int类型。

自增自减操作符

Java提供了大量的快捷运算操作符。其中,自增和自减操作符是日常中用的比较多的。自增操作符用符号++表示,自减操作符用符号--表示。

自增自减操作符有两种使用方式(假设我们有一个变量a):

  1. 前缀式:++a,其表示先执行运算,再生成变量的值作为结果。
  2. 后缀式:--a,其表示先生成变量的值作为结果,再进行运算。

运算示例

public class Operation {
    public static void main(String [] args) {
        int a = 5;
        //相当于 a = a + 1
        System.out.println(a++);
        //相当于 a = a + 1
        System.out.println(++a);
    }
}
//output
//5
//6
//可能会有同学疑惑,为什么结果是这样的呢?
//a++,表示先生成变量的值作为结果,再进行运算
//因此返回的是没进行运算前的值
//因此是5
//++a,表示先进行运算,再生成变量的值作为结果
//因此返回的是进行运算之后的值
//因此是6

关系操作符

关系操作符是判断两个值或者说两个对象之间关系的操作符,其返回一个boolean结果。关系操作符包括><>=<===!===!=适用于所有的基本数据类型,而其他操作符不适用于boolean类型

运算示例

public class Operation {
    public static void main(String [] args) {
        int a = 10;
        int b = 5;
        System.out.println("a>b:"+(a>b));
        System.out.println("a<b:"+(a<b));
        System.out.println("a>=b:"+(a>=b));
        System.out.println("a<=b:"+(a<=b));
        System.out.println("a!=b:"+(a!=b));
        System.out.println("a==b:"+(a==b));
    }
}
//output
//a>b:true
//a<b:false
//a>=b:true
//a<=b:false
//a!=b:true
//a==b:false
==操作符到底在比较什么?

请看以下例子:

public class Operation {
    public static void main(String [] args) {
        Integer i1 = new Integer(10);
        Integer i2 = new Integer(10);
        Value v1 = new Value();
        Value v2 = new Value();
        v1.i = v2.i = 10;
        System.out.println("i1 == i2?" + i1 == i2);
        System.out.println("i1 != i2?" + i1 != i2);
        System.out.println("i1.equals(i2)?" + i1.equals(i2));
        System.out.println("v1 == v2?" + v1 == v2);
        System.out.println("i1.equals(i2)?" + i1.equals(i2));
    }

    class Value {
        int i;
        public void setI(int i) {
            this.i = i;
        }
        public int getI() {
            return this.i;
        }
    }
}
//output
//i1 == i2?false
//i1 != i2?true
//i1.equals(i2)?true
//v1 == v2?false
//i1.equals(i2)?false

在对以上案例的答案进行解读之前,我们需要先清楚一个知识点:==操作符和!=操作符比较基本数据类型时比较的是值,而比较对象时比较的是对象的引用。因此对于前两个输出,我们可以理解了,因为通过new操作符获得的Integer对象,在内存中都有各自的物理地址,因此他们的引用是不同的(引用实际放的就是物理地址)。

那么如何比较两个对象的实际内容是否相等呢?所有的对象都有equals方法,可用于比较对象的实际内容是否相等。但是这个方法不适用于基本数据类型。

那么我们就可以理解,第三个输出,由于i1和i2的值都是10,因此他们通过equals方法比较出来是相等的。但是为什么第四、第五个输出又是false呢?因为equals方法默认比较的实际还是对象的引用,除非我们重写该方法,并重新定义其实现。很显然,Integer这个类中,重写了该方法。

时时回顾

今天我们主要讲解了Java中的算术运算符、自增自减操作符和关系操作符。这些操作符在我们日后的生活中经常用到,因此务必牢牢掌握!

如果觉得我写的内容对你有帮助,可以关注我的微信公众号,和我一起进步!

03-06 08:01