区别包括:

  • 非静态内部类依赖于外部类的实例,而静态内部类不依赖于外部类的实例。
  • 非静态内部类可以直接访问外部类的所有成员(包括实例变量和方法);静态内部类可以直接访问外部类的静态成员,访问外部类的实例成员则必须通过外部类的实例引用。
  • 非静态内部类不能定义静态成员(Java 16 之前),而静态内部类可以定义静态成员。
  • 非静态内部类在外部类实例化后才能实例化,而静态内部类可以独立实例化。
  • 静态内部类和非静态内部类都可以访问外部类的私有成员(因为编译器会为嵌套类提供访问权限)—— 两者的区别在于静态内部类访问外部类的私有实例成员时必须先拿到外部类实例,而不是像非静态内部类那样能直接访问。