Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解释在java中访问内部类的方法?_Java_Inner Classes - Fatal编程技术网

解释在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类中调用静态成员?是吗?@KalhanoToressPamuditha
Outer。Inner
是类型的全名。语法看起来很相似,因为Java使用点进行范围解析和成员访问,但它实际上是一个不同的运算符:在类型名称的上下文中,它表示“类
内部
外部
”内部。