解释在java中访问内部类的方法?

explain the way to access inner class in java?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Outer {    
    class Inner {      

    }    
}

public class Demo {
    public static void main(String args[]) {

        Outer o = new Outer();
        Outer.Inner inner = o.new Inner();    

    }    
}

我为Inner类对象创建引用的方式类似于访问Outer类中的static成员?
您能解释一下这背后的机制吗?


the way I create a reference for Inner class object is something like accessing static member in Outer class

一点也不-因为您使用Outer的实例访问Inner的构造函数,这非常像访问Outer类的实例成员,而不是其static成员。声明中的Inner类的名称与它的外部类Outer的名称一致,以避免与顶级类的命名冲突。

原因很容易理解:Inner是一个非静态的内部类,需要引用Outer。它隐式地这样做,但必须将引用传递给场景后面的构造函数。因此,在Outer的实例上调用Inner的构造函数。

生成static类实例的语法类似于生成常规类实例的语法,但嵌套类的名称必须以其外部类的名称作为前缀,即遵循static语法:

1
2
3
4
5
6
7
8
9
10
11
12
class Outer {    
    static class Inner {      

    }    
}

public class Demo {
    public static void main(String args[]) {
        Outer.Inner inner = new Outer.Inner();    

    }    
}


您实际上是以非静态方式访问一个内部类。一个静态的内部类实际上是不同的——编译器为它创建了一个顶级类,它对程序员来说是隐藏的,然后它的工作方式类似于为内部类发布的实例化方式。

您必须这样声明,因为内部类是非静态的,所以它需要外部类的一个实例来生成内部类的一个实例。

1
Outer o = new Outer();

是外部类的必需实例。

1
Outer.Inner inner = o.new Inner();

对于内部类的实例是必需的。


不确定你到底在问什么,但你的代码是有效的。

只有在有外部实例的情况下才能实例化内部,因此只能在外部实例的上下文中调用内部的构造函数,因此

1
2
Outer o = new Outer();
Inner i = o.new Inner();

作品,但

1
2
Inner i = new Outer.Inner(); //bad
Inner i = Outer.new Inner(); //bad

都试图以静态方式访问内部,但不会编译。

如果您希望在不首先创建外部实例的情况下创建内部实例,则内部需要是static


这看起来很奇怪的原因是因为您声明了非静态的内部类。这意味着内部类将可以访问封闭类中的实例变量,并且必须有一个对它的this引用。

这样想:非静态内部类和其他字段一样,是封闭类实例的一部分。您需要指定一个特定的实例才能创建一个对象。就像初始化一个这样的常规字段一样(不要这样做,这很糟糕):o.someField = new Object(),您可以像这样初始化内部类。