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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗超8849 中级黑马   /  2014-8-3 18:39  /  1006 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗超8849 于 2014-8-3 19:46 编辑

代码是如下:
class Outer
{
        int x = 0;

        void method()
        {
                int y = 7;
                class Inner
                {
                        void function()
                        {
                                System.out.println(y);
                        }
                }
                new Inner().function();
        }
}

class InnerClassSvo3
{
        public static void main(String[] args)
        {
                new Outer().method();
        }
}

---------------------------------------------
问题就是,完全这个按理来说,int y = 7;应该差一个final修饰,否则不成功,可是我最后完全没有出现问题。
还有接下来的加入常量,void method(int a),当然下面也是改了的,问题是同样成功了。
是不是我电脑用的是win7,内置的dos有细微的改变?

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1

查看全部评分

4 个回复

倒序浏览
错误: 从内部类引用的本地变量必须是最终变量或实际上的最终变量 -- 编译器如是说。所以y这种只赋值一次的变量也可以使用了。
回复 使用道具 举报
因为你的这个程序运行期间,你的变量y其实都是存在于内存中的,内部类调用外部变量之所以用final就是怕出现外部变量因为生存期的问题而消失,内部类中对外部变量的调用会导致这种正常消失现象变得不正常,本来应该消失的外部变量因为内部类的对象还存在而跟着存在于内存中,所以才会要求使用final修饰从而保证变量状态的正常性。
      而这个程序中,从运行开始到结束,你的这个局部变量都是存在的,因为你就只调用了你的method方法,当你这个方法运行结束后你的y变量虽然回收了,但是你的程序紧跟着结束了。所以才出现你的这种情况。
回复 使用道具 举报
怀念黑海岸 发表于 2014-8-3 19:25
因为你的这个程序运行期间,你的变量y其实都是存在于内存中的,内部类调用外部变量之所以用final就是怕出现 ...

不过还有一点就是要保证y不会被赋值(除了定义时初始化以外)(测试过)
但是按照你的说法其实根本不需要关心y是否会被修改的问题,所以这里也是一个疑问。
回复 使用道具 举报
我刚才试了一下如果不加final的话会报错哦,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马