6
回答
java 内部类问题
终于搞明白,存储TCO原来是这样算的>>>   
class Outer{
	private String a = "你好啊!";
	public void fun(final int b){
		class Inner{
			public void print(){
				System.out.println(a);
				System.out.println(b);
			}
		}
		new Inner().print();
	}
}
public class Test53{
	public static void main(String args[]){
		new Outer().fun(30);
	}
}

当我把 final 去掉的时候也能编译通过,并执行完成

老师教程上的示例时,却没有编译通过,这是为什么?

<无标签>
举报
h3
发帖于1周前 6回/111阅
共有6个答案 最后回答: 1周前

当把 final 去掉的时候,是不能通过编译的。对应的编译错误信息,正是因为你去掉了 final:

D:\java\test>javac Test53.java

Test53.java:7: 从内部类中访问局部变量 b;需要被声明为最终类型
                                System.out.println(b);
                                                   ^
1 错误

你肯定是没有去掉 final, 就编译了。

--- 共有 2 条评论 ---
h3JDK 1.8 1周前 回复
h3看楼下,我真的是去掉了,还编译通过才上来问的. 1周前 回复

引用来自“tcxu”的评论

当把 final 去掉的时候,是不能通过编译的。对应的编译错误信息,正是因为你去掉了 final:

D:\java\test>javac Test53.java

Test53.java:7: 从内部类中访问局部变量 b;需要被声明为最终类型
                                System.out.println(b);
                                                   ^
1 错误

你肯定是没有去掉 final, 就编译了。

去掉了,很神奇,不知道哪里的问题.....

鉴于你是用"记事本"写的代码,那再问你一句:

你是否在去掉 final 后,保存了 Test53.java 文档?

如果没保存,那被编译的文档中,仍然有 final,  因此编译仍然通过,运行后,仍然是老结果。

--- 共有 1 条评论 ---
h3已经反复确认过多次,确定有保存,我下的是 JDK 1.8 其他的好像没什么,我同事也不理解为什么会这样,我一会换个电脑试下. 1周前 回复

我用的是 老版本 JDK。估计,老师教程上的示例, 不会是用 JDK 1.8 编译的。用老版本试试?

--- 共有 1 条评论 ---
h3都试了,1.6编译不过 1.8试了三个计算机,都能编译通过 1周前 回复

在你的文件开头增加一行注释,然后在编译之前,先用type指令看下文件内容开头是否有这个注释,确保命令行和你记事本操作的是同一个文件

--- 共有 1 条评论 ---
h3还是一样。 1周前 回复
顶部