我有一个内部类,它是我班级Runnable
的一个实现。
当我调试我的应用程序时,我看到我的内部类的对象的实例化也调用外部对象的构造函数。
嗯,这是预料之中的,因为我正在实例化这样的对象:
new OuterClass().new InnerClass(...)
很明显,有一个对教师OuterClass()
的调用。
我的推论是为每个OuterClass
对象创建了一个InnerClass
的新对象。所以我的问题是每次都需要创建一个新的OuterClass
对象吗?
除了上面还有其他方法来实例化一个不会创建外部类对象的内部类吗?
我的外部类只有static
个成员,所以我猜这些对象创建的开销很小但问题仍然存在?
P.S.1经过实验,我发现我可以用1个外部类对象创建多个内部类对象。那么创建一个“虚拟”外部类对象并从那里调用内部类对象构造函数更好吗?
P.S.2经过进一步的实验,我发现如果内部类是静态的,我可以像这样创建一个新的内部对象:
InnerClass in = new OuterClass.InnerClass();
但不是这样(这是我的第一次尝试):
InnerClass in = OuterClass.new InnerClass();
为什么(不那么重要)?我猜这意味着在这种情况下没有创建外部对象,对吗?
答案 0 :(得分:2)
如果您的内部类是静态的,则可以使用new OuterClass.InnerClass();
。
如:
class OuterClass {
static class InnerClass {}
}
答案 1 :(得分:1)
is it necessary to create a new OuterClass object each time?
的。
是的,除非您将内部类更改为静态内部类,否则是必要的。 然后你可以使用这样的东西
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
Now why do we need outer class object for non-static inner class instantiation ?
non-static inner class
与其封闭类的instance
相关联,并且可以直接访问该object's methods and fields
。
由于inner class
与instance
相关联,因此要实例化内部类,必须首先实例化outer class
。然后,使用以下语法在外部对象中创建内部对象:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
答案 2 :(得分:0)
如果内部类是静态的,那么语句new OuterClass.InnerClass();
不会实例化OuterClass而只会实例化InnerClass。