final可以修饰属性,方法,类。----对属性进行显示初始化
【属性】:被final修饰后,就是常量,只能赋值一次,且不能被改变
【方法】:被final修饰,不能被子类覆盖,可以被继承
【类】:被final修饰,该类的所有方法都是final修饰的。不能被继承(如String类)
方法中的匿名内部类只能访问final:
匿名内部类写在方法里,java中语句都是写在方法里。
如果在方法的属性上加上final,那么他就会成为内部类的数据成员,当方法调用结束,局部变量全都死亡(包括final修饰的局部变),但是JVM会把final型局部变量拷贝一份到局部内部类中,因为final的值是不变的,所以能访问到final修饰的局部变量,其实这时候访问的已经是自己类里面的final的副本。
public class Test {
2
3 public static void main(String[] args) {
4
5 String country = "China";
6 String name = "qqyumidi";
7
8 String userInfo = country + name; //编译后此处依然是country和name变量
9 String user = "China" + "qqyumidi"; //编译后此处直接变成Chinaqqyumidi
10
11 }
12 }
在第九行中,结果会直接是Chinaqqyumidi,
而在第八行,由于是2个变量进行运算,编译时期不会有具体的值。但是如果把String变量用final修饰,那么编译时就能确定它的值(final修饰后是不变的),所有编译时直接将其变量转换成值本身去表示。