final关键字
1.可以修饰类,函数,变量;
2.被final修饰的类不可以被继承,但其可以继承其他类
3.被final修饰的方法步可以被覆写,但可以覆写其父类的方法
4.被final修饰的变量是一个常量,只能赋值一次;既可以修饰成员变量,也可以修饰局部变量
在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字,方便阅读。
作为常量,书写规范:所有字母均大写,如果有多个单词组成,单词通过_来连接
5.内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量(JDK1.8中可以不加final)
6.被final修饰的引用型变量,表示该变量的引用不能改变(因为引用存的是分配好的地址,加上final后这个地址就定死了,也就是变量的引用不能改变了),而不是该变量的值不能变(地址定死了,意味着这个引用不能再指向别的对象了,但定死的地址里的数据可以改变,也就是该变量的值可以改变)。
如:private final Date hiredate;
仅仅意味着,存储在hiredate变量中的对象引用在对象构造之后不能被改变,而并不意味着hiredate对象是一个常量。
代码实例:
package finatest; public class Test { public static void main(String[] args) { final Dog dog = new Dog("欧欧"); //执行new操作的时候JVM会分配一块内存,用来保存新创建的实例,实例对应的属性值都保存在这块内在中。 //给dog赋值的时候,实际上dog保存的是这块内存的地址。 //final限制的是dog的值只能是这个内存的地址,不能修改成其他地址,所以再次执行dog=new Dog("YY")的时候会报错。 //final不限制对内存中数据的修改,所以dog.name="YYY"是可以运行的。 dog.name = "美美"; ////The final local variable dog cannot be assigned. ////It must be blank and not using a compound assignment // dog = new Dog("亚亚"); } } package finatest; public class Dog { String name; public Dog(String string){ this.name=name; } }
参考资料: