1

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

例如,考虑以下代码:

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 对象,尽管无论如何似乎都存在。有人能告诉我发生了什么吗,如果我出于任何原因访问或忘记幻影实例?

太感谢了!

4

2 回答 2

8

new OuterClass()如果没有显式创建它的实例,您认为会做什么?:)

您没有明确存储对它的引用,但这是另一回事。无论您对结果做什么,调用构造函数都会创建一个实例。内部类有一个对外部类的内置$this引用,因此只要您保留内部类,就会始终保留对它的引用。

使用内部类是否是一个好主意在历史上是一个有争议的话题,但这种特殊用法并没有什么特别的错误。

于 2012-05-14T22:15:01.347 回答
-1

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

关于您的代码的第二个块。如果将(内部和外部类)都公开可见,则不需要创建 OuterClass 的对象。这样 InnerClass 对其余包可见,而无需接触 OuterClass。

然而,如果你在你的例子中这样做,你将有一个 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。

希望我有所帮助!

于 2012-05-14T22:29:27.703 回答