您可以使用本地类而不是匿名类.看:
public class Test {
public static void main(String... args) {
class MyInner {
private int value = 10;
}
MyInner inner = new MyInner();
System.out.println(inner.value);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以MyInner
仅在方法体中引用类型.因此,在方法之外,您将无法使用未在其超类(java.lang.Object
在本例中)或接口中声明的字段/方法.
匿名内部类具有类型但没有名称.
您可以访问未由命名超类型定义的字段.但是,一旦分配给命名类型变量,接口就会丢失.
显然,您可以从内部类本身访问字段.添加代码的一种方法是通过实例初始化器:
final AtomicInteger y = new AtomicInteger();
new Runnable() {
int x;
{
x = 5;
doRun(this);
y.set(x);
}
public void run() {
... blah ...
}
};
Run Code Online (Sandbox Code Playgroud)
匿名内部类表达式返回的值具有匿名类型,因此您有一次机会在类本身之外使用它:
final int y = new Runnable() {
int x;
{
x = 5;
doRun(this);
}
public void run() {
... blah ...
}
}.x;
Run Code Online (Sandbox Code Playgroud)
您还可以通过类似于以下方式声明的方法传递它:
<T extends Runnable> T doRun(T runnable);
Run Code Online (Sandbox Code Playgroud)