如果我们有代码...
public class Hello
{
public static void main(String args[])
{
Outer obj=new Outer();
obj.method1();
}
}
class Outer
{
void method1()
{
class Inner
{
}
}
}
我想知道,内部类何时会被 ClassLoader 加载。 它是在调用 method1() 时加载的,还是在我们创建它的实例时加载的?类 Inner 没有在 method1() 中执行任何操作,它是一个空类。另外,我想知道,如何在上面的例子中创建一个内部类的实例?
最佳答案
Class Outer.Inner
将在另一个类作为变量类型、方法参数类型、方法返回类型、父类(super class)类型、类型参数绑定(bind)或目标类型引用它时首次加载加载初始化程序或静态方法,或静态变量引用的宿主类。在您的示例中,我希望它永远不会被加载。
Also,I wanted to know,how to create an instance of inner class in the above example?
正如所写,类 Outer.Inner
只能在方法 Outer.method1()
中访问,因此它只能在该方法中实例化。在那里,您可以只使用 new Inner()
。如果您希望它可以从其他地方实例化,则将其声明移出方法主体:
class Outer
{
class Inner
{
}
void method1()
{
}
}
无论如何,这对于命名内部类来说是更好的形式。 Outer.Inner
何时加载或是否加载它不会改变。
随着这一变化,您可以通过 new Inner()
的形式在 Outer
的构造函数或实例方法中的任何位置实例化 Outer.Inner
.但是,如果您想从不同的类中实例化一个,或者在 Outer
类的静态方法中实例化一个,那么就有点棘手了。要认识到的重要一点是,Outer.Inner
的每个实例都需要一个关联的 Outer
实例。这是在 Outer
的实例方法中执行实例化时根据上下文确定的,但如果在没有这样的上下文的情况下执行,则语法为:
public static void main(String args[])
{
Outer obj=new Outer();
Outer.Inner inner = obj.new Outer.Inner();
}
关于java - java中的成员嵌套类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31090810/