茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!
愿你在未来的日子,保持热爱,奔赴山海!
题记:关于
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
关键字的使用以下有三种特点:
- 如果一个类被声明为
final
,意味着它不能再派生出新的子类,即不能被继承。 - 将变量声明为
final
,可以保证它们在使用中不被改变。但是,被声明为final
的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。 - 被声明为
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
的方法也同样只能使用,不能在子类中被重写。
对于那些你认为一个方法的功能写得已经足够完善了,子类中也不需要定义改变的话,你可以声明此方法为final
。final
修饰的方法比非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的内容吧!欢迎期待下一章的到来!
让我们也一起加油吧!本人不才,如有什么缺漏、错误的地方,也欢迎各位人才大佬评论中批评指正!当然如果这篇文章确定对你有点小小帮助的话,也请亲切可爱的人才大佬们给个点赞、收藏下吧,一键三连,非常感谢!
学到这里,今天的世界打烊了,晚安!虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!
感谢各位看到这里!愿你韶华不负,青春无悔!