繁体   English   中英

如果匿名内部类有两个外部类,如何获取外部类的引用?

[英]How can I get the outer class's reference if the anonymous Inner Class has two outer class?

public class OuterClass {
    public class InnerClass{
         void test(){
         };
    }
}

class Client{
    public void x(){}
    public void lucian() {
        OuterClass.InnerClass innerClass = new OuterClass().new InnerClass(){
            void test() {
                Client.this.x();
                x();
                ******** // how can I get the reference of the OuterClass at here? ********
            }
        };
        innerClass.test();
    }
}

我知道编译器将为带有两个参数的匿名内部类生成一个构造函数,一个是客户端的引用,另一个是外部类,但是如何使用 Client.this 在方法 test() 中获取外部类的引用,就像客户端的引用一样? 不是客户。这个!! 但是外部类在客户端中的引用。

你不能。 无论如何,不​​是疯狂的反射恶作剧。 所以,只要写出来:

public void lucian() {
    OuterClass oc = new OuterClass();
    OuterClass.InnerClass ic = oc.new InnerClass() {
        void test() {
            Client.this.x();
            x();
            oc.x();
        }
    };
    ic.test();
}

注意:非静态内部类很奇怪,很少正确。 初学者 Java 程序员永远不要使用它们; 高级 Java 编码人员应该认真思考。 在任何情况下,内部类的默认选择应该始终是它们是静态的。

您可以保存对 OuterClass 对象的引用(到目前为止您是匿名创建的):

class Client{

    private OuterClass outerClass;

    public OuterClass getOuterClass() {
        return outerClass;
    }

    public void setOuterClass(OuterClass outerClass) {
        this.outerClass = outerClass;
    }

    public void x(){
        System.out.println("===");
    }
    public void lucian() {
        OuterClass outerClass = new OuterClass();
        setOuterClass(outerClass);
        OuterClass.InnerClass innerClass = outerClass.new InnerClass(){
            void test() {
                Client1.this.x();
                x();
                System.out.println(getOuterClass());
            }
        };
        innerClass.test();
    }
    public static void main(String[] args) {
        Client client = new Client();
        client.lucian();
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM