问题描述:
在静态方法中new User()时报错
No enclosing instance of type ListTest is accessible. Must qualify the allocation with an enclosing instance of type ListTest (e.g. x.new A() where x is an instance of ListTest).
如图示:
解决方法:
报错处 User u1 = new ListTest().new User(); 该行代码前创建类对象
原因分析:
该类在加载时,首先是将类中的静态方法的代码加载到jvm的方法区,在加载到User u1 = new User()时,因为内部类是动态的(无static关键字修饰),而main方法是静态的,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象,所以要在static方法(类加载时已经初始化)调用内部类的必须先创建外部类。(就好比你想在你家天台上搭个棚子种菜,可房子都没建,怎么搭棚子一个道理)如果将内部类修改为静态类,也可以在main中直接创建内部类实例。(就好比在静态类的天台上搭棚子)
而另外的 类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问,非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建实例)的时候才会分配内存,然后通过类的对象去访问。在一个类的静态成员中去访问非静态成员之所以会出错是因为在类的非静态成员不存在的时候静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。(其实就好比一加载类 就直接初始化到了main方法,你new User就是想要个棚子来种菜了,可是连最底层的房子都没建,直接搭就报错了,棚子是属于房子的一部分,即是说非静态成员(变量和方法)属于类的对象)