内部类持有了一个指向外部类的引用,而静态内部类没有。
我们可以通过查看类的fields来发现这一点。
public class MyClassTest {
A a;
B b;
@Before
public void setUp() throws Exception {
a=new A();
a.setName("a");
b=new B();
b.setName("b");
}
@Test
public void testMain() throws Exception {
Field[] fieldList = a.getClass().getDeclaredFields();
System.out.println("a_fieldList:");
for (Field field : fieldList) {
System.out.println(field);
}
System.out.println("b_fieldList:");
fieldList = b.getClass().getDeclaredFields();
for (Field field : fieldList) {
System.out.println(field);
}
}
class A {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
static class B {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
输出结果:
a_fieldList:
java.lang.String com.example.MyClassTest$A.name
final com.example.MyClassTest com.example.MyClassTest$A.this$0
b_fieldList:
java.lang.String com.example.MyClassTest$B.name
内部类比静态内部类多了指向外部类的引用。因此内部类可以直接调用外部类的静态或者非静态的域,但是静态内部类只能调用外部类的静态域。
内部类也不能直接反射newInstance实例化,这样会报异常InstantiationException。而静态内部类则可以