这是我正在努力解决的一个更大问题的简短子问题。
为什么我无法通过第 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
为什么我不能通过 内类在第 8 行的外类中?
因为该字段是类 OuterClass 的字段,而不是类 InnerClass 的字段。因此,要访问它,您需要一个类 OuterClass 的实例,而不是类 InnerClass 的实例。
当然,在InnerClass定义中,你可以隐式访问OuterClass的所有字段。但这只是从上下文内部访问的问题。您没有指定要尝试访问该字段的对象是什么,因此语言会自动为您选择该对象。它通常是this.field,但在包含类的字段的情况下,它实际上是OuterClass.this.field。
一旦你尝试指示你试图访问一个字段的对象是什么,而不是让语言隐式地为你选择那个对象,那么这个对象实际上必须是包含该字段的类。