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(); } } |
我为
您能解释一下这背后的机制吗?
the way I create a reference for
Inner class object is something like accessingstatic member inOuter class
一点也不-因为您使用
原因很容易理解:
生成
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 |
都试图以静态方式访问内部,但不会编译。
如果您希望在不首先创建外部实例的情况下创建内部实例,则内部需要是
这看起来很奇怪的原因是因为您声明了非静态的内部类。这意味着内部类将可以访问封闭类中的实例变量,并且必须有一个对它的
这样想:非静态内部类和其他字段一样,是封闭类实例的一部分。您需要指定一个特定的实例才能创建一个对象。就像初始化一个这样的常规字段一样(不要这样做,这很糟糕):