为了账号安全,请及时绑定邮箱和手机立即绑定

java更新了吗,现在局部内部类可以访问非final的局部变量了吗

java更新了吗,现在局部内部类可以访问非final的局部变量了吗

qq_HkJxGnMdGm_0 2019-07-05 20:58:04
class Outer{         int num=3;         void method()         {                 final int y=50;                 class Inner                 {                          void show()                         {                                 System.out.println("show..."+y);                         }                 }                 Inner in=new Inner();                 in.show();         }}class InnerClassDemo3 {         public static void main(String[] args)          {                 new Outer().method();         }}这段代码中,原本应该报错吗?从内部类访问局部变量,该局部变量需要是fianl类型啊?为什么我编译就通过呢?我用的是EditPlusPortable
查看完整描述

1 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

从你的另一个问题来看,你说的“需要是 final 类型”指的是 final int y = 50; 这句吧?

你是想问,这里直接写 int y = 50; 也可以正常编译运行吧?

(虽然这里你写了 final,不过你另一个问题的代码中没有写)


我猜你用的是 JavaSE 8(或以上)的版本对吧?

在 JavaSE 8 版时增加了新规定,local class 除了可以访问 final local 常量外,还可以访问“事实常量”(effectively final,抱歉我不知道该翻译成什么)。

所谓“事实常量”就是指“虽然没有被声明为 final,但是在定义后就没有被更改的变量”。

显然你这个代码中的 y 就是事实常量。

查看完整回答
1 反对 回复 2019-07-06
  • qq_HkJxGnMdGm_0
    qq_HkJxGnMdGm_0
    非常感谢,因为,前一个问题没有排版怕别人看起来不方便,就重新排版再次提问,结果却忽略了final int y ,真是非常感谢,昨天思考了很久一直找不到问题所在,当时就感觉是软件问题或jdk的问题。果然是这样,真是非常感谢!
  • onemoo
    onemoo
    抱歉,大概你是我这两天见到的为数不多的真人用户,所以才发了前面那些吐槽...
  • qq_HkJxGnMdGm_0
    qq_HkJxGnMdGm_0
    没关系的,不用抱歉。问答区不常来吧,一般都是遇到自己实在解决不了的问题就来问问
  • 1 回答
  • 0 关注
  • 786 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信