算术运算符

测试一:JVM会如何处理这几种类型的运算
低于4B的,全部转成int进行运算

  1. public class Add {
  2. public static void addByte() {
  3. byte a = 1;
  4. byte b = 2;
  5. System.out.println(a + b);
  6. }
  7. public static void addChar() {
  8. char a = 1;
  9. char b = 2;
  10. System.out.println(a + b);
  11. }
  12. public static void addShort() {
  13. short a = 1;
  14. short b = 2;
  15. System.out.println(a + b);
  16. }
  17. public static void addInt() {
  18. int a = 1;
  19. int b = 2;
  20. System.out.println(a + b);
  21. }
  22. }

测试二:如何处理8字节数据的运算:double、long
会涉及到数据的合与拆,需要画堆栈图

public class Add {

    public static void addLong() {
        long a = 1;
        long b = 2;

        System.out.println(a + b);
    }

    public static void addDouble() {
        double a = 1;
        double b = 2;

        System.out.println(a + b);
    }

}

测试三:不同类型进行运算

public class DifferentAdd {

    // 隐含转换 自动类型转换
    static void t1() {
        int a = 1;
        long b = 2;

        System.out.println(a + b);
    }

    // 显示转换
    static void t2() {
        double a = 1;
        int b = (int) a;

        System.out.println(a + b);
    }
}

强制类型转换

什么时候需要强制类型转换
1、字节多的转字节少的:8=>4、4=>2、4=>1
2、不同类型之间:整型转浮点型、浮点型转整型

加加减减运算符

点击查看

image.png

赋值运算符

包含这些
image.png

测试一:JVM执行这两个方法的代码,底层有何差异
一个是iinc指令,一个是很多指令的组合,跟++操作类似

public class TestAddEqual {

    static void t1() {
        int a = 10;
        a += 20;
        System.out.println(a);
    }

    static void t2() {
        double a = 10;
        a += 20;
        System.out.println(a);
    }
}

测试二:JVM执行这三个方法的代码,底层有何差异
JVM处理t1、t2与处理++类似,处理其他的操作符就是通过指令组合实现

public class TestAddEqual {

    static void t1() {
        int a = 10;
        a += 20;
    }

    static void t3() {
        int a = 10;
        a -= 20;
    }

    static void t4() {
        int a = 10;
        a *= 20;
    }
}

运算符优先级

对比这三段代码:

  1. JVM在运行时是如何识别运算符优先级的呢?
  2. JVM处理方法t1与其他两个方法有什么不同呢?

    public class TestPriority {
    
     void t1() {
         int a = (1 + 2) * 3;
     }
    
     void t2() {
         int x = 1;
         int y = 2;
         int z = 3;
    
         int a = (x + y) * z;
     }
    
     void t3() {
         int x = 1;
         int y = 2;
         int z = 3;
    
         int a = x + y * z;
     }
    }