java中的成员嵌套类?

时间:2015-06-27 16:17:14

标签: java class nested

如果我们有代码......

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()中执行任何操作,它是一个空类。还有,我想知道,如何在上面的例子中创建内部类的实例?

3 个答案:

答案 0 :(得分:2)

Outer.Inner将在第一次加载另一个类,它将其引用为变量类型,方法参数类型,方法返回类型,超类类型,类型参数绑定或初始化程序或静态方法的目标类型,或者加载静态变量引用的宿主类。在你的例子中,我希望它永远不会被加载。

  

另外,我想知道如何在上面的例子中创建内部类的实例?

编写时,类Outer.Inner只能在方法Outer.method1()内访问,因此只能在该方法中实例化。在那里,你可以使用new Inner()。如果您希望它可以从其他地方实例化,那么将其声明移出方法体:

class Outer
{
    class Inner
    {
    }

    void method1()
    {
    }
}

无论如何,对于命名的内部类来说,这是更好的形式。

通过该更改,您可以通过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()构造函数中定义一些对象,则可以从内部类中获取结果。