大家知道为什么要加 final 关键字了

news/2024/6/29 12:01:53 标签: kotlin, 编译器, Java, 编程语言

原文链接:www.jianshu.com/p/acc8d9a67d0c

在开发过程中,由于习惯的原因,我们可能对某种编程语言的一些特性习以为常,特别是只用一种语言作为日常开发的情况。但是当你使用超过一种语言进行开发的时候就会发现,虽然都是高级语言,但是它们之间很多特性都是不太相同的。

现象描述

Java 8 之前,匿名内部类在使用外部成员的时候,会报错并提示 “Cannot refer to a non-final variable arg inside an inner class defined in a different method”

大家知道为什么要加 final 关键字了

 

但是在 Java 8 之后,类似场景却没有再提示了:

大家知道为什么要加 final 关键字了

 

难道是此类变量可以随便改动了吗?当然不是,当你试图修改这些变量的时候,仍然会提示错误:

大家知道为什么要加 final 关键字了

 

可以看到,当试图修改基本数据类型的变量时,编译器的警告变成了 “Varible 'num' is accessed from within inner class, need to be final or effectively final”,很遗憾,仍然不能修改。相比之下,Kotlin 是没有这个限制的:

大家知道为什么要加 final 关键字了

 

原因分析

从表面上当然看不出什么原因,看看编译器做了什么工作吧!运行 javac 命令后生成了几个 .class 文件:

大家知道为什么要加 final 关键字了

 

不难推断,这个 TestInnerClass$1.class 就是匿名内部类编译后的文件,看看它反编译后是什么内容:

大家知道为什么要加 final 关键字了

 

原来,匿名也会被当作普通的类处理,只不过编译器生成它构造方法的时候,除了将外部类的引用传递了过来,还将基本数据类型的变量复制了一份过来,并把引用数据类型的变量引用也传递了过来。因此,基本数据类型的变量当然不能修改了,不然就会跟外部的变量产生不一致,这样的话变量的传递也就变得毫无意义了。

情景对比

但是为什么对于 Kotlin 来说可以在匿名内部类中直接修改基本数据类型的值呢?查看 Kotlin 编译后反编译回来的内容:

大家知道为什么要加 final 关键字了

 

可以发现,当需要传递基本数据类型的变量时,Kotlin 编译器会将这些数据进行包装,从而由值传递变为引用传递,这样内部的修改当然就不会影响到外部了。

验证一下,当变量不进行传递时,Kotlin 编译器是怎么处理的:

大家知道为什么要加 final 关键字了

 

哈哈,并没有多此一举,点个赞!

喜欢对你有帮助的话记得加个关注不迷路哦

还有关注我私信回复【资料】可以领取到一些个人收集的面试及电子书资料,或许对你有帮助!个人主页有领取方式哦



 

 


http://www.niftyadmin.cn/n/1667385.html

相关文章

VS Code 插件 主题 快捷键

VS Code 插件 主题 快捷键 window 下的操作,自己亲自测试 快捷键 打开终端命令行:ctrl 打开命令面板:ctrl shift p 在这里直接输入一些命令,比如输入snippet,选择打开用户代码片段,选中你要编辑的语言…

Vue项目el-input 不能输入的解决办法

目录 一、背景 二、解决办法 1、方法1:标签嵌套太深 2、方法2:使用了 template 作为 el-input 的父标签 3、方法3:v-model 一、背景 输入框动态填充值,但是填充后不能编辑了, 就像是被禁止了一样, 就很无语...查了下资料, v-model填写了, 也没有templete标签嵌套最终方法一即可…

【Mysql】常用DDL语句

修改列的默认值: alter table t_goods alter column enable set default N; 转载于:https://www.cnblogs.com/njlittlecat/p/9854630.html

POJ NOI0113-01 数制转换(PKU2710)

问题链接:POJ NOI0113-01 数制转换。 原题出处:PKU2710 数制转换。 总时间限制:1000ms内存限制: 65536kB描述求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。 不同进制…

你知道一个比SpringBoo快44倍的Java框架嘛?

最近栈长看到一个框架,官方号称可以比 Spring Boot 快 44 倍,居然这么牛逼,有这么神奇吗?今天带大家来认识一下。 这个框架名叫:light-4j。 官网简介:A fast, lightweight and more productive microservi…

装箱问题--C++实现

题目描述 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵&#xf…

思维之道。 文/江湖一剑客

文/江湖一剑客 重新审视“天道酬勤” “你写PPT时,阿拉斯加的鳕鱼正跃出水面,你看报表时,梅里雪山的金丝猴刚好爬上树尖。你挤进地铁时,西藏的山鹰一直盘旋云端,你在会议中吵架时,尼泊尔的背包客一起端起酒…

[BZOJ 2005][Noi2010]能量采集(莫比乌斯反演)

Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量。在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起。 栋栋的植物种得非常整齐,一共有n列&#xff0…