当实例化嵌套类时,它如何引用外部类?它总是扩展外部类或以另一种方式引用它吗?我被告知内部延伸到外部但是为什么以下示例不起作用?
例如:
public class OuterClass {
public String fruit = "apple";
public class InnerClass {
public String fruit = "banana";
public void printFruitName(){
System.out.println(this.fruit);
System.out.println(super.fruit);
}
}
}
上述版本无法编译,super.fruit
错误表示“水果”无法解析。但是,如果指定内部类来扩展外部类,那么它可以工作:
public class OuterClass {
public String fruit = "apple";
public class InnerClass extends OuterClass {
public String fruit = "banana";
public void printFruitName(){
System.out.println(this.fruit);
System.out.println(super.fruit);
}
}
}
这似乎表明除非特别指定,否则内部类不会扩展外部类。
答案 0 :(得分:8)
没有隐式子类型关系:您的观察/结论是正确的。 (在第一种情况下,super
的类型为“Object”,而“Object.fruit”确实不存在。)
如图所示,inner class(与“静态嵌套类”相对)必须在外部类的实例的上下文中创建;但这与子输入正交。
要访问外部类的成员,请使用OuterClass.this.member
,或者如果member
未被遮蔽,则只需member
即可解析; super.member
和this.member
都不会解析为外部类成员。
扩展外部类“修复”编译器错误,但this.fruit
的代码不访问封闭的OuterClass实例的成员 - 它只是访问成员从它扩展的超类继承的InnerClass实例。