深入理解javaSE之final关键字(终结器)(面试重点)

final关键字含义

final是java中保留的关键字,可以修饰类、方法、属性以及变量,一旦引用声明作final,那么我们将不能改变这个引用了,那么如果你尝试去改变的话,编译器会报错。

final变量

什么叫final变量?

final变量就是用final修饰的变量,包括局部变量和本地变量,这里解释一下本地变量,本地变量就是在方法中定义的变量以及在代码块中的变量。

final通常和static一起使用,作为常量,例如:

public static final COUNTRY="China";

final修饰的变量是只读的,如果你尝试去改会发现,编译器会报错的。

final方法

final方法就是在方法的前面加上final修饰,表示该方法不可以被子类所覆写,当然,如果你在写代码时不想让子类覆写你的方法,你就可以使用final修饰。

其实final修饰的方法加载的时候比较快,因为在编译的时候已经静态绑定过。
下面我们看一个例子:
在这里插入图片描述
在上面的代码中我们会发现,当子类覆写父类中final修饰的方法时,编译器报错了,这就更加证明了final修饰的方法不能被子类所覆写

final类

final类就是在类的前面加上final修饰,那么被final修饰的类就不能被子类继承了,一遍情况下一个类被final修饰,就说明这个类是足够完整的,这时候我们就会想到String类以及Integer包装类,但其实java中有很多这样的类的。

我们还是看一段错误的代码来加深一下以上说法:
在这里插入图片描述
可以看到编译器说不能继承final修饰的类。所以说final修饰的类不能被子类所继承
要注意的是final一旦修饰一个类之后,该类的所有方法默认都会加上final修饰。(不包含成员变量)

总结

  • final在使用过程中有很多需要注意的地方,我查了很多,先列出来:
  • final关键字可以用于成员变量、本地变量、方法以及类。
  • final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
  • 你不能够对final变量再次赋值。
  • 本地变量必须在声明时赋值。
  • 在匿名类中所有变量都必须是final变量。
  • final方法不能被重写。
  • final类不能被继承。
  • final关键字不同于finally关键字,后者用于异常处理。
  • final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。
  • 接口中声明的所有变量本身是final的。
  • final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
  • final方法在编译阶段绑定,称为静态绑定(static binding)。
  • 没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
  • 将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。
    按照Java代码惯例,final变量就是常量,而且通常常量名要大写:

典型挖坑练习

到这里你已经掌握了final的相关知识点,我们做一些简单的但是很容易跳坑的练习题:

题目是选出下面出错的语句:

byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7=9;
public void test() {
b3=(b1+b2); /*语句1*/
b6=b4+b5; /*语句2*/
b8=(b1+b4); /*语句3*/
b7=(b2+b5); /*语句4*/
System.out.println(b3+b6);
}

建议在做之前自己先做一遍,印象会更深哦!
解:

先看语句1,b1和b2都是byte类型的,但是我们知道byte short int 做运算之后结果都是int类型的,而b3是byte类型的,那么语句1就是向下转型了,是需要墙砖才可以的,所以语句1是错的,我们看看结果:

在这里插入图片描述

语句2:b4和b5都是final修饰的byte类型,所以做运算之后依然是byte类型的,b6本身也是byte类型,也没有被final修饰,所以语句2是正确的。

在这里插入图片描述
可以看到编译器并没有报错。
语句3和语句1是一样的,这里不多说

语句4,如果你看了前面的相关知识,你就会一眼判断出是错误的,因为b7是被final修饰的,所以不能被更改。

在这里插入图片描述
所以在这里面只有语句2是正确的!你做对了吗()

猜你喜欢

转载自blog.csdn.net/qq_40550018/article/details/84786851
今日推荐