这两天写程序的过程中遇到了一个问题:参数必须是终态的(final),否则程序报错!思考良久还是想不通,去网上搜索了半天也没有找到原因。最后还是在某QQ群里面得到了一位高人的指点,然后自己才找到了一些相关信息。虽然现在还是不太懂,但好在找到了方向。暂且记下吧!
测试代码:
- import java.awt.Image;
- public class Test
- {
- //public void outputA(Image image) //错误代码
- public void outputA(final Image image)
- {
- new TestB(){
- public void output()
- {
- System.out.println(image.getWidth(null));
- }
- };
- }
- }
- class TestB
- {
- public void outputB(Image image)
- {
- int width = 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,打开之后没有找到上面的内容。呵呵,暂且放下,留待以后研究吧!