在学习内部类的时候自己写了一个内部类的代码试验了一下,代码如下
public class Outside {
public class Inner{
public void show(){
System.out.println("这是内部类内容");
}
}
public static void main(String[] args) {
Inner m=new Inner();
m.show
}
}
然后就报错了,报错行为:
Inner m=new Inner();
报错内容:
No enclosing instance of type Outside is accessible. Must qualify the allocation with an enclosing instance of type Outside (e.g. x.new A() where x is an instance of Outside).
类Outside没有可访问的封闭的实例,必须为Outside提供一个合适的实例,(e.g.x.new A() ,x是Outside的对象)。
我就很奇怪,为什么为Inner这个类创建对象,但是报错却是提示要为Outside这个类创建对象呢。在网上查了一下,大多都说是因为内部类是动态的,而外部类的main方法是静态方法,所以不能在静态方法中调用动态方法,提出的解决方法是将内部类改成静态内部类public static class Inner或者是在main方法外创建一个非静态的方法来调用。我觉得这两个办法都不是很好,如果将内部类定义为静态的,那么如果在内部类中需要调用外部类的非静态属性或方法就会受到限制,估计大部分情况下内部类都是要用到外部类的成员的,这种方法限制太大。如果是在main外创建非静态方法,那要调用这个方法,一样要在main方法中创建对象调用该方法,所以是多此一举,并没有真正解决问题。
回到报错内容上来,报错翻译大致如上文,可能不太准确,大致是这么个意思。在内部类创建对象的时候要求创建外部类的对象。静态方法中不能直接调用非静态方法,必须通过创建对象来调用。那么很显然这是要我们像调用方法一样先创建一个外部类的对象在这个对象中再给内部类做一个实例化,这样才能真正调用内部类的方法。main方法中改为:
Outside n=new Outside();
Inner m=n.new Inner();
m.show();
经过编译运行可行。