2

我一直在尝试使用嵌套类的各种作用域技巧,并发现了一个让我难以理解的特殊情况。

假设您有双重嵌套的本地类:

public class Outer {
    private final String className = "outer";

    public Outer() {}

    public void doThings() {
        class Inner {
            private final String className = "inner";
            public Inner() {}
            public void doThings() {
                class InnerInner {
                    private final String className = "inner-inner";
                    public InnerInner() {}
                    public void doThings() {
                        System.out.println("Outer class: "+Outer.this.className);
                        // How to access the Inner member?
                        System.out.println("InnerInner class: "+this.className);
                    }
                }

                InnerInner ii = new InnerInner();
                ii.doThings();
            }
        }

        Inner i = new Inner();
        i.doThings();
    }

    public static void main(String args[]) {
        Outer o = new Outer();
        o.doThings();
    }
}

据我所知,类 Inner 超出了 InnerInner 类的范围。无论如何,InnerInner 可以看到它的 Inner 调用实例吗?当然,使用Outer.Inner.this.className会失败,因为通过 Outer 看不到 Inner。

顺便说一句,我确实意识到这是一个非常规且不恰当的 java 习惯用法,但我认为这很有趣,特别是强调了 javascript 等原型语言和 java 等 OO 语言中范围链接之间的区别。

4

2 回答 2

4

尝试以下 -

System.out.println("Inner class: " + Inner.this.className);
于 2013-06-20T04:16:25.747 回答
1

你可以这样尝试

 System.out.println("Inner class: " + Inner.this.className);
于 2013-06-20T04:21:30.870 回答