1.1当给全局的静态字段加上final时,系统是不会给其赋默认值的,若不手动初始化,会编译时错误——Variable 'xxx' might not have been initialized。
1.2对于书上的这句话“对于基本类型,final使数值恒定不变,而对于对象引用,final使引用恒定不变,一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身确实可以被修改的。”——代码试过之后,3个int数组,a是final,将b赋给a后,再改变b的元素,a也会变,但把c赋给b,a不会变化,也可以直接修改a的元素来改变结果。
3个对象a,b,c,他们都有name这个属性,a是final,将b赋给a后,再改变b的name,a的name也变化了,但是把c赋给b,a不会变化,也可以直接修改a的name来改变。
而基本类型的final只要被赋值了,你就无法再对它进行任何数据操作。
总结:final无论是创建的时候就被初始化了还是后面才对它赋值,其终究只是指向了一个内存地址,这个内存地址里的东西可以改变,但地址却不能变。就好比你在外,但是家里的物品变了你还能回到家,知道这是自己家,但如果是搬家了,但是家人没有告诉你,你就回不去了,不知道家在哪里。
2.补充一点:今天看String相加的时候看到的当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。
例:
String string = "java"; String a = "ja"; String b = "va"; System.out.println((a + b) == string); // false final String c = "ja"; final String d = "va"; System.out.println((c + d) == string); // true