Java中final关键字总结
final在java中的用法有很多,可以修饰field,可以修饰Method,可以修饰Class,而且final在多线程环境中保证了对象状态的不变性,下面就系统的总结一下Java中final关键字的用法 修饰Variable/field 修饰primitive变量,变量一旦赋值就不再可变。 final修饰基本数据类型变量和String类型时,类似于C++的const 3种变量会被隐式的定义为final:3.1. 接口中的field是final的3.2. Java7中出现的try with resource语句中的变量是隐式的final类型,如下面的代码,inputStream虽然未被声明为final,但是如果试图在try块里面重新对inputStream赋值的话,就会产生编译异常,不能给final变量赋值 12345try (FileInputStream inputStream = new FileInputStream("text.txt")){inputStream = new FileInputStream("");} catch (Exception e) { e.printStackTrace();} 修饰引用实例类型变量,变量被赋值后,变量指向的引用的值可以变,但是不能重新指向新的引用,即final只关心引用本身,而不关心final引用的内容。 12345678public static void main(String[] args) { final User user = new User("xuan1",23); System.out.println(user.getAge()); //输出23 user.setAge(24); System.out.println(user.getAge()); //输出24 user = new User("xuan2",25); //编译错误,提示不能赋值给final变量 System.out.println(user.getAge());} 修饰实例成员变量时,必须在定义的时候初始化:直接赋值,构造器初始化,或代码块中初始化,或的意思是这三种方式只能选择一种,否则编译报错。 修饰静态成员变量时,必须在变量定义的时候初始化:直接赋值,静态代码块中赋值 Tips: 有一种特殊情况:System.in,System.out,System.err 是静态域但是没有在定义的时候或者静态代码块中初始化,而是使用了set方法来设置值。 JDK8以前内部类访问外部类的变量时要求变量为Final类型,JDK8之后,只要求外部类为事实不可变变量,不一定要加上final