有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 1 楼答案

    How does JVM process keyword “final” ? JVM in runtime doesn't know about this modifier. Compilator does.

    您的问题不是最终问题,要消除错误,请执行以下操作:

    b3=(byte)(b1+b2);   // line isn't invalid now
    

    对前面定义的最终变量的一次性赋值本身就是一个有效语句

    第3行-编译器只需将您的值作为整型常量内联

       L4
        LINENUMBER 30 L4
        BIPUSH 10
        ISTORE 4
    

    第4行-编译器不能这样做

       L5
        LINENUMBER 31 L5
        ILOAD 1
        ILOAD 2
        IADD
        I2B
        ISTORE 3
    

    接下来读: http://www.javatpoint.com/final-keyword

  2. # 2 楼答案

    错误发生在第4行而不是第3行,因为编译器知道final变量的值,但不知道非final变量的值。编译器会看到final,并且在使用常量值之前,该变量已被明确赋值,并且由于该变量是final,因此该值无法更改。因为编译器知道这些值,所以它知道在值10的转换中没有损失(b4+b5)。事实上,它们实际上是常量,你正在做b6=10——如果你看一下如果我们删除第4行并调整第6行所生成的字节码,我们会发现这正是编译器所做的:完全优化b4b5

    如果您为b4b5100)选择了不同的值,那么第3行也会出现错误:

    byte b1=1,b2=2,b3,b6; 
    final byte b4=100,b5=100; 
    b6=b4+b5;  // line3 error: incompatible types: possible lossy conversion from int to byte
    b3=b1+b2;  // line4 error: incompatible types: possible lossy conversion from int to byte
    System.out.println(b3+b6);
    

    Live on ideone

    这里有一些东西可以证明这一点

    byte b1=1,b2=2,b3,b6; 
    final byte b4=4,b5=6; 
    b6=b4+b5;  // line3
    //b3=b1+b2;  // line4
    //System.out.println(b3+b6);
    System.out.println(b6);
    

    下面是拆解:

    public static void main(java.lang.String[]) throws java.lang.Exception;
        Code:
           0: iconst_1
           1: istore_1
           2: iconst_2
           3: istore_2
           4: bipush        10
           6: istore        4
           8: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
          11: iload         4
          13: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
          16: return
    

    注意

    4: bipush        10
    6: istore        4
    

    。。。它将文本值10存储在b6