A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王康2 初级黑马   /  2012-4-24 16:10  /  1904 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class OutterTest
{
    public static void main(String[] args)
    {
            Outter out = new Outter();
            out.show(11);
    }
}
class Outter
{
    public void show(final int a)
    {
            class Inner
            {
                    public void show1()
                    {
                            System.out.println(a);
                    }
            }
            new Inner().show1();
    }
}
为什么在方法内的类只能访问带final的局部变量呢?

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

6 个回复

倒序浏览
在主线程中(可以想象成main方法中)定义了一个局部变量(非final的),而在主线程的子线程中用到了此变量,可是现在主线程已经结束了,那么局部变量随着也就消失了。可是子线程还要用这个变量,所以只能将该变量定义为final的。这与变量的声明周期有关。其实记住就行了,如果方法内用到的局部变量将其设为final就可以了,如果记不住编译器也会告诉你的。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 周海诚 于 2012-4-24 16:18 编辑

刚学习我也提了2个类似的问题,阿门,对照运用。
因为内部类对象的生命周期会超过局部变量的生命期。局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,局部变量全部死亡,而:内部类对象生命期,与其它类一样,当创建一个该局部类对象后,只有没有其它人再引用它时,它才会死亡。一个方法已调用结束,但该局部类的对象仍然活着。即:局部类的对象生命期会超过局部变量。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
1  局部内部类的范围比方法的还小
2局部变量不能定义为 public  protected  private   static
回复 使用道具 举报
之前有同学问了,我解决了,你看下。
求解释,final的作用?
http://bbs.itheima.com/forum.php ... 6&fromuid=20350
回复 使用道具 举报
实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。

回复 使用道具 举报
这要知道2点,
1、final的作用;
2、内部类为什么不能调用不用final修饰的局部变量;
final修饰的变量为常量,常量是定义在堆内存常量池中的
内部类对象建立在堆内存中,局部变量在栈内存被创建,但方法被执行完,方法中的局部变量就会释放,然而内部类对象呗调用时就没有得到它要访问的局部变量;
所以内部类就不能访问局部变量,除非是修饰final的常量,常量在堆内存中的常量池中,存活的生命周期与类一样;所以可以调用常量;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马