首先 需要定义的是:静态类是内部类,外部类不能用static修饰的
静态类中可以有静态成员和非静态成员。根据静态成员不能访问非静态成员的规则,所以静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。即使静态内部类的实例方法也不能访问外部类的实例成员,只能访问外部类的静态成员。
内部类的定义:内部类隐藏在外部类之中,不允许同一个包中的其他类访问该类。内部类可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相访问。但外部类不能访问内部类的实现细节,例如内部类的属性。方法中定义的内部类被称为局部内部类。大部分时候,内部类都被作为成员内部类定义,而不是作为局部内部类。成员内部类是一种与属性、方法、构造器、和初始化块相似的类成员;局部内部类和匿名内部类则不是类成员。
在非静态内部类里可以直接访问外部类的private成员,这是因为在非静态内部类对象里,保存了一个它所寄生的外部类 对象的引用(当调用非静态内部类的实例方法时,必须有一个非静态内部类实例,非静态内部类实例必须寄生在外部类实例里)
当在非静态内部类的方法内访问某个变量是,系统优先在该方法内查找是否存在该名字的局部变量,如果存在就使用该变量;如果不存在,则到该方法所在的内部类中查找是否存在该名字的成员变量,如果存在则使用该成员变量;如果不存在,则到内部类所在的外部类中查找是否存在改名字的成员变量,如果存在则使用该成员变量;如果依然不存在,系统将出现编译错误;提示找不到该变量。
因此,如果外部类成员变量、内部类成员变量、与内部类里方法的局部变量同名,则可通过使用this、外部类类名.this作为限定来区分
非静态内部类的成员可以访问外部类的private成员,但反过来就不成立了。非静态内部类的成员只在非静态内部类范围内是可知的,并不能被外部类直接使用。如果外部类需要访问非静态内部类成员,则必须显式创建非静态内部类对象来调用访问其实例成员
重点来了,成员内部类有两种;静态内部类和非静态内部类。使用static修饰的成员内部类是静态内部类,没有使用static修饰的成员内部类是非静态内部类。
static关键字的作用是把类的成员变成类相关,而不是实例相关,即static修饰成员是属于整个类,而不是属于单个对象。外部类的上一级程序单元是包,所以不可使用static修饰;而内部类的上一级程序单元是外部类,使用static修饰可以将内部类变成外部类相关;而不是外部类实例相关。因此static关键字不可修饰外部类,可以修饰内部类。
外部类依然不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可使用静态内部类的对象作为调用者来访问静态内部类的实例成员。
java还允许在接口里定义内部类,接口里定义的内部类默认使用public static 修饰,也就是说接口内部类只能是静态内部类。