解释在java中访问内部类的方法?
我为解释在java中访问内部类的方法?,java,inner-classes,Java,Inner Classes,我为内部类对象创建引用的方式类似于访问外部类中的静态成员您能解释一下这背后的机制吗?这看起来很奇怪的原因是您声明了非静态内部类。这意味着内部类将有权访问封闭类中的实例变量,并且必须有对它的this引用 可以这样想:非静态内部类与任何其他字段一样,是封闭类实例的一部分。您需要指定特定实例才能创建对象。 因此,就像您初始化这样的常规字段一样(实际上不要这样做,这很糟糕): o.someField=new Object(),您可以像以前那样初始化内部类 不确定您要问什么,但您的代码是有效的 如果有一个
内部
类对象创建引用的方式类似于访问外部
类中的静态
成员您能解释一下这背后的机制吗?这看起来很奇怪的原因是您声明了非静态内部类。这意味着内部类将有权访问封闭类中的实例变量,并且必须有对它的
this
引用
可以这样想:非静态内部类与任何其他字段一样,是封闭类实例的一部分。您需要指定特定实例才能创建对象。
因此,就像您初始化这样的常规字段一样(实际上不要这样做,这很糟糕):
o.someField=new Object()
,您可以像以前那样初始化内部类 不确定您要问什么,但您的代码是有效的
如果有一个Outer实例,则只能实例化Inner,因此只能在Outer实例的上下文中调用Inner的构造函数,因此
class Outer {
class Inner {
}
}
public class Demo {
public static void main(String args[]) {
Outer o = new Outer();
Outer.Inner inner = o.new Inner();
}
}
有效,但是
Outer o = new Outer();
Inner i = o.new Inner();
都试图以静态方式访问内部,并且不会编译
如果希望在不首先创建外部实例的情况下创建内部实例,那么内部需要是静态的,实际上是以非静态的方式访问内部类。静态内部类实际上是不同的-编译器为它生成一个顶级类,它对程序员隐藏,然后它的工作方式类似于您为内部类发布的实例化方式
Inner i = new Outer.Inner(); //bad
Inner i = Outer.new Inner(); //bad
必须以这种方式声明,因为内部类是非静态的,所以它需要外部类的实例来生成内部类的实例
Inner i = new Outer.Inner(); //bad
Inner i = Outer.new Inner(); //bad
是外部类的必需实例
Outer o = new Outer();
对于内部类的实例是必需的
Inner i = new Outer.Inner(); //bad
Inner i = Outer.new Inner(); //bad
我为内部
类对象创建引用的方式类似于访问外部
类中的静态
成员
一点也不-因为您正在使用外部
的实例访问内部
的构造函数,这非常类似于访问外部
类的实例成员,而不是其静态
成员。声明中的内部
类的名称用其外部类的名称限定,以避免与顶级类的命名冲突
原因很容易理解:内部
是一个非静态的内部类,因此它需要引用一个外部
。它隐式地这样做,但是引用必须传递给场景后面的构造函数。因此,在外部
的实例上调用内部
的构造函数
生成静态
类实例的语法与生成常规类实例的语法类似,只是嵌套类的名称必须以其外部类的名称作为前缀-即遵循静态
语法:
Outer.Inner inner = o.new Inner();
顺便说一句,因为它不是一个
静态
类,所以您需要一个外部
的活动实例来创建内部
的实例。如果internal
是static
,那么您可以执行新建Outer.internal()
@okiharaherbst这不是您链接的问题的副本(可能是其他问题的副本,我不确定)。是的,我正在谈论创建内部类引用的方法?这怎么可能?@dasblinkenlight:看看这里公认的答案。我猜想这就是OP寻求的解释。@dasblinkenlight我认为这是重复的。你在回答中解释的是,事实上,在那个Q/A的公认答案中解释的是什么。我仍然不明白我想说的是:),Outer。Inner
有点像在Outer类中调用静态成员?是吗?@KalhanoToressPamudithaOuter。Inner
是类型的全名。语法看起来很相似,因为Java使用点进行范围解析和成员访问,但它实际上是一个不同的运算符:在类型名称的上下文中,它表示“类内部类外部”内部。