java中访问静态内部类时为什么不能创建外部类的对象

小程序如下:
class Outer{
static int x = 2;

static class Inner{
}

}

class Test{
public static void main(String[] args){
new Outer.Inner(); //正确
new Outer().new Inner(); //编译报错:限定的新静态类
}

}

我知道访问静态内部类可以不实例化外部类,但是为什么实例化就报错呢?
比如在上面的小程序中,我要输出x,确实可以Outer.x,但是我也可以使用new Outer().x啊,为什么在内部上就报错呢?

你首先要明白new Outer().new Inner()是干什么的,这个是在外围类中穿件非静态内部类时的代码,非静态内部类必须要持有一个隐含的指向外部类的引用,所以必须先new outer再new inner,但是如果是非静态的,就无需持有外部类引用,这么写有什么道理呢?追问

如果我创建了一个外部类的对象来调用外部类中的方法:
Outer out = new Outer();
//....省略
然后这个时候我需要使用到内部类中的方法,我认为的情况是可以直接这么写:
out.new Inner().method();
直接使用自己已经创建过的对象,但是结果是这样写会出现上面的错误

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-25
静态内部类

静态内部类定义在类中,任何方法外,用static定义。

静态内部类只能访问外部类的静态成员。

生成(new)一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成:

Outer.Inner in=new Outer.Inner();

而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类。可以定义私有静态内部类。追问

没太懂,
实际上使静态内部类成为了一个顶级类
是什么意思呢?

本回答被网友采纳
相似回答