【问题标题】:In Java what is the relationship between a nested class and its outer class?在 Java 中,嵌套类与其外部类之间的关系是什么?
【发布时间】:2014-02-19 03:00:36
【问题描述】:

当实例化一个嵌套类时,它如何引用外部类?它总是扩展外部类还是以其他方式引用它?有人告诉我内部扩展了外部,但是为什么下面的示例不起作用?

例如:

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 出现错误,说 '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);
        }
    }

}

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你能澄清你的最后一句话吗?我不知道OuterClass.this 并在此处问题中发布的代码中使用它,但是当我让内部类扩展外部类时,OuterClass.this.fruitsuper.fruit 都给我外部实例的@ 987654332@值。
    • @MikeB 这似乎是这种情况,即使它不是,因为成员被设置(相同的值)时创建了 OuterClass 的新实例 - 例如real OuterClass 实例和 InnerClass 实例的超类。在 OuterClass 实例初始化之后但在创建内部类实例之前更改其 fruit 成员变量 - 然后您会看到不同。
    • 你当然是对的,我什至在我的原始代码中也这样做了,但是我看到了一个梨,忽略了第二组输出应该有 2 个梨的事实!
    • +1 感谢您使用正确的术语 - 很多人在表示“嵌套类”时说“内部类”。
    猜你喜欢
    • 2013-01-14
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多