解释在java中访问内部类的方式?
这个问题在这里已经有了答案:
我为Inner
类对象创建引用的方式就像在Outer
类中访问static
成员一样
完全没有 - 因为你使用Outer
一个实例来访问Inner
的构造函数,这就像访问Outer
类的实例成员,而不是它的static
成员一样。 声明中的Inner
类的名称使用外部类Outer
的名称进行限定,以避免与顶级类的命名冲突。
原因很容易理解: Inner
是一个非静态的内部类,所以它需要引用Outer
。 它隐含地这样做,但引用必须传递给场景后面的构造器。 因此,你在Outer
一个实例上调用Inner
的构造函数。
制作static
类实例的语法类似于制作常规类实例的语法,除了嵌套类的名称必须以其外部类的名称作为前缀 - 即遵循static
语法:
class Outer {
static class Inner {
}
}
public class Demo {
public static void main(String args[]) {
Outer.Inner inner = new Outer.Inner();
}
}
你实际上是以一种非静态的方式访问一个内部类。 一个静态的内部类实际上是不同的 - 编译器会为程序员创建一个顶级类,这对程序员来说是隐藏的,然后类似于你为内部类发布的实例化方式。
你必须这样声明,因为由于内部类是非静态的,它需要外部类的一个实例来创建内部类的一个实例。
Outer o = new Outer();
是外部类的必需实例。
Outer.Inner inner = o.new Inner();
是内部类的实例所必需的。
不确定你在问什么,但你的代码是有效的。
如果你有一个Outer实例,那么你只能实例化Inner,所以你只需要在Outer实例的上下文中调用Inner的构造函数,因此
Outer o = new Outer();
Inner i = o.new Inner();
作品,但是
Inner i = new Outer.Inner(); //bad
Inner i = Outer.new Inner(); //bad
都试图以静态方式访问Inner,并且不会编译。
如果你想在没有首先创建外部实例的情况下创建内部实例,那么内部需要是static