在Java中,嵌套类与其外部类之间的关系是什么?

时间:2014-01-28 01:04:42

标签: java reference nested inner-classes nested-class

当实例化嵌套类时,它如何引用外部类?它总是扩展外部类或以另一种方式引用它吗?我被告知内部延伸到外部但是为什么以下示例不起作用?

例如:

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);
        }
    }

}

这似乎表明除非特别指定,否则内部类不会扩展外部类。

1 个答案:

答案 0 :(得分:8)

没有隐式子类型关系:您的观察/结论是正确的。 (在第一种情况下,super的类型为“Object”,而“Object.fruit”确实不存在。)

如图所示,inner class(与“静态嵌套类”相对)必须在外部类的实例的上下文中创建;但这与子输入正交。

要访问外部类的成员,请使用OuterClass.this.member,或者如果member未被遮蔽,则只需member即可解析; super.memberthis.member都不会解析为外部类成员。

扩展外部类“修复”编译器错误,但this.fruit 的代码不访问封闭的OuterClass实例的成员 - 它只是访问成员从它扩展的超类继承的InnerClass实例