报错的完整信息:
No enclosing instance of type OutterClass is accessible. Must qualify the allocation with an enclosing instance of type OutterClass (e.g. x.new A() where x is an instance of OutterClass).
错误的出现背景:
Java
在类中添加内部类,并在main函数中通过语句:
OutterClass.InnerClass innerClass = new OutterClass.InnerClass();
试图构造内部类对象时出现。
完整结构如下:
public class OutterClass {
class InnerClass {
void print() {
System.out.println("this is innerClass");
}
}
public static void main(String[] args) {
OutterClass.InnerClass innerClass = new OutterClass.InnerClass();
innerClass.print();
}
}
思考:
首先对报错信息进行理解,粗略翻译如下:“没有外部类的实例可以访问,必须用外部类型的实例限定内存分配(例如:x.new A()x是一个外部类类型的实例”。
根据如上信息不难找到修改方法,我们需要一个OutterClass实例outterClass,有了这个实例才能实现对InnerClass的实例化,修改代码如下:
public static void main(String[] args) {
OutterClass outterClass = new OutterClass();
OutterClass.InnerClass innerClass = outterClass.new InnerClass();
innerClass.print();
}
参考各方面资料,对此进行解释:
众所周知,内部类是可以访问到外部类中的所有元素的,这一实现是通过在创建内部类实例时秘密捕获一个外部类实例的引用完成的。也就是说,一个内部类在实例化时必定需要依赖一个外部类的实例,所以内部类不可单独实例化存在。
拓展:
除此之外,还可以通过使用嵌套类避免该错误。
嵌套类就是声明为static的内部类,与需要在创建时隐秘保存一个创建它的外部类实例的引用的内部类不同,创建嵌套类不需要外部类的实例,但声明为static也意味着嵌套类只能访问外部类的static元素。
至于如何设计,使用内部类还是嵌套类就需要根据实际情况考虑了。