内部类
内部类就是类中的类
内部类分类:
- 成员
- 局部
- 匿名
- 静态
成员内部类
定义:定义在外部类成员位置的类,用成员修饰符修饰的一个类
使用成员内部类:根据外部类对象使用,注意成员内部类不能定义静态 ,除非是静态的常量(由static final 修饰)
//创建内部类对象
public class Outer1 {
//这是一个成员内部对象
class One{
//内部对象的方法
void t() {
System.out.println("我是一个内部类");
}
}
public static void main(String[] args) {
// 在主方法中创建内部类对象方法一
Outer1 otOuter1=new Outer1();
One on=otOuter1. new One();
// 在主方法中创建内部类对象方法二
One on=new Outer1().new One();
on.t();
}
public void show() {
//在外部方法中创建内部类对象
One one=new One();
one.t();
}
}
注意:如外部类,内部类,内部类方法三者都有一个变量a ,在内部类中直接返回a是值内部类方法中的a(就近原则)this.a ,返回的是内部类的成员变量a ,要返回外部类的变量a 需要用外部类名.this.a
局部内部类
定义:定义在外部类方法中的内部类,局部内部类的左右域只在方法内,只能在方法内床架对象
注意,局部内部类的变量只能用final修饰,jdk1.8 默认省略final
静态内部类
定义:由static 修饰的类,静态类中可以写静态方法,静态方法只能写在静态类中
特点:静态类中的静态方法与静态变量,可以直接通过类名.
的方式直接在外部调用
注意: 静态类中可以有成员,调用时要遵守静态原则,静态方法不能直接调用成员属性,
需要通过对象调用成员属性 调用外部成员需要用对象.
的方式调用
匿名内部类
定义:没有名字的内部类
前提:匿名内部类必须实现一个接口/父类,作为接口/父类的实现存在
// 匿名内部类
new 类名(){类体}
使用: 在使用时可以使用父类/接口类型 接收这个匿名内部类(接口多态)
// 匿名内部类
// 接口(父类类型) 接收名称= new 类名(){类体}
// 接收名称.方法();
主要:调用的方法是对父类/接口实现的方法
Lambda 由jdk1.8提供
表示方式:()->{方法体}
// '()':表示需要重写的方法参数列表
// '->':Lambda 符号,具有推导上下文的作用
// '{}':存放需要实现的方法的方法体
前提:只使用接口类型 的内部类写法,且接口只有一个方法
测试是否为函数式接口:@FunctionalInterface
写法:
//标准写法 下方‘ S ’ 接收匿名类地址的 变量
s=(数据类型 参数)->{方法体};
//只存在一句方法体时
s=(数据类型 参数)->方法体;
//参数的数据类型可以不写
s=(参数)->{方法体};
//只有一个参数
s=参数->方法体;
//方法有返回值
s=(数据类型 参数)->{方法体 retuen 返回值 ;};
//当语句体只有返回值没有方法体时
s=(数据类型 参数)->retuen 返回值 ;