关于final的一些细节,我有话要说--final的使用

Posted 最爱吃鱼罐头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于final的一些细节,我有话要说--final的使用相关的知识,希望对你有一定的参考价值。

茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!

愿你在未来的日子,保持热爱,奔赴山海!

题记:关于final关键字,它也是我们一个经常用的关键字,可以修饰在类上、或者修饰在变量、方法上,以此看来定义它的一些不可变性!

像我们经常使用的String类中,它便是final来修饰的类,并且它的字符数组也是被final所修饰的。但是一些final的一些细节你真的了解过吗?

从这篇文章开始,带你深入了解final的细节!

😀final的第一印象

我相信大家对于final的第一印象绝对来自这一道面试 final、finally、finalize这三者有什么区别吗?

final:修饰符(关键字)有三种用法:
  1. 如果一个类被声明为 final,意味着它不能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。
  2. 将变量声明为 final,可以保证它们在使用中不被改变,被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。
  3. 被声明为 final 的方法也同样只能使用,不能在子类中被重写。

finally: 通常放在try..catch..处理异常中,代表着程序无论正常执行还是发生异常,这里的代码都会执行。 一般是把释放资源的代码放在finally块中。 
finalize: 是Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之 前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的。

对吧,没讲错,我也是在背诵八股文的时候,才会发现以前根本不会专门了解的知识点。但是从今天,我将带大家全新认识下final这一个关键字!!!Let’s GO~

😛final的基本使用

今天我们先讲解final如何去使用它,对于它的定义大家也应该或多或少的了解到了,或者看上面的答案即可。

首先你必须知道final如何去使用,才能更加深入的去了解它,剖析它。

final关键字的使用以下有三种特点:

  1. 如果一个类被声明为 final,意味着它不能再派生出新的子类,即不能被继承。
  2. 将变量声明为 final,可以保证它们在使用中不被改变。但是,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。
  3. 被声明为 final的方法也同样只能使用,不能在子类中被重写。

🙅 修饰类

如果一个类被声明为 final,意味着它不能再派生出新的子类,即不能被继承。而在Java中,也可以看到许多类是final的,譬如String、Interger以及其他包装类。

// String类
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence ...

// Integer类
public final class Integer extends Number implements Comparable<Integer> ...

那我们具体来看看是不是真的不能被继承呢?

package com.nz.test;

/**
 * 测试是否真的不可以修饰类!
 */
public class ClassFinalTest 


// 定义一个运动员父类,并使用final修饰
final class SportMan


// 定义一个田径运动员子类,看能不能继承父类
class AthleticsMan extends SportMan

我们可以代码结合图看出,在编译期间,父类会被final修饰,当子类继承该父类的时候,就会报错。

🙍 修饰变量

将变量声明为 final,可以保证它们在使用中不被改变。但是,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。

package com.nz.test;

/**
 * 测试final修饰变量!
 */
public class VariableFinalTest 
    // 在被final修饰的变量,必须进行初始化操作。
    private final int variable;

    public static void main(String[] args) 
        final int num = 2;
        // 被final修饰的基本变量,表示不可再修改。
        num = 3;

        final Object obj = new Object();
        // 被final修饰的引用变量,也表示不可再修改。
        obj = new Object();
    

我们可以看出,在未初始化变量、初始化后进行修改的变量的值、重新引用新的引用地址时,均编译期间爆红,都会报错滴!

🙆 修饰方法

被声明为 final的方法也同样只能使用,不能在子类中被重写。

对于那些你认为一个方法的功能写得已经足够完善了,子类中也不需要定义改变的话,你可以声明此方法为finalfinal修饰的方法比非final修饰的方法要快一点,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定!

具体我们来看看是否真的不能重写

package com.nz.test;

/**
 * 测试final修饰方法!
 * 该类为父类,在子类继承该类时,看是否能不能重写final方法
 */
public class MethodFinalTest 

    // final修饰saySomething()方法
    public final String saySomething()
        return "你想说点啥,湖人总冠军!!!";
    

    // 没有被final修饰talkSomething()方法
    public String talkSomething()
        return "我想说啥,老年夕阳红,快点红一把吧!!!";
    


// 定义子类继承MethodFinalTest方法
class MethodSun extends MethodFinalTest

    // 首先,看看能否重写未被final修饰的talkSomething()方法
    public String talkSomething()
        return "我只能同意你的看法,老年夕阳红,快点红一把吧!!!";
    

    // 接着,看看能否重写被final修饰的saySomething()方法
    public String saySomething()
        return "我只能同意你的看法,湖人总冠军!!!";
    

我们可以看到,我们没有talkSomething是没有被final修饰的,可以完美的重写过来,但是我们的saySomething方法被final修饰后,就不能被重写啦!

🌸总结

相信各位看官都对final这一个关键字有了一定了解吧,其实额外扩展自己的知识面也是相当有必要滴,不然别人追问你的时候,你会哑口无言,而一旦你自己每天都深入剖析知识点后,你在今后的对答中都会滔滔不绝,绽放光芒的!!!对吧,我们还有一把东西等着我们探索和摸索中!那我们继续期待下一章的final的内容吧!欢迎期待下一章的到来!

让我们也一起加油吧!本人不才,如有什么缺漏、错误的地方,也欢迎各位人才大佬评论中批评指正!当然如果这篇文章确定对你有点小小帮助的话,也请亲切可爱的人才大佬们给个点赞、收藏下吧,一键三连,非常感谢!

学到这里,今天的世界打烊了,晚安!虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!

感谢各位看到这里!愿你韶华不负,青春无悔!

以上是关于关于final的一些细节,我有话要说--final的使用的主要内容,如果未能解决你的问题,请参考以下文章

关于final的一些细节,我有话要说

关于apifox和postman接口工具我有话要说~~

关于java的final接口内部类细节

JavaScript执行:try里面放return,finally还会执行吗?

JavaScript中在try里面放return,finally还会执行吗?

Java语法细节 - try_finally和set相关