final int i; // 因为要在构造函数中进行初始化,所以此处便不可再给值
final int i2 = (int) (Math.random() * 20);
static final int i3 = (int) (Math.random() * 20);
Bat() {
i = 100;
}
publicstaticvoidmain(String[] args){
Bat b = new Bat();
// b.i=25; syntax error i是不可变的
System.out.println( "bbbb: " + "i2 = " + i2 + ", i3 = " + i3);//bbbb: i2 = 4, i3 = 6
Bat c = new Bat();
System.out.println( "cccc: " + "i2 = " + i2 + ", i3 = " + i3);//bbbb: i2 = 6, i3 = 6
}
总结:在同一个对象里final是不可变的!在不同对象就不一定了!所以单纯的final修饰是只针对一个对象的
而在final前加入static后则变为修饰类了,是类变量,只会被加载一次,所以i3无论新建多少个对象都还是6!
所以:一定要区分final与static final的细微差别。