Java 访问匿名外部类而不存储在变量中?

Java 访问匿名外部类而不存储在变量中?,java,syntax,anonymous-class,Java,Syntax,Anonymous Class,有没有办法访问匿名外部类?普通类可以通过ClassName.this访问。这不起作用,因为匿名类显然没有名称。我也尝试过使用扩展类/接口(比如Runnable.this),但它似乎无法以这种方式工作 我确信这可能不是最好的编码风格,我只是好奇是否可以不将外部的这一部分存储在变量中 final Runnable r1 = new Runnable() {...}; Runnable r2 = new Runnable() { public void run() { syn

有没有办法访问匿名外部类?普通类可以通过ClassName.this访问。这不起作用,因为匿名类显然没有名称。我也尝试过使用扩展类/接口(比如Runnable.this),但它似乎无法以这种方式工作

我确信这可能不是最好的编码风格,我只是好奇是否可以不将外部的这一部分存储在变量中

final Runnable r1 = new Runnable() {...};
Runnable r2 = new Runnable() {
    public void run() {
         synchronized(r1) {...}
    }
};
例如,请注意外部。此:

public class A
{
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        synchronized (outher.this) {
                            outher.this.notify();
                        }
                    }
                }).start();
                try {
                    synchronized (this) {
                        wait();
                    }
                } catch (final InterruptedException ex) {}
            }
        }).start();
    }
}

不,除了从匿名类内部(即通过
引用之外),无法从任何地方访问匿名类。或者通过显式声明的变量

final Runnable r1 = new Runnable() {...};
Runnable r2 = new Runnable() {
    public void run() {
         synchronized(r1) {...}
    }
};

您可以添加一个方法来返回此中间
this
。它会在范围内,但不会隐藏(这是正确的术语吗?阴影?我忘了)

publicstaticvoidmain(字符串[]args){
新线程(newrunnable()){

Runnable middleThis(){return this;}//你认为它能与匿名类的synchronized(this.getClass().getEnclosuringClass())一起工作吗?@Eric R.我认为这会与DiddiZ发布的内容有所不同(也许你的建议是DiddiZ真正想要的)。假设
main
方法在许多不同的线程中同时执行。在DiddiZ的代码中,它们都在不同的对象上同步-因此没有冲突。在您的代码中,它们都在同一个对象上同步,因此会有一些冲突。但我怀疑您的代码是DiddiZ真正想要的。我s按类而不是按实例同步。如果将同步监视器更改为已同步(this.getClass().getEnclosuringClass())和已同步(this.getClass())(而不是已同步(this))这是可行的。但是,如果在同一个可运行实例上运行多个线程,它将像一个静态同步的实例,即跨所有实例。这是一种巧妙的方法,可以绕过“无需存储在变量中”的限制。