因为java不允许静态成员访问非静态成员的规则,所以外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量,创建实例,[code=java]package cn.itcast.heima.mythreadtest;
public class TestStatic
{
//定义一个非静态的内部类,是一个空类
private class In{}
//外部类的静态方法
public static void main(String[] args)
{
//下面代码引发编译异常,因为静态成员(main方法)无法访问非静态成员(In类)
new In();
}
}[/code]但是你可以在外部类定义一个非静态的方法,在这个方法内部来访问非静态内部类,如下[code=java]package cn.itcast.heima.mythreadtest;
public class Outer
{
private int outProp = 9;
class Inner
{
private int inProp = 5;
public void acessOuterProp()
{
//内部类可以直接访问外部类的成员
System.out.println("外部类的outProp属性值:" + outProp);
}
}
public void accessInnerProp()
{
//外部类不能直接访问内部类属性,下面代码出现编译错误
//System.out.println("内部类的inProp属性值:" + inProp);
//如需访问内部类成员,必须显式创建内部类对象
System.out.println("内部类的inProp属性值:" + new Inner().inProp);
}
public static void main(String[] args)
{
//执行下面代码,只创建了外部类对象,还未创建内部类对象
Outer out = new Outer();
}
}[/code]---------------------------------------------
总之:非静态内部类对象必须寄存在外部类的对象里面,而外部类对象则不一定有非静态内部类对象寄存在其中
,所以如果存在一个非静态内部类,这一定存在一个被他寄存的外部类对象,反之则不一定,
所以外部类对象访问非静态内部类成员时候,可能非静态普通内部类的对象根本不存在,反之则一定存在 |