这里有一个包含匿名内部类的类:
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)