黑马程序员技术交流社区

标题: 【紧急求助】毕老师讲的第九天的内部类我所遇到的问题 [打印本页]

作者: 15621506590    时间: 2014-10-21 20:18
标题: 【紧急求助】毕老师讲的第九天的内部类我所遇到的问题
原文:"可以直接访问外部类中的成员,因为还持有外部类中的作用。但是不可以访问它所在的局部类中的变量。只能访问被final修饰的局部变量。"
那么问题来了:我没有使用final修饰,为什么也编译成功了,也成功打印了???难道我哪里做错了?还是版本不一样?小白求助!
代码如下:
class Outer
{
        int x = 3;
        void method(int a)        //注释:毕老师讲的在int前应该加个final修饰下,不然访问不了,但为什么在我这不加final也成功访问了?
        {
                 int y=4;          //如果要打印y的值的话也要加上final,但是我没加也是成功打印了
                class Inner
                {
                        void function()
                        {
                                System.out.println(a);
                        }
                }
                new Inner().function();
        }
}

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



作者: 付博    时间: 2014-10-21 22:31
1,我复制你的代码编译了一遍,是会报错的。2,你内部类并没有打印y的值,所以编译不会报错
作者: 付博    时间: 2014-10-21 22:32
付博 发表于 2014-10-21 22:31
1,我复制你的代码编译了一遍,是会报错的。2,你内部类并没有打印y的值,所以编译不会报错 ...

D:\javapractise>javac Demo.java
Demo.java:11: 错误: 从内部类中访问本地变量a; 需要被声明为最终类型
                                 System.out.println(a);
                                                    ^
1 个错误
作者: 付博    时间: 2014-10-21 22:34
付博 发表于 2014-10-21 22:31
1,我复制你的代码编译了一遍,是会报错的。2,你内部类并没有打印y的值,所以编译不会报错 ...

Demo.java:11: 错误: 从内部类中访问本地变量y; 需要被声明为最终类型
                                 System.out.println(y);
                                                    ^
1 个错误
作者: 15621506590    时间: 2014-10-22 18:25
付博 发表于 2014-10-21 22:34
Demo.java:11: 错误: 从内部类中访问本地变量y; 需要被声明为最终类型
                                 ...

为什么我打印的y没有出错?
作者: 15621506590    时间: 2014-10-22 18:29
付博 发表于 2014-10-21 22:31
1,我复制你的代码编译了一遍,是会报错的。2,你内部类并没有打印y的值,所以编译不会报错 ...

我打印y的话也不会报错啊?
作者: 15621506590    时间: 2014-10-22 18:30
class Outer
{
        int x = 3;
        void method(int a)        //注释:毕老师讲的在int前应该加个final修饰下,不然访问不了,但为什么在我这不加final也成功访问了?
        {
                 int y=4;          //如果要打印y的值的话也要加上final,但是我没加也是成功打印了
                class Inner
                {
                        void function()
                        {
                                System.out.println(y);
                                                                 System.out.println(a);
                        }
                }
                new Inner().function();
        }
}

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



我这样编译也不会报错
作者: 15621506590    时间: 2014-10-22 19:03
付博 发表于 2014-10-21 22:31
1,我复制你的代码编译了一遍,是会报错的。2,你内部类并没有打印y的值,所以编译不会报错 ...

好了  解决了  我的jdk是1.87版本的,1.7以下都是编译不成功的
作者: 付博    时间: 2014-10-22 19:10
15621506590 发表于 2014-10-22 19:03
好了  解决了  我的jdk是1.87版本的,1.7以下都是编译不成功的

奥奥,怪不得,我也正在学,一起加油吧!
作者: 15621506590    时间: 2014-10-22 19:21
付博 发表于 2014-10-22 19:10
奥奥,怪不得,我也正在学,一起加油吧!

恩恩 加油
作者: maralbertlee    时间: 2014-10-22 19:39
没有办法编译成功的,如果使用Eclipse的话,会提示要求给y和a增加final修饰的,鉴于你那种情况,我猜测,你可能是没有进行编译就直接去执行了,执行的是你前一次编译好的字节码文件(class)。或者你编译了,又运行了一次,那么这时运行的字节码文件还是上次编译出来的文件,所以,这种现象也比较正常。
作者: 15621506590    时间: 2014-10-22 19:49
maralbertlee 发表于 2014-10-22 19:39
没有办法编译成功的,如果使用Eclipse的话,会提示要求给y和a增加final修饰的,鉴于你那种情况,我猜测,你 ...

不是的,我用的就是Eclipse,也进行编译了,编译是成功的,是编译后运行的。。原因已经解决了,我的jdk用的是1.8版本的,1.8版本是编译成功的。如果是1.7或者1.7一下的版本是编译不成功的
作者: maralbertlee    时间: 2014-10-22 19:52
15621506590 发表于 2014-10-22 19:49
不是的,我用的就是Eclipse,也进行编译了,编译是成功的,是编译后运行的。。原因已经解决了,我的jdk用 ...

还是建议不要使用1.8,因为现在大多数企业为了追求稳定,所以还是使用的是1.6或是1.7版本的
作者: qq8921310    时间: 2014-10-22 19:59
版本的问题,你试着修改一下这个值,就会报错。说明final在内部默认加了。
作者: 15621506590    时间: 2014-10-22 20:24
qq8921310 发表于 2014-10-22 19:59
版本的问题,你试着修改一下这个值,就会报错。说明final在内部默认加了。 ...

恩恩 是的 这个版本已经默认加上了
作者: 15621506590    时间: 2014-10-22 20:25
maralbertlee 发表于 2014-10-22 19:52
还是建议不要使用1.8,因为现在大多数企业为了追求稳定,所以还是使用的是1.6或是1.7版本的 ...

恩恩 好的  以前没有注意到




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