Java外部实例生命周期

时间:2012-05-14 22:11:40

标签: java class nested instance parent

我对以下内容缺乏了解:如果我使用“速记”创建内部类的实例,那么访问外部类是一个坏主意,即使我没有创建它的显式实例吗?

例如,请考虑以下代码:

class OuterClass
{
    int i;

    OuterClass() { i = 2; }

    class InnerClass
    {
        int get_parent_i() { return (OuterClass.this.i); }
    }
}

以下编译并返回预期结果(2):

OuterClass.InnerClass ic = new OuterClass().new InnerClass();

System.out.println(ic.get_parent_i());

我的困惑源于这样一个事实:我没有显式创建一个OuterClass对象来实例化一个InnerClass对象,尽管似乎无论如何都存在。有人可以告诉我发生了什么,以及我是否应该以任何理由访问或忘记虚拟实例?

非常感谢你!

2 个答案:

答案 0 :(得分:7)

如果没有明确创建它的实例,您认为new OuterClass()做了什么? :)

您没有明确存储对它的引用,但这是另一回事。无论您对结果执行什么操作,调用构造函数都会生成一个实例。内部类有一个内置的$this引用,返回外部类,所以只要保留内部类,就会始终存在对它的引用。

使用内部类是永远一个好主意是一个历史上有争议的话题,但这个特定用法并没有特别的错误。

答案 1 :(得分:-1)

您的代码的第一个块是100%可接受且正确的。然而,这种模式通常被用作巨大的外类(例如内部工厂)的内部机制。

关于代码的第二个块。如果您将(内部和外部类)公共可见,则无需创建OuterClass的对象。这样,在不触及OuterClass的情况下,InnerClass对其余包可见。

然而,如果你在你的例子中这样做,你会有一个NullPointerException,因为你正在使用Outerclass的部分(i)。

此外,如果你有。

public class OuterClass
{
    static int i;

    static {
        i = 3;
    }

    OuterClass() { i = 2; }

    public class InnerClass
    {
        int get_parent_i() { return (OuterClass.this.i); }
    }
}

“i”将等于3,除非您将来启动OuterClass并将其值更改为2.

希望我帮忙!