如果有一个内部匿名类的类如下:
class D {
void j() {
System.out.println("D");
}
public static void main(String[] args) {
D d = new D() {
@Override
void j() {
System.out.println("Anonymous!");
}
};
d.j();
// D.this.j();
// super.j();
}
}
如何调用打印“D”的“外部”方法j()?
我知道如果它不是静态的(因为main方法是静态的)那么我可以使用:
D.this.j();
我知道匿名内部类中的j()方法覆盖了D类中的j()方法,但我不能使用 super.j(); - 编译器说:
不能在静态上下文中使用super)。
看起来D.j()不能在代码中从那个地方调用,但我只是想确定。有什么难事吗?
答案 0 :(得分:2)
只需在main方法中实例化 D 类:
D dd = new D();
dd.j();
答案 1 :(得分:2)
有两种方法可以解决问题 - 两者都需要修改其中一个类。
您可以在D
类中引入“后备”方法,然后可以正常调用。
void j() {
fallback();
}
void fallback() {
System.out.println("D");
}
public static void main(String[] args) {
D d = new D() {
@Override
void j() {
System.out.println("Anonymous!");
}
};
d.j(); // prints 'Anonymous!'
d.fallback(); // prints 'D'
}
如果您没有父D
类的编辑权限,例如因为它来自库,您可以在匿名类中引入一个调用super
实现的方法。 / p>
void j() {
fallback();
}
void fallback() {
System.out.println("D");
}
public static void main(String[] args) {
class AnonD extends D{
@Override
void j() {
System.out.println("Anonymous!");
}
void superJ() {
super.j();
}
}
AnonD d = new AnonD();
d.j(); // prints 'Anonymous!'
d.superJ(); // prints 'D'
}
这有一个小缺点,你需要命名你的匿名类。您不必将它作为顶级类声明,因为您也可以在本地声明它所使用的方法。
答案 2 :(得分:1)
问题是您在非静态上下文中创建了方法j()
。
一个可行的解决方案是通过添加“静态”来使j()
静态化。 j前面的关键字,如下:
static void j(){...}
现在,您可以在指定的错误中访问“静态上下文”中的j()
。
答案 3 :(得分:1)
您不能在静态上下文中使用非静态内容。
this
,super
- 非静态事物,它们不存在于静态上下文中
您需要初始化对象D
,然后通过引用调用j()
方法:
new D().j();
我认为这有助于你弄明白:
class D {
public static void main(String[] args) {
// static context
D a = new D() {
// only non-static methods and fields
@Override
void j() {
// non-static context - possible to use 'super' and 'this' keywords
}
};
}
void j() {
// non-static context - possible to use 'super' and 'this' keywords
}
}