通过外部类的内部类实例访问外部类字段

时间:2018-06-15 08:49:26

标签: java inner-classes builder outer-classes

这是我正在努力解决的一个较大问题的简短问题。

为什么我不能通过第8行外部类中的内部类实例访问外部类字段?

  • 该字段在内部类中可见。
  • 外部类中的非静态方法问题仍然存在。
  • 场地的可见度无关紧要。无论如何,它都可以从内心阶层看到。
  • 该字段可以通过内部类中的(私有)getter访问,但我的问题的原因之一是,我想避免这些。
  • 它应该成为不可变构建器模式的变体,因此外部和内部类是紧密连贯的。这是我敢于直接进入田野的唯一原因。
public class OuterClass {

    private static OuterClass instanceOf(InnerClass innerClass) {
        return new OuterClass(innerClass.outerField);
    }

    public static OuterClass instanceOf(int arg) {
        return new OuterClass(arg);
    }

    private int outerField;

    private OuterClass(int arg) {
        this.outerField = arg;
    }

    // Outer class getters...

    public InnerClass build() {
        return new InnerClass(this);
    }

        public class InnerClass {

            private InnerClass(OuterClass outerClass) {
                outerField = outerClass.outerField;
            }

            // Inner class setters......

            public OuterClass build() {
                return OuterClass.instanceOf(this);
            }
        } // End InnerClass

} // End OuterClass

1 个答案:

答案 0 :(得分:0)

  

为什么我无法通过实例访问外部类字段   第8行外层的内部类?

因为该字段是类OuterClass的字段而不是类InnerClass的字段。因此,要访问它,您需要一个类OuterClass的实例,而不是类InnerClass的实例。

当然,在InnerClass定义中,您可以隐式访问OuterClass的所有字段。但这只是从这个背景下进入的问题。您没有指定您尝试访问该字段的对象是什么,因此语言会自动为您选择。它通常是 this.field ,但对于包含类的字段,它实际上是 OuterClass.this.field

一旦你试图指出你试图访问某个字段的对象是什么,而不是让语言隐含地为你选择那个对象,那么这个对象实际上必须属于该类包含该字段。