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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

原文:"可以直接访问外部类中的成员,因为还持有外部类中的作用。但是不可以访问它所在的局部类中的变量。只能访问被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);
        }
}


评分

参与人数 1技术分 +1 收起 理由
王震阳老师 + 1 赞一个!

查看全部评分

15 个回复

倒序浏览
1,我复制你的代码编译了一遍,是会报错的。2,你内部类并没有打印y的值,所以编译不会报错
回复 使用道具 举报
付博 发表于 2014-10-21 22:31
1,我复制你的代码编译了一遍,是会报错的。2,你内部类并没有打印y的值,所以编译不会报错 ...

D:\javapractise>javac Demo.java
Demo.java:11: 错误: 从内部类中访问本地变量a; 需要被声明为最终类型
                                 System.out.println(a);
                                                    ^
1 个错误

评分

参与人数 1技术分 +1 收起 理由
王震阳老师 + 1 赞一个!

查看全部评分

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

Demo.java:11: 错误: 从内部类中访问本地变量y; 需要被声明为最终类型
                                 System.out.println(y);
                                                    ^
1 个错误
回复 使用道具 举报
付博 发表于 2014-10-21 22:34
Demo.java:11: 错误: 从内部类中访问本地变量y; 需要被声明为最终类型
                                 ...

为什么我打印的y没有出错?
回复 使用道具 举报
付博 发表于 2014-10-21 22:31
1,我复制你的代码编译了一遍,是会报错的。2,你内部类并没有打印y的值,所以编译不会报错 ...

我打印y的话也不会报错啊?
回复 使用道具 举报
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);
        }



我这样编译也不会报错
回复 使用道具 举报
付博 发表于 2014-10-21 22:31
1,我复制你的代码编译了一遍,是会报错的。2,你内部类并没有打印y的值,所以编译不会报错 ...

好了  解决了  我的jdk是1.87版本的,1.7以下都是编译不成功的
回复 使用道具 举报
付博 中级黑马 2014-10-22 19:10:50
9#
15621506590 发表于 2014-10-22 19:03
好了  解决了  我的jdk是1.87版本的,1.7以下都是编译不成功的

奥奥,怪不得,我也正在学,一起加油吧!
回复 使用道具 举报
付博 发表于 2014-10-22 19:10
奥奥,怪不得,我也正在学,一起加油吧!

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

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

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

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

恩恩 好的  以前没有注意到
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马