通过内部类引用访问外部类变量

时间:2017-12-15 23:00:14

标签: java inheritance

 public static class Outer {
        public int field;
        public class Inner {}
 }


 //  caller methods
 public static void foo(Outer.Inner inner) {
       // here I want to access the "field"
       // tried the following, none worked
       System.out.println(inner.Outer.field);
       System.out.println(inner.Outer.this.field);
 }

如何从Java中非静态内部类的引用访问类的非静态字段?

P.S
人们一直说这是糟糕的设计。是的,我同意100%这是糟糕的“设计”。至少,对于需要人类阅读的代码来说,这是不好的。但如果这是生成的代码,我想我会得到一个通行证。 (有没有人试过读取Antlr出来的代码,例如?)

3 个答案:

答案 0 :(得分:0)

似乎是一个不太好的主意,但无论如何,你需要自己明确地导出它。

public static class Outer {
    public int field;
    public class Inner {
        public Outer outer() {
            return Outer.this;
        }
    }
}

//  caller methods
public static void foo(Outer.Inner inner) {
   System.out.println(inner.outer().field);
}

答案 1 :(得分:0)

这可能有效 - 无论如何都是错误的编码练习

 public static class Outer {
        public int field;
        public class Inner {
            public Outer outer=Outer.this
        }
 }


 //  caller methods
 public static void foo(Outer.Inner inner) {
       System.out.println(inner.Outer.field);
       System.out.println(inner.Outer.this.field);
 }

答案 2 :(得分:0)

其他答案中提到了一个选项。如果由于某种原因它不适合您的情况,您可以使用getter(以及需要的setter)从Inner公开field

public Outer class {
    private int field;
    public class Inner {
        public int getOuterField() {
            return field;
        }
    }
}

不同的方法是在需要使用Outer的任何地方传递相应的Inner实例,因此在这种情况下foo将采用两个参数。

是的,我同意发布的所有评论 - 所有选项都表明设计不好。