0

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

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

  • 该字段在内部类中可见。
  • 对于外部类中的非静态方法,问题仍然存在。
  • 字段的可见性并不重要。无论哪种方式,它都可以从内部类中看到。
  • 可以通过内部类中的(私有)getter 访问该字段,但我的问题的原因之一是,我想避免这些。
  • 它应该成为不可变构建器模式的变体,因此外部类和内部类是紧密连贯地开发的。这是我敢于直接访问字段而不使用 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
4

1 回答 1

0

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

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

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

一旦您尝试指示您尝试访问字段的对象是什么,而不是让语言为您隐式选择该对象,那么该对象实际上必须属于包含该字段的类。

于 2018-06-15T10:11:04.087 回答