云漫圈 | 腾讯面试,我竟然输给了final关键字

戳蓝字“CSDN云计算”关注我们哦!


作者:乔戈里

来源:程序员乔戈里

云漫圈 | 腾讯面试,我竟然输给了final关键字_第1张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第2张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第3张图片


腾讯面试现场

云漫圈 | 腾讯面试,我竟然输给了final关键字_第4张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第5张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第6张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第7张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第8张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第9张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第10张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第11张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第12张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第13张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第14张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第15张图片

——————

云漫圈 | 腾讯面试,我竟然输给了final关键字_第16张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第17张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第18张图片


final 在 Java 中是一个保留的关键字,可以声明变量、方法、类。


什么是final变量 / 类 / 方法?


任何变量前被 final 修饰就是 final 变量,定义的类前被 final 修饰就是 final 类,任何方法前被 final 修饰就是final方法。

云漫圈 | 腾讯面试,我竟然输给了final关键字_第19张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第20张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第21张图片

当用 final 修饰一个类时,表明这个类不能被继承。你看看到图中箭头指向的地方,那句英文翻译过来就是不能继承 Cat 类。


如果把 final 关键字去掉,就可以了。你看这样就不会报错了!


云漫圈 | 腾讯面试,我竟然输给了final关键字_第22张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第23张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第24张图片云漫圈 | 腾讯面试,我竟然输给了final关键字_第25张图片

下面这段话摘自《Java编程思想》第四版第143页:

“使用 final 方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的 Java 版本中,不需要使用 final 方法进行这些优化了。“

云漫圈 | 腾讯面试,我竟然输给了final关键字_第26张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第27张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第28张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第29张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第30张图片


变量被 final 修饰就是就是 final 变量,那么问题来了,final 变量和普通变量到底有啥区别?

云漫圈 | 腾讯面试,我竟然输给了final关键字_第31张图片

public class Main {
   public static void main(String[] args) {
       String a = "xiaomeng2";
       final String b = "xiaomeng";
       String d = "xiaomeng";
       String c = b + 2;
       String e = d + 2;
       System.out.println((a == c));
       System.out.println((a == e));
   }
}

云漫圈 | 腾讯面试,我竟然输给了final关键字_第32张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第33张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第34张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第35张图片


  • 变量a指的是字符串常量池中的 xiaomeng2;

  • 变量 b 是 final 修饰的,变量  b 的值在编译时候就已经确定了它的确定值,换句话说就是提前知道了变量 b 的内容到底是个啥,相当于一个编译期常量;

  • 变量 c 是 b + 2得到的,由于 b 是一个常量,所以在使用 b 的时候直接相当于使用 b 的原始值(xiaomeng)来进行计算,所以 c 生成的也是一个常量,a 是常量,c 也是常量,都是 xiaomeng2 而 Java 中常量池中只生成唯一的一个 xiaomeng2 字符串,所以 a 和 c 是相等的!

  • d 是指向常量池中 xiaomeng,但由于 d 不是 final 修饰,也就是说在使用 d 的时候不会提前知道 d 的值是什么,所以在计算 e 的时候就不一样了,e的话由于使用的是 d 的引用计算,变量d的访问却需要在运行时通过链接来进行,所以这种计算会在堆上生成 xiaomeng2 ,所以最终 e 指向的是堆上的 xiaomeng2 , 所以 a 和 e 不相等。

云漫圈 | 腾讯面试,我竟然输给了final关键字_第36张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第37张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第38张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第39张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第40张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第41张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第42张图片


云漫圈 | 腾讯面试,我竟然输给了final关键字_第43张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第44张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第45张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第46张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第47张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第48张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第49张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第50张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第51张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第52张图片

云漫圈 | 腾讯面试,我竟然输给了final关键字_第53张图片

  • final方法比非final快一些

  • final关键字提高了性能。JVM和Java应用都会缓存final变量。

  • final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

  • 使用final关键字,JVM会对方法、变量及类进行优化。


云漫圈 | 腾讯面试,我竟然输给了final关键字_第54张图片

表情包出自:微博@不觉晓晓

PS:本故事纯属虚构

—————END—————

1.微信群:

添加小编微信:color_ld,备注“进群+姓名+公司职位”即可,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


2.征稿:

投稿邮箱:[email protected];微信号:color_ld。请备注投稿+姓名+公司职位。



推荐阅读

  • 官宣!张小龙史上最长演讲 4小时3万字完整版回应微信的一切

  • Spark+Alluxio性能调优十大技巧

  • 有问有答 | 容器精华问答,如何玩转容器服务?

  • Java 12 要来了!

  • “微信之父”张小龙:我没去过龙泉寺!

  • 代码“大换血”,以太坊能耗将减少99%背后的故事

  • 从云计算到AI:NetApp的数据网络转型之道



云漫圈 | 腾讯面试,我竟然输给了final关键字_第55张图片点击“阅读原文”,打开 CSDN App 阅读更贴心!

640?wx_fmt=png 喜欢就点击“好看”吧!

你可能感兴趣的:(云漫圈 | 腾讯面试,我竟然输给了final关键字)