public class Test {
interface Print{
void printNumber();
}
public static void work(Print print){
System.out.println("开始工作,现在打印一个数字");
print.printNumber();
System.out.println("结束工作。");
}
public static void main(String[] args){
int id = 5678;
work(new Print() {
@Override
public void printNumber() {
//id = 4444;
//假如我试图在这里更改id的值,就会报错,why?
System.out.println(id);
//没有报错是输出为5678
}
});
}
}
我把java学习中遇到的问题归结为以上测试类,如我上面的注释,当我重写接口中的方法时,在重写方法中无法修改id的值,这是为什么呢?
你实现这个接口时其实创建了一个内部类,这个内部类是属于外部类的,而不是构造他的方法的,所以他没法访问构造他方法里的非终态变量。
简单的来说,你再 people() 方法里建立实现 Print 接口的内部类,其中使用了 id 这个变量,而其实你是在 work() 方法里才调用了 Print ,其实这时候已经超出了 people() 的访问范围,你是没法访问到 id 这个变量的。不过Java提供里一个机制,你可以把 id 参数传入 Print 中,实际上这些参数会复制到 Print 中,不过为了确保产生歧义,这些参数都是终态的,你没法修改它(避免你以为修改它就能修改 people() 里的 id)。