黑马程序员技术交流社区

标题: 关于视频110中的内部类问题。 [打印本页]

作者: 罗超8849    时间: 2014-8-3 18:39
标题: 关于视频110中的内部类问题。
本帖最后由 罗超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有细微的改变?

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

不过还有一点就是要保证y不会被赋值(除了定义时初始化以外)(测试过)
但是按照你的说法其实根本不需要关心y是否会被修改的问题,所以这里也是一个疑问。
作者: GoodBoy123    时间: 2014-8-3 22:54
我刚才试了一下如果不加final的话会报错哦,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2