如果我们有代码......
public class Hello
{
public static void main(String args[])
{
Outer obj=new Outer();
obj.method1();
}
}
class Outer
{
void method1()
{
class Inner
{
}
}
}
我想知道,当ClassLoader加载Inner类时。 它是在调用method1()时还是在我们创建它的实例时加载的?而Inner类没有在method1()中执行任何操作,它是一个空类。还有,我想知道,如何在上面的例子中创建内部类的实例?
答案 0 :(得分:2)
类Outer.Inner
将在第一次加载另一个类,它将其引用为变量类型,方法参数类型,方法返回类型,超类类型,类型参数绑定或初始化程序或静态方法的目标类型,或者加载静态变量引用的宿主类。在你的例子中,我希望它永远不会被加载。
另外,我想知道如何在上面的例子中创建内部类的实例?
编写时,类Outer.Inner
只能在方法Outer.method1()
内访问,因此只能在该方法中实例化。在那里,你可以使用new Inner()
。如果您希望它可以从其他地方实例化,那么将其声明移出方法体:
class Outer
{
class Inner
{
}
void method1()
{
}
}
无论如何,对于命名的内部类来说,这是更好的形式。 1}}何时或是否加载都不会改变。
通过该更改,您可以通过Outer.Inner
形式在Outer.Inner
的构造函数或实例方法中的任何位置实例化Outer
。但是,如果要从不同的类或类new Inner()
的静态方法中实例化一个,那么它有点棘手。要认识到的重要一点是Outer
的每个实例都需要Outer.Inner
的关联实例。这是在Outer
的实例方法中执行实例化时从上下文确定的,但如果在没有这样的上下文的情况下执行,则语法为:
Outer
答案 1 :(得分:1)
从Section 12.4.1引用JLS:
类或接口类型T将在紧接之前初始化 首次出现以下任何一种情况:
T是一个类,并创建了一个T实例。
调用T声明的静态方法。
分配由T声明的静态字段。
使用T声明的静态字段,该字段不是常量 变量(§4.12.4)。
T是顶级类(第7.6节)和断言语句(第14.10节) 在词典中嵌套在T(§8.1.3)中执行。
因此,类(无论是否是嵌套类)都遵循相同的规则。在您的特定情况下,在创建类的实例之前,不会加载Inner
。
要回答第二个问题,您只能在Inner
内创建method1
的实例,因为Inner
是一个方法本地类,其范围仅限于method1
:< / p>
void method1()
{
class Inner
{
public Inner()
{
System.out.println("inner()");
}
}
Inner inner = new Inner();
}
答案 2 :(得分:0)
要实现内部类,无论如何都需要对象。如果像这样调用method1(),则永远不会调用内部类。
但是如果在method1()或public Outer()构造函数中定义一些对象,则可以从内部类中获取结果。