学习java很长时间了,今天重新看了final关键字,发现其实自己掌握的还是不全面,下面就来看一下这个关键字都用在什么地方。
1.final修饰数据:对于基本类型的数据,final使得其数值不变,而对于对象类型的引用,final使得引用不变,这句话的 意思是对于引用的对象,final使得此对象指向地址不可改变,但是地址中的值可以改变。
对于这句话,我们可以用程序来验证:
public class Test{
int i=9;
}
public class Test1 {
public static void main(String[] args){
final Test test = new Test();
//test = new Test1();
test.i = 3;
System.out.println(test.i);
}
}
我们会发现输出的i的值改变了,但是如果写出代码test = new Test1();,编译器就会报错,告诉你不能改变final修饰的变量。
如此我们会发现,对象test的地址并没有改变,但是值却改变了。
2.空白final :所谓空白final是指被声明为final类型,但是有没有给定初始的值,这使得程序使用final时又多了一些灵 活性,即可以自己初始化,但是这种变量不像普通变量编译器会给类变量一个初始的值,他是通过用户 来指定变量初始的值。
3.final参数:无法在方法中更改参数引用所指向的对象。(同样,也可以改变对象的成员变量)。
4.final方法:允许你重写但是不允许你重载。final修饰方法,可以讲方法锁定,以防继承类修改他的含义,保持在继 承中使方法保持不变。
使用final修饰的第二个原因是效率。如果将一个方法指明为final类型的,那么便一起将针对该方法的所有调用都转为内嵌调用。当编译器发现一个final类型的方法时,他会跳过插入程序代码这种正常的方法转而执行方法调用机制。并且已方法体中的实际代码的副本来代替方法调用。,这消除了方法调用的开销(特别是循环的时候)。
5.final类:当你将一个类声明为final类型的,那说明你不打算继承该类,并且也不允许别人这样做。由于final类禁止继承,所以这相当于final类中所有的方法都隐式制定成final的,因为你无法重载他。