将一个类定义在另一个类中,里面的那个类被称为内部类。内部类的出现再次打破了Java单继承的局限性。
访问特点
内部类可以直接访问外部类的成员,包括私有成员。
外部类访问内部类的成员,必须要创建内部类的对象。
内部类分类以及共性
内部类任然是一个单独的类,在编译时内部类会被编译成独立的字节码(.class)文件。但是在前面被冠以外部类的类名和$美元符号
内部类不能用普通的方式访问,内部类是外部类的一个成员,因此内部类可以直接访问外部类的成员变量,无论是否是private的。
成员内部类
在外部类中有成员变量和成员方法,成员内部类就是把整个一个类作为外部类的成员。
成员内部类是定义在 类中方法外的类
创建对象的格式:外部类名.内部类名 对象名 = 外部类名.内部类对象
成员内部类之所可以访问外部类的成员,是因为内部类中都持有一个外部类对象的引用:外部类名.this
成员内部类可以用的修饰符有:final,public,private,protected,static
静态内部类
静态内部类就是成员内部类加上static修饰符,定义在类中方法外
在外部类中访问静态内部类中有两种场景:
在外部类中访问静态类中的非静态成员:外部类名.内部类名 对象名 = 外部类名.内部对象,需要通过创建对象访问。
在外部类中访问内部类中的静态成员:外部类名.内部类名.静态成员
局部内部类
局部内部类是定义在方法中的类
方法内部类只能在该内部类的方法内被实例化,不可以在此方法外对其实例化。
方法内部类对象不能使用该内部类所在方法的非final局部变量
可用于方法内部类的访问修饰符有:final abstract
静态方法中的方法内部类只能访问外部的静态成员
匿名内部类
匿名内部类是内部类的简化写法,是建立一个带内容的外部类或接口的子类匿名对象。
前提
内部类可以继承或实现一个外部类或接口 格式
new 外部类类名或接口名() {重写方法} 通常在方法的形式参数是接口或抽象类,并且该接口的方法不超过三个时,可以将匿名内部类作为参数进行传递