这里我有一个包含匿名内部类的类:
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
放在那里?
谢谢!
答案 0 :(得分:3)
首先,放置该行会出现语法错误,因为您无法获得方法之外的指令。而且你试图在匿名内部阶级的体内放一条指令。
但最重要的是,您不需要该行,也不需要构造函数(对于匿名内部类是不可能的),也不需要初始化程序块。
构造匿名内部类实例时会自动调用超类的构造函数,并将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
打印:
{{1}}
答案 1 :(得分:2)
这里有两个问题:
您正在课堂上使用声明
value = startVal;
即使它已修复,你仍然会引用静态方法的非静态字段
static Example makeExample(int startVal)