0
点赞
收藏
分享

微信扫一扫

【JavaSE基础】小看final关键字?教你如何深入理解和使用


????欢迎关注????点赞????收藏⭐️

❤️ :​热爱Java学习,期待一起交流!

????作者水平很有限,如果发现错误,求告知,多谢!

????有问题可私信交流!!!    


⭐️小剧场⭐️


????:​下面有关java final的基本规则,描述错误的是?

        A. final修饰的类不能被继承

        B.final修饰的成员变量只允许赋值一次,且只能在类方法赋值

        C.final修饰的局部变量即为常量,只能赋值一次。

        D.final修饰的方法不允许被子类覆盖


          这是final最基础的问答题,如果想不明白原因建议往下看,干货满满。(可直接拉到最后查看答案)

目录

​​⭐️小剧场⭐️​​

​​????1.什么是final?​​

​​????1.final修饰变量​​

​​        ???? 1.final变量指向常用数据类型   ​​

​​         ????2.什么是final的不可变性?​​

​​        ???? 3.final修饰静态变量 ​​

​​        ???? 3.final变量指向对象​​

​​        ???? 3.final和String的不可变性区别​​

​​ ????2.final修饰类​​

​​ ????3.final修饰方法​​

​​ ????3.小剧场解答及final总结​​

【JavaSE基础】小看final关键字?教你如何深入理解和使用_final


????1.什么是final?


        ​final是Java的一个基础关键字​,它可以用来修饰类和方法以及变量。它的效果有点类似于C语言中的const。很多人想到final仅仅就觉得是加在变量前面不可变而已,没有深入理解final这个关键字存在的意义和注意事项。下面我讲分析它在变量、方法、类三处使用的作用。


????1.final修饰变量

        ???? 1.final变量指向常用数据类型   

           我们都知道final修饰变量会有不可变性,但变量也分很多种,对于什么是不可变性我们也暂借不提,我们先来看看final来修饰成员变量以及局部变量但不对它们赋值的情况   

【JavaSE基础】小看final关键字?教你如何深入理解和使用_final_02


     ☀️:我们发现成员变量a和d在声明时,未赋值的话会报错,会告诉你未在构造器中初始化。但局部变量b和c却没有报错,所以我们可以先记住:​final修饰成员变量时必须赋值,而局部变量可以暂且不赋值。


     ​????2.什么是final的不可变性?

        说到不可变性,很多人肯定先想到String。但它和String的不可变性是有区别的(final和String可以搭配使用哦,下文会讲)。我们仍然用代码来演示

【JavaSE基础】小看final关键字?教你如何深入理解和使用_关键字_03

       这里我们用局部变量来演示,final变量的b命名时我们并未赋值,它没有报错,然后我们给它赋值20,它也没有报错,当我们再次给它赋值时,我们发现它报错了。我们再看看另外一种情况:

【JavaSE基础】小看final关键字?教你如何深入理解和使用_final_04【JavaSE基础】小看final关键字?教你如何深入理解和使用_java_05

      左边当我们在未给b赋值时,直接使用b进行输出时,我们发现编译器报错了。但当我们给它赋值以后,编译可以正常调用b。通过上面的例子,我们可以得到结论:


      ✌️:​final修饰的变量(无论成员变量还是局部变量),在使用前必须进行赋值,而且仅且只能赋值1次。如果多次赋值或者未赋值进行使用时,编译器将会提示错误。​ 


     上面是我们宏观的理解,我们通过内存的角度来分析final的​不可变性​:

【JavaSE基础】小看final关键字?教你如何深入理解和使用_java_06

     我们列举出一个成员变量a和一个局部变量b。这里是为了顺便给大家讲下他们在内存的区别。当我们实例化类Test7时,有了一个引用变量a和一个值100(成员变量的值存在堆内存中)。a保存了100的地址,也就是指向了100。局部变量b被初始化后产生了一个a和10(局部变量的值在栈中),b指向了10。当我们尝试让a指向12和b指向200时,也就是要改变a和b的地址时,发现报错了。由此我们可以得知:


     ​✌️:final的不可变性,指的是引用不可修改。我们都知道变量本身存储的是一个地方的地址,也就是这个地址不能修改,你指向了一个地方,那你这辈子都不能再指向别的地方了,这就是不可变性的意思。(但是被指向的地址里的内容是可以修改的,一定要记住!!!,和String的不可变性的不同,后续讲解)


        ???? 3.final修饰静态变量 

           说到变量肯定不能少了静态变量,修饰静态变量我们通常把static和final搭配使用,像这样的格式:

final static double PAI_Value=3.14;

有的人问这样搭配有什么好处吗?我们结合static和final的特点就知道了,静态变量不需要对象就可以使用,而且可以被全局调用,当再加上final后,它就变成了一个全局的常量。我再任何地方调用PAI_Value都像是调用了一个3.14一样。写成前者代码当然更好看美观一点,这种书写格式在我们观看各种方法的源码时可以经常见到。而且这样书写也有一定的规范,要用大写字母开头中间进行下划线连接。

        ???? 3.final变量指向对象

           前面的变量指向的都是基本数据类型,接下来我们来看看当final变量指向对象时有什么不一样呢?

【JavaSE基础】小看final关键字?教你如何深入理解和使用_final_07

          我们同样发现当我们第二次给被final修饰的变量student1赋值另外一个Student实例对象时,它报错了(这里举例的是局部变量的例子)

【JavaSE基础】小看final关键字?教你如何深入理解和使用_开发语言_08

         同样从内存角度分析:当我们student1指向一个实例对象后,是不被允许指向另外一个。那我们可以改变李四或者1的值吗?这就讲到前文讲到的修改地址里的内容,我们来尝试一下

public static void main(String[] args) {
final Student student1;
student1 = new Student("李四", 1);
student1.name="王五";
student1.id=2;
System.out.println(student1);
}
}

      【JavaSE基础】小看final关键字?教你如何深入理解和使用_后端_09


        ???? :​我们发现我们是可以对final变量指向的地址的内容进行更改的,不能更改的是final变量保存的地址。


        ???? 3.final和String的不可变性区别


        ???? :​final的不可变性我们知道是变量的指向不可变,指向的内容可以变。而String则相反,是指向可以变,但是指向的内容不可变。​            【JavaSE基础】小看final关键字?教你如何深入理解和使用_后端_10


  就像这个图,如果我们有一个String a="hello",我们再写a="wrold"时,它不会把原来的hello改成wrold,而是改变a的指向指向另外一个字符串wrold,原来的hello是不可以被修改的。由此我们可知如果String对象被final修饰,那它就两者都不能修改啦。

 ????2.final修饰类

        final修饰类的情况比较少见结论也比较简单,就直接给大家结论记住:


      ????:​1.final修饰的类不可以被继承 

               2.final不能修饰抽象类(抽象类是要被继承的,当然不能final修饰它啦)

              3.被final修饰的类一般是为了不让别人改变它,例如String   


 ????3.final修饰方法

        同样先给出结论:


        ????:​1.final修饰方法,则方法不能被重写。

                 2.final修饰的方法可以被重载(一定要把重写和重载分清)

                 3.我们使用final修饰方法,一般是为了给方法“上锁”,我们不希望父类被子类继承后,某个方法被子类覆盖或者改写,我们可以给方法加上final​  


 ????3.小剧场解答及final总结

         现在我们可以很清楚地明白小剧场的答案应该选B。ACD都是都是正确,B错的原因是,我们只要在使用final前对它赋值即可,并不是只能在类方法中(也就是静态方法,照它的意思岂不是静态方法才能final修饰变量?荒谬!)。final虽然我们自己写代码很少用到,但它也是Java的基础关键字,它在各种源码中非常常见,我们应该掌握和了解它


     ❤️ ​创作不易,如果有用请点赞收藏,期待Java交流也别忘记关注


        【JavaSE基础】小看final关键字?教你如何深入理解和使用_关键字_11


举报

相关推荐

0 条评论