在Java中任何一个类都可以在内部定义另外一个类,即外部类可以有内部类,内部类本身就是类的一个属性。

为什么要使用内部类?

1.作用域不会扩展到包外

2.可以通过 外部类.内部类 直接访问

3.内部类可以访问外部类中的所有静态属性和方法

有哪些内部类?

1.成员内部类 private class

1)内部类在外部使用时,无法直接实例化,需要借助外部类信息才能完成实例化

2)内部类的访问修饰符,可以任意,但是访问范围会受到影响

3)内部类可以直接访问外部类成员;如果出现同名属性,优先访问内部类中定义的

4)可以使用外部类.this.成员的方式,访问外部类中同名的信息

5)外部类访问内部类信息,需要通过内部实例,无法直接访问

6)内部类编译之后.class文件命名:外部类$内部类.class

7)内部类中可以包含与外部类相同的名称的方法

2.静态内部类 static class

1)静态内部类中,只能直接访问外部类的静态方法,如果需要调用非静态方法,可以通过对象实例实现

2)静态内部类对象实例时,可以不依赖于外部类对象

3)可以通过外部类.内部类.静态成员的方式,访问内部类中的静态成员

4)当内部类属性与外部类属性同名时,默认直接调用内部类中的成员

如果需要访问外部类中的静态属性,则可以通过 外部类.属性 的方式

如果需要访问外部类中的非静态属性,则可以通过 new 外部类().属性 的方式

3.方法内部类

定义在方法中的内部类

1)定义在方法内部,作用范围也在方法内

2)和方法内部成员使用规则一样,class前面不可以添加public private protected static

3)类中不能包含静态成员

4)类中可以包含final、abstract修饰成员

4.匿名内部类

适用场景 只用到类的一个实例 类在定义后马上用到 给类命名并不会导致代码更容易被理解

1)匿名内部类没有类型名称、实例对象名称

2)编译后的文件命名:外部类$数字.class

3)无法使用private public protected abstract static修饰

4)无法编写构造方法,可以添加构造代码块

5)不能出现静态成员

6)匿名内部类可以实现接口也可以继承父类,但是不可兼得

内部编译后的有什么不同

每个类都会被编译成一个独立的.class文件,包括内部类

1)类名是外部类与内部类名字之间用$符号链接(成员内部类、静态内部类)

2)类名前有编号标识来自哪个方法(方法内部类)

3)内部类名以数字为编号显示(匿名内部类)