Java中匿名内部类 只能访问外部类变量

本文深入探讨Java内部类中匿名内部类和局部内部类为何只能访问外部类的Final变量,同时解释了字符串对象创建过程中的生命周期与内存管理原理,揭示了Java内存分配机制下的微妙之处。

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

        今天看到Java语法书内部类中的 匿名内部类和局部内部类 只能访问外部类的Final变量,不知道为什么这样设计,很是不解,不过后来想想发现好像只能这样.

    首先明确一点的是:匿名内部类和局部内部类只能访问外部类的Final变量.

为什么会这样呢?既然是内部类了就想当然的 让他们能访问全部的外部类变量,但是后来一想确实有问题.

首先假如调用了外部类的一个方法f(),他内部有一个内部类class a和局部变量i,假如a中调用了变量i,当f结束的时候,i就跟着结束生命周期,a没有结束,那么就会出现a中访问一个不存在的内存地址,这样会导致严重错误.

为什么final变量可以呢,如果变量i定义为一个final类型,class a中用的就是变量的一份copy,和变量i是同样的值,当f()结束的时候,变量i跟着结束,但是a中的copy没有结束,而且和变量i保持同样的值.


最后,突然想到一个问题,String s = new String("ABC") + new String("ABC");

上面语句一共创造几次对象,个人感觉应该是4次,

第一次:碰到第一个“ABC”,在String池中创建一次String对象

第二次:碰到第一个new 在内存池创建一次String对象

第三次:碰到第二个new在内存池创建一次String对象(在String池中已经有过一次了,所以不再创建)

第四次:"ABCABC" 和在一起,在String内存池中创建一次String对象,传递给s对象.

个人感觉一共4次.

在Java中,非静态(匿名)内部类会默认隐性引用外部类对象。而静态内部类不会引用外部类对象

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值