什么是内部类?
在Java中,在一个类中定义另一个类:
举例
在类A中,定义一个类B,将类B称为类A的内部类,类A是类B的外部类!
分类:
成员内部类:在类中,方法外定义的类
局部内部类:在方法定义中定义的类
局部内部类
局部内部类:
在外部类的成员方法中定义的类
特点:
局部内部类也是可以直接访问外部类的成员变量,包括私有!
面试题:
局部内部类里面的成员在访问局部变量的时候,局部变量有什么要求?
JDK8以前的版本,局部内部类在访问外部类的成员方法中的局部变量的时候,此时局部变量必须加入final修饰!
原因:
局部变量的生命周期随着方法调用而存在,随着方法调用结束而消失;
外部类的成员方法调用完毕,此时这个局部变量应该释放了,但是当前这个成员方法中创建局部内部类对象
使用局部内部类对象访问它里面的成员方法,成员方法还在使用这个局部变量,所以此时这个变量为常量,显示的加入
final修饰
JDK8以及jdk8以后:优化了
可以通过反编译工具---->自动加入final,还是定义一个常量
成员内部类
成员内部类:
在外部类中,在外部类的成员方法外
特点:
可以访问外部类的成员包括私有!
直接去访问外部类的中的成员内部类的成员方法:特有方式 (成员内部类没有private以及static修饰!)
外部类.内部类名 对象名 = new 外部类名().new 内部类名() ;
成员内部类所涉及到的修饰符的问题:
有的时候不想让外部类直接去访问内部类的成员,为了保证内部类的成员安全,加入private
举例:
人有身体,身体有心脏;
伪代码
class Body{
//身体内有心脏
//为了保证安全性,加入private修饰
private class Heart{
//成员方法
public void operator(){
System.out.println("心脏搭桥") ;
}
}
//外部类的成员方法
public void method(){
if(你是外科医生){
//创建Heart对象,去调用operator方法
}
}
}
//直接访问成员内部类中的operator方法
外部类名.内部类名 对象名 = new 外部类名().new 内部类名() ;
Body.Heart bh = new Body().new Heart() ;会报错的
成员内部类可以使用过static修饰:
特点:静态的成员内部类它里面的所有 成员方法:
无论是静态的方法还是非静态的,访问外部类的成员:必须先为静态
想直接去访问静态的成员内部类的这些成员方法:??
外部类名.内部类名 对象名 = new 外部类名.内部类名();
内部类外部类没有继承关系,不能使用super!
匿名内部类
匿名内部类:(没有名字的类)---是内部类的一种简化格式!
针对抽象类或者接口去使用的
匿名的格式
new 类名(抽象类)或者接口名(){
重写类里面或者接口的抽象功能!
} ;
应用范围:在局部位置中使用
匿名内部类的本质:
是继承了该抽象类或者是实现了接口子类对象!
匿名内部类常在开发中使用
匿名内部类开发中使用场景2:
方法返回值是抽象类或者接口