我们都知道final这个关键字代表“不可修改”的意思,但是不同的“不能修改”有不同的含义。
final必须显示指定初始值,否则其值就为null。其赋值的过程都是放在静态初始化块内完成的(注意:他的优先级高于成员变量在构造函数中赋值)。
1.final的变量:
通常final成员变量表明这个变量只能被赋值一次,而不是说他是静态常量。
比如说:
final int i = 1; 此时i不可再改变
再比如:
final int i; 此时可以对i进行赋值,但是不可进行二次赋值
i = 1; //right
i = 2;//wrong
以上是常数的变量,下面我们看看对象变量,有的人认为给对象加了final之后代表该对象不可改变,我们来看代码:
final TestFinal tf = new TestFinal();
tf.setS(77);
System.out.println(tf.getS());
tf.setS(33);
System.out.println(tf.getS());
对tf对象加了final关键字之后,tf中的s值可以随意变化,以上输出结果为:77、33
那有的人就会理解为final对对象变量是没有意义的?这就不对了,对象变量加了final标签之后表示其引用的指向不可改变,即其不能再指向其他对象,但是该对象的成员内容是可以改变的。
tf.setS(55);//right
tf = new ThesFinal();//wrong
final数组同对象变量,即不可指向其他数组,但是数组内容可修改。
2.final的方法:
子类在继承父类的时候,父类中的final方法是不能被覆盖的。
另外,由于private的方法在子类中是不可见的,也就是说,即使子类中可以重新定义这个方法,两个类之间的这个方法也毫无关系,不构成覆盖;子类不可能覆盖父类的private方法,父类的private方法不可能在子类中出现新版本,因此private的方法就是final的。
3.final的类:
final的类是不能被继承的,这样的类主要起安全的作用。final类中的所有方法都是final的。