局部内部类访问局部变量的问题

本文详细解析了局部内部类访问局部变量时,为何需要使用final修饰符,通过实验验证和代码分析,揭示了其背后的生命周期原理,并澄清了常见误解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

众所周知,局部内部类访问局部变量,需要在局部变量前面加上final修饰符,关于这个问题的解答,包括各种书籍里面都有不同的答案.

但是,今天在石松老师的讲解并演示下,我彻底明白了,只有一个原因,那就是:生命周期的原因.

class Outerx{
public void show(){
 int x=6;
class Inner{
public void function(){
System.out.println("hei"+x);
}
}
new Inner().function();
}
}

此时如果编译的话,会提示:从内部类中访问本地变量x,需要被声明为最终类型.

如果加上最终类型,final 后   final int x = 6;    再次进行编译,则会成功输出内容.

那么问题来了,为什么加上一个final后,就会成功运行了呢?就像我前面说的,生命周期.....可是有的书上也写道,

是延长了变量的生命周期,对于这样的话,我想说:明显是不正确的.

可以做个小实验,比如在main方法里面写:

public static void main(String[]ag){

{

final int  x = 100;

}

System.out.println(x);

}

此时如果编译的话,会提示:找不到符号    ,出去了范围以后,就不能再使用了,此处说final延长了生命周期,明显已经站不住脚了.

而解决这个问题,可以换一个思路,也许只是绕过了这个棘手的问题呢?

也就是说:加上了final以后,x的值固定为了6,Java编译的时候,后面访问x的地方,直接写成了6,就不让x再出现了.

话虽如此,也要验证一下,比如,可以反编译一下,就可以清楚的看到class文件里面虽然有一堆乱码,但是乱码中间有这样几个词还是可以认得的

hei!6   

在局部内部类和局部变量是同样的级别,因此,不存在超出范围,也就是找不到符号的前提下,sun公司巧妙的规避了这样的一个问题,通过final关键字,让输出语句内的变量变成了常量固定的值.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值