我心中的final

     在java中,final这个关键字相比其他常见修饰词来说,在代码中出现的频率并不是很高,因为其本身的存在就是为了限制,所以除非是必须需要,否则很少有人会在自己的设计中过早引入限制。

      用final修饰无法修改的常量,如编译常量,就是用final修饰,定义时必须赋值,还必须是基本数据类型,因为编译常量是插入到我们代码的表达式中,作为右值,必须是确定的。

      我们也经常会看到一个域是用static和final来修饰的,说明这段域的存储空间是不能修改的。依照惯例,用大写表示,而且使用下划线来分隔每个单词。

      java中也有一种奇怪的现象,就是允许空白final的存在,如:final int i;这不是与开头所讲的完全矛盾吗?看清楚,我第二段说的是编译常量,编译常量与final变量是不一样的,虽然final变量其实就相当于常量,一旦赋值就不可以修改,但是,是赋值后才无法修改,这就有很大的空间可以利用,于是就存在空白的final。什么意思?因为空白所以才要赋值啊,空白留下了赋值的灵活性。这句话又糊涂了吧,其实就是赋予不同值然后使得它们不可修改!不是一旦赋予第一个值,就不能再修改吗?但是java中有一种东西可以允许这种情况,就是构造器!构造器允许我们对同一个值赋予不同的值,如:

     final int i;

     class(){i = 1;}

     class(int x){i = x);

    class c1 = new class();

    class c2 = new class(2);

这是允许的,因为c1.i和c2.i根本就是两个不同的实例,所以不存在所谓的同一个final值被赋予两个值的问题。正因为构造器的存在,所以使得空白final的存在就是希望一个具有赋值灵活的变量,赋值后保持不变。

     final变量在使用前就已经初始化了,完整的说法应该是final变量在定义时或者在构造器中已经被赋值了,根本不存在没有初始化的final变量,就算有空白final的存在,它也一定会在构造器中被赋值。

     final修饰基本数据类型很好理解,但是修饰引用呢?一旦引用被修饰为final,就表示该引用不能再指向其他对象,但是所指向的对象是可以被修改的,就像我们的名字,永远指向我们这个对象,但是我们本身又会随着岁月的变化而变化,又并不影响我们的名字只指向我们个人的特性。主要用在参数列表中将参数引用声明为final,参数引用被声明为final,就表示我们这个方法无法将这个引用再指向其他对象,用于向匿名内部类传递数据。

     方法和类都是可以被声明为final的。方法声明为final,表示该方法不可以被覆盖,类声明为final,表示该类不可以被继承。一般我们都不需这么做,因为正如我一开头就讲过的,过早在设计中引入限制,是很不好的,因为代码是会随着阅读的次数而不断被修改的,尤其是接口类,如果一开始就存在不可被修改的地方,那么这样的代码是很难适应以后未知的发展的。

原文地址:https://www.cnblogs.com/wenjiang/p/2616119.html