image.png
首先要明白以下三点:

  • static类型的属性和方法,在类加载的时候就会存在于内存中。
  • 要想使用某个类的static属性和方法,那么这个类必须要加载到虚拟机- 中。
  • 非静态内部类并不随外部类一起加载,只有在实例化外部类之后才会加载。

现在考虑这个情况:在外部类并没有实例化,内部类还没有加载,这时候如果调用内部类的静态成员或方法,内部类还没有加载,却试图在内存中创建该内部类的静态成员,这明显是矛盾的。所以非静态内部类不能有静态成员变量或静态方法。

image.png

内部类也会生成class文件
image.png

非静态内部类例子:

非静态内部类是依赖于外部的实例化对象的,
image.png
image.png

在方法中创建非静态内部类的问题

  1. public class TestNormalInnerCalss {
  2. public int method() {
  3. //这个是实例方法,调用实例方法必有一个外部类的对象,所以可以直接new Element(99, 10)。
  4. Element e = new Element(10, 99);
  5. return e.ch;
  6. }
  7. public static void main(String[] args) {
  8. //非静态内部类对象依赖于外部类对象,这里是static方法,没有创建外部类对象,所以不能直接new Element(99, 10)
  9. Element e = new TestNormalInnerCalss().new Element(99, 10);
  10. }
  11. class Element{
  12. int ch;
  13. int count;
  14. public Element(int ch, int count) {
  15. this.ch = ch;
  16. this.count = count;
  17. }
  18. }
  19. }

静态内部类

image.png
image.png

匿名类

image.png
image.png
image.png

局部内部类

image.png