当前位置: 首页 > 科技观察

Java中final关键字解析

时间:2023-03-12 19:15:43 科技观察

本文主要讲解Java中final关键字的使用。可以看final的字面意思,主要是“最终的、不可改变的意义”的意思。可以修饰类、方法和变量。先给出这篇文章的大概脉络。首先先给出final关键字的三种使用场景,即修改类、方法和变量。然后,深入分析final关键字应该注意的主要问题。最后总结一下final关键字OK,开始今天的文章一、final关键字的基本使用1、了解final关键字final可以修饰类、方法、变量。那么有哪些功能呢?(1)修饰类:表示类不能被继承(2)修饰方法:表示方法不能被重写(3)修饰变量:表示变量一旦赋值,其值就不能改变。Java规定final修饰的成员变量必须由程序员显示指定变量的值。2、final关键字修饰的类final关键字修饰的类,说明这个类不能被继承。如何验证?3、final关键字修饰的方法final关键字修饰的方法不能被重写。但它可以超载。下面给出了一个代码示例。主要需要注意的是:子类中不能访问父类中的私有方法,但是子类和父类私有方法的方法名、形参列表和返回值不是方法重写的一部分,只是定义了一个新方法。publicclassFinalClass{publicfinalvoidtest(){}publicfinalvoidtest(inti){}}4.修饰变量的final关键字修饰变量的final关键字比较麻烦。但是我们只需要一个分类介绍就可以清楚地了解它。(1)成员变量的修饰如果最终修饰的是类变量,则只能在静态初始化块中或声明类变量时指定初始值。如果最后修饰的是成员变量,可以在非静态初始化块、变量声明或构造函数中执行初始值。(2)修改局部变量系统不会初始化局部变量,局部变量必须由程序员显式初始化。因此,在使用final修饰局部变量时,可以在定义时指定默认值(以下代码不能对变量重新赋值),也可以不指定默认值,将初始值赋给final中的变量以下代码(仅一次)。下面我们用代码来验证这两种情况publicclassFinalVar{finalstaticinta=0;//重新声明时需要赋值publicstaticvoidmain(String[]args){finalintlocalA;//局部变量只声明不初始化,不会报错,和finalirrelevant一样。localA=0;//使用前必须赋值//localA=1;但不允许第二次赋值}}(3)基本类型数据和引用类型数据的修改如果是基本数据类型的变量,其值一旦初始化后,就不能再改变;如果是引用类型的变量,初始化后不能指向另一个对象。但是引用的值是可变的。数据基本类型的修改基本上可以在上面的代码中看到,下面主要是描述变量publicclassFinalReferenceTest{publicstaticvoidmain(){finalint[]iArr={1,2,3,4};iArr[2]的引用类型=-3;//合法iArr=null;//非法,iArr不能重新赋值finalPersonp=newPerson(25);p.setAge(24);//合法p=null;//非法}}二、thefinalkey单词需要注意的几个问题1.final和static的区别其实如果你看了我上一篇文章,基本上可以很容易的区分出来。static作用于成员变量表示只保存一份,而final用于保证变量不可变。以下代码验证publicclassFinalTest{publicstaticvoidmain(String[]args){AAaa1=newAA();AAaa2=newAA();System.out.println(aa1.i);System.out.println(aa1.j);System.out.println(aa2.i);System.out.println(aa2.j);}}//j值都是一样的,因为是静态修改的,全局只保留一份//i值不同,两个对象可能会产生两个不同的值,classAA{publicfinalinti=(int)(Math.random()*100);publicstaticintj=(int)(Math.random()*100);}//结果是65,23,67,232为什么局部内部类和匿名内部类只能访问局部final变量?为了解决这个问题,我们首先需要用代码来验证一下。publicclassTest{publicstaticvoidmain(String[]args){}//局部final变量a,bpublicvoidtest(finalintb){finalinta=10;//匿名内部类newThread(){publicvoidrun(){System.out.println(a);System.out.println(b);};}.start();}}在上面的代码中,如果去掉变量a和b前面的任何final,这段代码将无法编译。这段代码将被编译成两个类文件:Test.class和Test1.class。默认情况下,编译器将匿名内部类和本地内部类命名为Outter1.class。原因是为什么?这是因为test()方法中的参数a和b,在运行时,主线程即将结束,但线程还没有启动。所以需要有一种机制,可以在线程线程运行的时候调用a和b的值。我应该怎么办?Java采用了拷贝机制,即如果局部变量的值在编译时可以确定,那么直接在匿名内部创建一个拷贝。如果在编译期间无法确定局部变量的值,则通过构造函数传递参数对副本进行初始化和赋值。3.总结final关键字主要用在三个地方:变量、方法、类。对于final变量,如果是基本数据类型的变量,一旦初始化,其值就不能改变;如果是引用类型的变量,初始化后不能指向另一个对象。当一个类被final修饰时,表明这个类不能被继承。final类中的所有成员方法都被隐式指定为final方法。使用final方法有两个原因。第一个原因是锁定方法以防任何继承类修改其含义;第二个原因是效率。在Java的早期实现中,final方法被转换为内联调用。但是如果方法太大,你可能看不到内联调用带来的任何性能提升(当前的Java版本不需要使用final方法来进行这些优化)。类中的所有私有方法都隐式指定为final。好了,final关键字就写到这里了。如果你喜欢它,请给它一个通行证。感谢您的支持。如有不妥之处,请批评指正。本文转载自微信公众号“愚公要移山”,可关注下方二维码。转载本文请联系愚公移山公众号。