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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© doomsday 高级黑马   /  2015-4-8 15:58  /  1965 人查看  /  27 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 doomsday 于 2015-4-9 13:03 编辑

class A{
        public void show() {
                int a = 1;
                class B{
                        public void xx() {
                                System.out.println(a);
                        }
                }
        }
}

27 个回复

倒序浏览
不会吧,这不是内部类吗?
回复 使用道具 举报
会的,a是局部变量,内部类不能访问局部变量,除非a是final修饰的
回复 使用道具 举报
本帖最后由 doomsday 于 2015-4-8 19:25 编辑
JarryHorse 发表于 2015-4-8 17:37
会的,a是局部变量,内部类不能访问局部变量,除非a是final修饰的

你的JDK什么版本的 我的是 JDK8 怎么不报错呢
回复 使用道具 举报
会报错的。
回复 使用道具 举报

请问你的jdk什么版本的
回复 使用道具 举报
不会报错的,新版会默认a被final修饰
回复 使用道具 举报
doomsday 发表于 2015-4-8 19:14
你的JDK什么版本的 我的是 JDK8 怎么不报错呢

我JDK8,这跟JDK版本无关,这是Java底层机制决定的,方法在栈中运行,内部类对象存放在堆中,存在方法运行完被释放(局部变量a也同时被释放)内部类对象还在被引用的情况,这时内部类对象就无法再引用变量a了。你还没学到这些吧?你编译它要有new对象的方法吧?你确定你真的编译它了?确定用的是Java语言么,如果是就太不可思议了,我用MyEclipse编译都出错
回复 使用道具 举报
突然世界晴 发表于 2015-4-8 20:10
不会报错的,新版会默认a被final修饰

如果默认为final修饰 那么改成a++编译,为什么会报错“从内部类引用的本地变量必须是最终变量或实际上的最终变量”
回复 使用道具 举报
doomsday 发表于 2015-4-8 22:38
如果默认为final修饰 那么改成a++编译,为什么会报错“从内部类引用的本地变量必须是最终变量或实际上的 ...

因为被final修饰的变量不能改变啊。
异常说明不是很清楚了么,最终变量嘛。 你a++不是等于修改变量么。。
回复 使用道具 举报
JarryHorse 发表于 2015-4-8 22:28
我JDK8,这跟JDK版本无关,这是Java底层机制决定的,方法在栈中运行,内部类对象存放在堆中,存在方法运 ...



我用eclips和直接dos窗口下编译都是一样的
回复 使用道具 举报
本帖最后由 doomsday 于 2015-4-8 22:49 编辑
君嘘 发表于 2015-4-8 22:40
因为被final修饰的变量不能改变啊。
异常说明不是很清楚了么,最终变量嘛。 你a++不是等于修改变量么。。 ...

你没看明白提示吗?意思是要把a申明为最终,意思是还没申明为final
如果你把a修饰为final的话 a++会提示“无法为最终变量a分配值”
回复 使用道具 举报
本帖最后由 君嘘 于 2015-4-8 23:04 编辑
doomsday 发表于 2015-4-8 22:47
你没看明白提示吗?意思是要把a申明为最终,意思是还没申明为final
如果你把a修饰为final的话 a++会提示“ ...

从内部类引用的本地变量必须是最终变量或实际上的最终变量
你从这句话看出了什么,不是已经说明了a必须被final修饰么。

可以这么理解:你没有用final修饰变了,虚拟机默认帮你加上了。当出现错误操作的时候,虚拟机当然是提醒你a是要被final修饰,final修饰的变量是最终变量,是不可改变的。
然后你加上final的话,虚拟机认为你知道用final修饰,但是不知道final修饰的变量不能改变值,所以提示当然要变一变。
回复 使用道具 举报
JarryHorse 发表于 2015-4-8 22:28
我JDK8,这跟JDK版本无关,这是Java底层机制决定的,方法在栈中运行,内部类对象存放在堆中,存在方法运 ...

能编译的 ,而且能运行。保持楼主的代码不变,在show方法上new个B对象调用xx方法。打印结果是1没错
回复 使用道具 举报
君嘘 发表于 2015-4-8 23:03
从内部类引用的本地变量必须是最终变量或实际上的最终变量
你从这句话看出了什么,不是已经说明了a必须被f ...


用你的话说,这个就应该提示“无法为最终变量a分配值”
我反编译class后a并没有被final修饰
回复 使用道具 举报
doomsday 发表于 2015-4-8 23:10
用你的话说,这个就应该提示“无法为最终变量a分配值”
我反编译class后a并没有被final修饰
...

你搞错了吧  这样是能编译的啊。我都试过了。。
回复 使用道具 举报
君嘘 发表于 2015-4-8 23:09
能编译的 ,而且能运行。保持楼主的代码不变,在show方法上new个B对象调用xx方法。打印结果是1没错 ...

哥们儿你这就太不厚道了,如果您理解得还不是很深入就得好好琢磨琢磨了,如果你理解了还说出这话我就当你是在调戏大家:lol
回复 使用道具 举报
不会报错,内部类
回复 使用道具 举报
doomsday 发表于 2015-4-8 22:44
我用eclips和直接dos窗口下编译都是一样的

我的是这样的,老毕视频中第9天第4节的第4分20秒开始,有对这个知识点的讲解

图片1.png (20.16 KB, 下载次数: 90)

图片1.png
回复 使用道具 举报
JarryHorse 发表于 2015-4-8 23:36
我的是这样的,老毕视频中第9天第4节的第4分20秒开始,有对这个知识点的讲解
...

你确定你的eclipse支持jdk8吗?你试试在dos窗口下编译呢
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马