不积跬步无以至千里,不积小流无已成江海
一、认识final
我们在学习一个关键字时,首先要关注这个关键字有什么用?我们为什么要学习它?
这里给大家先介绍一下final都会有哪些使用场景:
1、final修饰变量:叫做常量,只能被赋值一次。
2、final修饰方法:表明该方法为最终方法,不能被重写。
3、final修饰类:表明该类为最终类,不能被继承。
由于final关键字的在不同场景下的解释较为直观,所以不做过多复杂的描述,所以下面我举一些案例帮助大家通过实战来更加深入的学习一下这个关键字。
二、使用final
1、常量
说到常量,大家肯定想知道为什么要有这个东西,这个东西有什么用啊?
其实常量这个东西,它的本质就是一个不可被修改的变量。那肯定有人会问,为什么让变量不可以被修改呢?其实这个问题很好回答,我们有很多常见的例子,比如数学里的π这个值,这个值是不是固定的值,要是它是固定的值,我们修改它了,他还能被称为π吗,是不是就不是啦。要是后人想使用这个值,他在看到π这个标志时,是不是就认为这个值就是3.1415926....,要是这个值可以被修改,哪天有个新手,在接到代码时,他不知道这些注意事项,误修改了,可能会导致一系列问题,这会造成很大的麻烦。所以声明一个常量就是为了告诉大家,这个名字的变量(也就是常量),不可被修改,不要想着拿它赋值,这样可以对固定值做出保护。
下面是一个想要给一个基本数据类型常量赋值时可能会出现的报错情况,验证了常量不可以被修改
下面是想要给引用数据类型赋值时可能会出现的情况,大家看下面的例子是不是会发现编译通过,并且无异常,而且能成功赋值。而且不是说常量不能被修改吗,这怎么又能修改了呢。要是看到这,你先别急,咱们再看一个。
我们看一下,下面这个例子是不是报错了啊,这里还特地给大家写了一个非常量类型的例子做对比。我来解释一下其中的原因,因为了一个数组被创建时相当于开辟了一块内存空间,这个内存空间有固定的地址标志的,就像我们图中的final int[] arr1 = {1,2,3,4,5};,它是有地址的,并且大小也被指定了,我们假设它的地址是A,这时里面存储了1、2、3、4、5这几个数据放在空间里了,但是这个会影响到地址吗,是不是不会。所以想将这个空间里的1换成2,会影响到arr1变量的地址吗,是不是也不会。所以这个是可以操作的。
但是我们这个引用数据类型变成常量,究竟限定的是什么东西呢?
其实就是地址!就是被加final关键字的引用数据类型常量的地址不能变,如果我们这块new int[10];,这相当于出现了一个空间大小为10的数组空间,我们管这个空间地址叫B,这时arr1被它赋值了,也就是地址改变了,形象一点就是arr1先是指向的A地址空间,现在想去指B,是不是就不行了,所以这就是引用数据类型的不可改变性,指的是地址不可变!
下面总结一下,final在限定变量时的注意事项:
(1)命名规范:
a、单个单词:字母全部大写
b、多个单词:全部大写单词之间用下划线隔开
(2)final修饰的变量是基本数据类型:变量存储的数据值不能发生改变
(3)final修饰的变量是引用数据类型:变量存储的地址值不能发生改变,变量内部可以发生改变
2、最终方法
一个方法为什么要成为最终方法呢?
简单解释就是,和常量很类似,这个重名的方法不想被后来人已重写的方式再使用了,只能按照我原来的设计去调用,归根结底就是这个操作是固定的,比如一个add方法,表示求和,后来人想重写成名为add的减法操作的方法,这个行为就很反逻辑,更没必要,所以就加以限制。
最终方法这个在实例中很好理解,看一下下面的实例,就可以很直观的看出final修饰方法,不能被重写。
3、最终类
一个类为什么要成为最终类呢?
简单解释就是,和最终方法很类似,大概解释就是这个类里面装的东西没办法给别的类继承了,这是这个类特有的一些东西,如果被继承就会出现逻辑不适配的情况,为防止出现这种情况,所以对这个类加了限制,变成最终类。这里给大家看个案例。
在被final限制类后,是无法被其他类继承的,其实只需要明白这一点即可(真正用到时能想到就行,或者是报错时,能明白是语法规则的问题就可以了)
以上就是关于final的所有用法的详细介绍。