【问题标题】:Java Outer Class Instance LifetimeJava 外部类实例生命周期
【发布时间】:2012-05-14 22:11:39
【问题描述】:

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

例如,考虑以下代码:

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

非常感谢!

【问题讨论】:

    标签: java class nested instance parent


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您的代码的第一块是 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。

      希望我能帮上忙!

      【讨论】:

      • 静态变量与内部类的工作方式无关,也与公共/默认可见性无关。
      • 请注意先生:静态是“几乎”单例模式。因为它与每个类有关,无论是任何包中的内部类还是外部类。此外,我试图解释内在内容的行为。显示内部内容并不总是必须影响外部内容。除了它面对一个静态内容(变量、块、函数)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 2018-05-09
      • 2012-12-19
      • 1970-01-01
      相关资源
      最近更新 更多