这两天写程序的过程中遇到了一个问题:参数必须是终态的(final),否则程序报错!思考良久还是想不通,去网上搜索了半天也没有找到原因。最后还是在某里面得到了一位高人的指点,然后自己才找到了一些相关信息。虽然现在还是不太懂,但好在找到了方向。暂且记下吧!
测试代码:
- importjava.awt.Image;
- publicclassTest
- {
- //publicvoidoutputA(Imageimage)//错误代码
- publicvoidoutputA(finalImageimage)
- {
- newTestB(){
- publicvoidoutput()
- {
- System.out.println(image.getWidth(null));
- }
- };
- }
- }
- classTestB
- {
- publicvoidoutputB(Imageimage)
- {
- intwidth=image.getWidth(null);
- }
- }
如上所示,如果将第6行的代码换成第5行(即注释第6行并取消注释第5行),程序的11行处就会提示:Cannot refer to a non-final variable image inside an inner class defined in a different method。
如此一来,这个参数就变成了final参数。关于这,我找到了一点儿信息:Java允许我们将参数设成final属性,方法是在参数列表中对它们进行适当的声明。这意味着在这个方法的内部,我们不能改变该参数指向的东西(对象)。
网友告诉我:
【
Thinking in java里面的说法(唯一正确的说法):
如果定义一个匿名内部类,并且希望它使用一个在其外部定的对象,那么编译器会要求其参数引用是final的。
说明一下:
1.匿名内部类肯定是局部内部类(在一个方法里面定义的内部类),因为在java中,语句必须写在方法里,而匿名内部类其实就是一条特殊的语句;
2.外部给定的对象就是所有外来的对象:外部方法的形参、局部变量、基本类型或自定义类型等。
】
我从网上下载了一个 thinkinjava.pdf,打开之后没有找到上面的内容。呵呵,暂且放下,留待以后研究吧!