6.7.2 静态内部类

6.7.2 静态内部类

如果使用static来修饰一个内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象。因此使用static修饰的内部类被称为类内部类,有的地方也称为静态内部类

为什么static不能修饰外部类

static关键字的作用是把类的成员变成类相关,也就是static修饰的类成员属于类,既然要属于类,则表示上一级程序单元必须是一个类.
由于外部类的上一级程序单元是包,所以不可使用static修饰;

为什么static可以修饰内部类

内部类的上一级程序单元是外部类,使用static修饰可以将内部类变成外部类相关。

总结:static关键字不可修饰外部类,但可修饰内部类。

静态内部类可以包含静态成员,也可以包含非静态成员

静态内部类只能访问外部类的静态成员

根据静态成员不能访问非静态成员的规则:

  • 静态内部类不能访问外部类的实例成员,只能访问外部类的类成员
  • 即使是静态内部类的实例方法也不能访问外部类的实例成员,只能访问外部类的静态成员

为什么静态内部类的实例方法不能访问外部类的实例成员

因为静态内部类对象是寄生在外部类的类本身中,而不是寄生在外部类的实例中。当静态内部类对象存在时,并不存在一个被它寄生的外部类对象,静态内部类对象只持有外部类的类引用,没有持有外部类对象的引用。如果允许静态内部类的实例方法访间外部类的实例成员,但找不到被寄生的外部类对象,这将引起错误。

外部类的所有地方都可也使用静态内部类

静态内部类是外部类的一个静态成员,因此外部类的所有方法、所有初始化块中可以使用静态内部类来定义变量、创建对象等。

外部类不可以直接访问静态内部类的成员

外部类依然不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也**可以使用静态内部类对象作为调用者来访问静态内部类的实例成员**。

接口内部类只能是静态内部类

Java还允许在接口里定义内部类,接口里定义的内部类默认使用public static修饰,也就是说,接口内部类只能是静态内部类。

接口内部类默认public static修饰

  • 如果为接口内部类指定访问控制符,则只能指定public访问控制符;
  • 如果定义接口内部类时省略访问控制符,则该内部类默认是public访问控制权限。

接口里是否可以定义内部接口

答:可以但没必要

  • 接口里的内部接口是接口的成员,因此系统默认添加public static两个修饰符。
  • 定义接口里的内部接口的意义不大,因为接口的作用是定义一个公共规范来供大家使用,如果把这个接口定义成一个内部接口,在接口里定义内部接口没有意义。