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

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


作者:乔戈里

来源:程序员乔戈里

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


腾讯面试现场

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

——————

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


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


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


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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

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


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


640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg640?wx_fmt=jpeg

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

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

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


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

640?wx_fmt=jpeg

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));
   }
}

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


  • 变量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 不相等。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

  • final方法比非final快一些

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

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

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


640?wx_fmt=jpeg

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

PS:本故事纯属虚构

—————END—————

1.微信群:

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


2.征稿:

投稿邮箱:liudan@csdn.net;微信号:color_ld。请备注投稿+姓名+公司职位。



推荐阅读

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

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

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

  • Java 12 要来了!

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

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

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



640?wx_fmt=gif点击“阅读原文”,打开 CSDN App 阅读更贴心!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 memcpy_s 函数 - C语言零基础入门教程

目录 一.memcpy_s 函数简介 1.memcpy 函数报错:error C49962.memcpy 函数没有方法来保证有效的缓冲区尺寸,使用不安全 二.memcpy_s 函数语法三.memcpy_s 函数实战四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.memcp…

多线程:生产者消费者问题

1.假设仓库只能存一件产品,生产者将产品放入仓库,消费者将产品从仓库取出 2.仓库没有产品,生产者将产品放仓库,否则停止生产并等待,直到仓库产品被消费者取走 3.如果仓库放有产品,消费者可取走&#xff0…

学习微服务网关zuul,看这篇就够了

戳蓝字“CSDN云计算”关注我们哦!作者:爱撒谎的男孩 原文:https://chenjiabing666.github.io/2018/12/25/zuul%E6%9C%8D%E5%8A%A1%E7%BD%91%E5%85%B3/本文系读者投稿,已获作者原创授权。如果你有好文章,可以戳这里投稿…

C语言 strcat 函数 - C语言零基础入门教程

目录 一.strcat 函数简介二.strcat 函数原理三.strcat 函数实战四.注意 strcat 函数崩溃问题五.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.strcat 函数简介 前面文章中介绍了关于字符串拷贝的相关函数,例如:strcpy…

多线程:管cheng法

package com.wuming.thread;//测试:生产者消费者模型,利用缓冲区解决:管程法 //生产者,消费者,产品,缓冲区 public class TestPC {public static void main(String[] args) {SynContainer container new S…

C语言 strcat_s 函数 - C语言零基础入门教程

目录 一.strcat_s 函数简介二.strcat_s 函数原理三.strcat_s 函数实战四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.strcat_s 函数简介 前面文章中介绍了关于字符串拼接函数 strcat ,而 strcat_s 函数和 strcat 函数一样&…

写给程序员的裁员防身指南

戳蓝字“CSDN云计算”关注我们哦!大家都知道 18 年底许多大公司都开始了「人员优化」动作,不仅仅美团等大厂有所行动,就连一些平时求贤若渴的小公司也有所动作。本来我以为关于劳动法的事情,许多人应该多多少少都应该了解。但最近…

多线程:信号灯法

package com.wuming.thread;//测试生产者消费者问题2:信号灯法,标志位解决 public class TestPc2 {public static void main(String[] args) {TV tv new TV();new Player(tv).start();new Watcher(tv).start();} } //生产者-->演员 class Player ext…

C语言 va_start 宏 - C语言零基础入门教程

目录 一.前言二.va_start 简介三.va_start 使用四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.前言 对 printf 函数的使用,我们并不陌生,首先我们来看看下面关于 printf 函数的几种调用方式: printf(&q…

使用Kubernetes和Docker将Spring Boot与MongoDB作为容器部署

戳蓝字“CSDN云计算”关注我们哦!对于本教程,您将拥有一个Docker化Spring-Boot实例程序,该应用程序与MongoDB通信以获取GET/POST API请求,并部署在Kubernetes集群中。前提条件MinikubeKubectlDockerMavenDocker是一个具有"社…

C语言 va_end 宏 - C语言零基础入门教程

目录 一.前言二.va_end 简介三.va_end 使用四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.前言 对 printf 函数的使用,我们并不陌生,首先我们来看看下面关于 printf 函数的几种调用方式: printf("…

5种数据分析常用的思维方法!

戳蓝字“CSDN云计算”关注我们哦!转自:中国统计网来源:网络大数据在数据分析中,数据分析思维是框架式的指引,实际分析问题时还是需要很多“技巧工具”的。就好比中学里你要解一元二次方式,可以用公式法、配…

多线程总结

package com.wuming.thread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;//多线程总结 public class ThreadNew {public static void main(String[] args) {new MyThread1().start();new…

C语言 va_arg 宏 - C语言零基础入门教程

目录 一.前言二.va_arg 简介三.va_arg 使用四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.前言 对 printf 函数的使用,我们并不陌生,首先我们来看看下面关于 printf 函数的几种调用方式: printf("…

分布式系统与消息投递

戳蓝字“CSDN云计算”关注我们哦!原文:https://draveness.me/message-delivery消息是一个非常有趣的概念,它是由来源发出一个离散的通信单元,被发送给一个或者一群接受者,无论是单体服务还是分布式系统中都有消息的概念…

什么是计算机网络

1.打电话:连接 TCP 2.发短信:发就完了 UDP 计算机网络:地理位置不同的多台计算机及外部设备,通过线路连接,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系…

C语言 vprintf 函数 - C语言零基础入门教程

目录 一.vprintf 函数和 printf 函数声明简介 1.printf 函数声明2.vprintf 函数声明 二.vprintf 函数和 printf 函数使用三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.vprintf 函数和 printf 函数声明简介 1.printf 函数声明 int printf…

“迁移策略+新容器运行时”应对有状态应用的冷热迁移挑战

戳蓝字“CSDN云计算”关注我们哦!作者:稻农来源:阿里系统软件技术稻农(叶磊)阿里云智能事业群高级技术专家参与主导容器运行时及网络创新工作;目前的工作侧重于基于进程虚拟化的研究及增强(网络…

C语言 main 函数参数 main(int argc, char *argv[]) - C语言零基础入门教程

目录 一.main 函数写法二.main 函数参数简介三.使用 main 函数参数 1.打印 main 函数参数 a.直接运行 exe 文件b.打开 cmd 命令行窗口执行 exe 文件c.打开 cmd 命令行窗口执行 exe 文件并设置 main 函数参数 2.使用 main 函数参数 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C …

网络通信的两个要素

如何实现网络通信? 通信双方地址: ip 端口号 192.168.16.124:5900 规则:网络通信的协议 TCP/IP参考模型: 小结: 1.网络编程两个主要问题: 定位一台或多台主机 找到主机如何通信 2.网络编程要素 …