赋值运算符主要是这几种:=、+=、-=、*=、/=、%=,其它和二进制相关的内容这里就不详细解释了。赋值类的运算符包括基本赋值运算符(=)和扩展的赋值运算符(+=、-=、*=、/=、%=)。我们来看一段代码:

public class AssignmentOperatorTest01 {
    public static void main(String[] args) {
        //基本的赋值运算符
        int i;
        i = 10;
        System.out.println("i = " + i);
        i = 100;
        System.out.println("i = " + i);
        //扩展的赋值运算符
        int x = 10;
        x += 1; //等同于 x = x + 1
        System.out.println("x = " + x); //11
        int y = 10;
        y -= 1; //等同于 y = y - 1
        System.out.println("y = " + y); //9
        int z = 10;
        z *= 2; //等同于 z = z * 2
        System.out.println("z = " + z); //20
        int m = 10;
        m /= 3; //等同于 m = m / 3
        System.out.println("m = " + m); //3
        int n = 10;
        n %= 3; //等同于 n = n % 3
        System.out.println("n = " + n); //1
    }
}

        x += 1 和 x = x + 1 真的是完全相同的吗?我们来看下面的代码:

public class AssignmentOperatorTest02 {
    public static void main(String[] args) {
        byte b = 10;
        // 以下程序编译报错,编译器提示错误信息为:
        // Type mismatch: cannot convert from int to byte
        /*
          编译没有通过的原因:b 是 byte 类型,1 是 int 类型,根据之前
          讲解的类型转换规则得知,byte 和 int 混合运算最后结果是
          int 类型,int 类型的值无法直接赋值给 byte 类型的变量 b,
          所以编译报错。
        */
        // b = b + 1; 
        b += 1;  //  编译通过并可以正常运行
        System.out.println("b = " + b); //11
        // 通过以上的测试得出:b = b + 1 和 b += 1 是不一样的
        // 那么 b += 1 等同于什么呢?
        /*
          实际上 java 对于扩展类的赋值运算符进行了特殊的处理,
          所有的扩展赋值运算符,最终都不会改变运算的结果类
          型,假设前面的变量是 byte 类型,那么后面的表达式运
          算之后的结果还是 byte 类型。所以实际上 b += 1 等同于:
        */
        b = (byte)(b + 1);
        System.out.println("b = " + b);   // 12
        b += 1000;   // 编译通过,并且可以正常运行
        /*
          以上代码实际上等同于:b = (byte)(b + 1000);
          分析得出,显然结果已经超出了 byte 类型取值范围,
          所以精度一定会损失,最终的结果需要对计算机
          二进制的原码反码补码进行研究。
        */
        System.out.println("b = " + b);   //  -12
    }
}

        根据以上代码测试得出,对于扩展类的赋值运算符在运算的过程中不会改变运算的结果类型,也就是说 byte b = 100; b += 1000;b 变量最初是 byte 类型,最后的运算结果还是一个 byte类型。这是一条固定的语法规则。在以后使用扩展类赋值运算符的时候要谨慎,不小心就会精度损失的。