文章来源:https://en.wikibooks.org/wiki/Java_Programming/Keywords/final
有三类:final 类 、 final 方法、final 变量。
一、final 变量: 如果一个变量一旦赋值,就不允许改,只能读了。
A final 不能设置 volatile(可见性或者是编译器和jvm不能改变指令的顺序)
.
下面1,2:就是final 的必不可少的知识点,只要记住这两点即可。
1、如果变量是一个primitive type,它的值不能改变。即变量a不能重新赋值。
2、如果变量是一个对象,仅仅它的连接不再可变,牢记在心它的值仍然能改变,
list 变量(实例变量)是一个对象,可以修改它里面的值
ArryList list1=new ArrayList();
list=list1;//编译时就会出错,list实例变量是常量,不能重新赋值,但是里面的数据可以改变。
3、The final
变量用在方法参数里。
1>当参数变量是原始类型时,方法里只是拿来用。
2>当参数变量是对象时,方法调用者,就是希望别人去改变参数对象值,哪么调用者接受改变的值,这个很有用。
当我们叫一个朋友(常量对象)去帮忙去帮修电脑,哪么朋友修好后,接收朋友的修改,
这时朋友不再接受别人的修电脑要求,一直帮我修好为止。
二、 final类也是利用final变量的特征:主要的目的,表示对象的内容不可改变,这样每建立一个String对象
如果要改变其中对象的值,必须重新建立一个新对象放改变的值,所以每次一个小小的应用测试,String对象最少也有1000多个对象。
1、禁止建立子类
2、不能成为抽象类,即类里面没有未实现的方法
例子:final String 类里面变量:privatefinalchar value[],这是一个原始类型char,所以当构造函数第一次赋值后,值不允许改变(对象活着时)
package str; import static net.mindview.util.Print.*; public class Immutable { public static String upcase(String s) { return s.toUpperCase(); } public static void main(String[] args) { String q = "howdy"; print(q); // howdy String qq = upcase(q); print(qq); // HOWDY print(q); // howdy } } |
String qq = upcase(q); 因为是常量类,所以对象里面的值不可改变,当q代表一个对象时,哪么不管它传给谁,
里面的值不能改变。
public static String upcase(String s) {return s.toUpperCase();}
当p传给方法upcase时,因为方法的参数变量只放在本地变量(堆栈中),所以当调用一个后,
jvm开始为方法参数分配空间,
String s:s是一个实例变量,分配4个字节存放传过来的q对象地址,指向数据存在的地方,
哪么s里面的值也不可以改变。
但是s=new String("abd"):可以重新指向一个新对象,因为它不是final 实例变量。
三、final方法:
1、禁止子类重写方法
2、如果一个类是final,暗示private 方法是final 方法
不能实现多态,多态必须是动态绑定.
3、不能成为抽象方法,即没有未实现的方法
4、static 方法也不能实现多态,因为是类级别的。