2012-05-14 165 views
1

我对以下内容缺乏了解:如果使用“简写”创建内部类的实例,即使我没有创建它的显式实例,访问外部类也不是个好主意吗?Java外部实例生命周期

例如,请考虑下面的代码:

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

非常感谢!

回答

7

你认为new OuterClass()如果没有明确创建它的实例,你会怎么做? :)

您没有明确存储引用,但这是不同的事情。无论你如何处理结果,调用构造函数都会创建一个实例。内部类有一个建立在外部类的$this引用,所以只要你保留内部类,总会有一个对它的引用。

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

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

“我”会,除非你在未来发起并在OuterClass改变其价值为2

希望我帮等于3!

+0

静态变量与内部类的工作方式无关,也与公共/默认可见性无关。 – Charlie

+0

心灵先生:静态是一种“几乎”单身模式。因为它与每个类都有关系,不管是任何包中的内部类还是外部类。 此外,我试图解释内容的行为。显示内部内容并不总是必须影响外部内容。除了它面临一个静态内容(变量,块,功能)。 –