内部类概念:在一个类的内部定义类叫做内部类,这个内部类所在的类称为外部类
内部类的分类:
1.成员内部类
2.局部内部类
3.静态内部类
4.匿名内部类
一,成员内部类
1)定义:在一个类中在定义一个类
Package 包名
class Outer{
成员变量
构造方法
成员方法
//成员内部类
class Inner{
}
}
2)说明:在成员内部类中,可以访问外部类的所有成员(成员变量和成员方法等),同样,在外部类中也可以访问成员内部类的变量和方法
3)成员内部类访问外部类方法:
1.直接访问
2.创建外部类的对象 通过对象名.变量名 对象名.方法名来访问
4)外部类访问内部类:创建内部类的对象,通过对象名.变量名 对象名.方法名来访问
5)内部类对象创建的格式
外部类名.内部类名 变量名=new 外部类名().new 内部类名();
二,局部内部类
1)定义:局部内部类,也叫做方法内部类,就是定义在某个局部范围中的类,它和局部变量一样,都是在方法中定义的,其有效范围只限于方法内部 。
Package 包名
class 类名{
成员变量
构造方法
成员方法(){
//局部内部类
class Inner{
}
}
}
2)说明:在局部内部类中,局部内部类可以访问外部类的所有成员变量和方法,而局部内部类中的变量和方法却只能在创建该局部内部类的方法中进行访问。
3)局部内部类访问外部类方法:
1.直接访问
2.创建外部类的对象 通过对象名.变量名 对象名.方法名来访问
4)外部类访问内部类:在定义局部内部类的外部类成员方法内部创建内部类的对象,通过对象名.变量名 对象名.方法名来访问
5)内部类对象创建的格式:
外部类名.内部类名 变量名=new 外部类名().new 内部类名();
6)在MainText类中,不能通过创建局部内部类的对象来调用局部内部类的成员变量和方法,因为局部内部类的作用域为方法内部,变量和方法只能在创建该局部内部类的方法中进行访问。
三,静态内部类
1)定义:使用static关键字修饰的成员内部类
Package 包名
class 类名{
成员变量
构造方法
成员方法
//静态内部类
static class Inner{
}
}
2)说明:静态内部类是在成员内部类前增加了static关键字,在功能上,静态内部类中只能访问外部类的静态成员,同时通过外部类访问静态内部类成员时,可以跳过外部类从而直接通过内部类访问静态成员变量。
3)静态内部类访问外部类方法(只能访问外部类的静态的成员变量或方法):
1.直接访问
2.创建外部类的对象 通过对象名.变量名 对象名.方法名来访问
4)外部类访问内部类:在定义局部内部类的外部类成员方法内部创建内部类的对象,通过对象名.变量名 对象名.方法名来访问
5)内部类对象创建格式:
外部类名.静态内部类名 变量名 = new 外部类名.静态内部类名();
6)成员内部类与静态内部类对象创建格式比较
成员内部类对象创建方法 :
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
静态内部类对象创建方法 :
外部类名.静态内部类名 变量名 = new 外部类名.静态内部类名();
7)在MainText类中,创建静态内部类对象,不能访问外部类中的静态的或非静态的成员方法
四,匿名内部类
1)定义:没有名称的内部类
2)说明:在(调用)包含(接口类型参数)的(方法)时,为了简化代码,可直接通过匿名内部类的形式传入一个接口类型参数,在匿名内部类中直接完成方法的实现。
3)创建匿名内部类对象的具体语法格式:
new 父接口(){
//匿名内部类实现部分
}
4)注意:从JDK 8开始,允许在局部内部类,匿名内部类中访问非final修饰的局部变量,而在JDK 8之前,局部变量前必须加上final修饰符,否则程序编译报错。
5)Lambda表达式
1,对匿名内部类写法的进一步简化
2,前提条件:接口中只有一个方法
3,调用: 方法名(()->{需要实现的代码});
注:需要实现的代码只有一条语句时,可以省略大括号
方法的递归
定义:方法的递归是指在一个方法内部调用自身的过程。
递归必须要有结束条件,不然就会陷入无限递归的状态,永远无法结束调用