匿名内部类Java中的赋值



这里有一个包含匿名内部类的类:

public class Example {
    int value;
    Example(int value) {
        this.value = value;     
    }
    void bumpUp() {
        value++;
    }
    static Example makeExample(int startVal) {
        return new Counter(startVal) {
            int bumpValue = 2;
//          value = startVal;
            void bumpUp() {                 
                bumpValue = (bumpValue == 2) ? 1: 2;
                value+= bumpValue;
            }
        };
    }
}

如果我取消注释说value = startVal的行,Eclipse会抛出一个错误,说上面的行是一个错误。为什么我不能把value = startVal放在那里?

谢谢!

首先,放在那一行是语法错误,因为不能在方法之外有指令。您正试图将一条指令放入匿名内部类的主体中。

但最重要的是,无论是在构造函数中(对于匿名内部类来说,这是不可能的),还是在初始化器块中,都不需要这一行。

在构造匿名内部类实例时,会自动调用超类的构造函数,并将startVal传递给Example的构造函数,在那里它最终被分配给属性value

最后,new Counter(startVal)没有任何意义(Counter类在哪里)?我认为这可能是复制粘贴错误,或者您在其他地方声明了Counter类。在后一种情况下,Counter应该扩展Example,否则会出现编译错误。

以下是所有修复的代码:

public class Example {
    int value;
    Example(int value) {
        this.value = value;
    }
    void bumpUp() {
        this.value++;
    }
    static Example makeExample(int startVal) {
        return new Example(startVal) {
            int bumpValue = 2;
            @Override
            void bumpUp() {
                this.bumpValue = (this.bumpValue == 2) ? 1 : 2;
                this.value += this.bumpValue;
            }
        };
    }
    public static void main(String[] args) {
        Example a = Example.makeExample(7);
        System.out.println(a.value);
        a.bumpUp();
        System.out.println(a.value);
        a.bumpUp();
        System.out.println(a.value);
        a.bumpUp();
        System.out.println(a.value);
        a.bumpUp();
        System.out.println(a.value);
        a.bumpUp();
        System.out.println(a.value);
    }
}

此打印:

7
8
10
11
13
14

这里有两个问题:

你在课堂正文中使用了一个语句

value = startVal;

即使它是固定的,你仍然会引用来自静态方法的非静态字段

static Example makeExample(int startVal)

最新更新