JAVA匿名内部类与Lambda表达式
一,匿名内部类
匿名对象: 是对象,没有引用指向这个对象,没有类名的类
匿名内部类 : 没有名字的一个内部类
作用: 简化没有类本身作用,只为了重写的一些抽象方法,方便调用这个方法 ,匿名内部类就可以简化这种实现类
简化符合需求的实现类,子类->接口或抽象父类
匿名内部类的使用方法:
public class Anonymous {
public static void main(String[] args) {
//匿名内部类没有类名,通过引用地址来实现
new Run(){
public void run(){
System.out.println("跑的飞快");
}
}.run();//匿名内部类的对象后面可直接调用方法
//或者接收匿名内部类的地址,再通过地址调用成员方法
Run run = new Run(){
public void run(){
System.out.println("跑的起飞");
}
};
run.run();
//也可以作为一个方法的实参,传入形参当中
test(new Run() {
@Override
public void run() {
System.out.println("芜湖~");
}
});
}
public static void test(Run run){
run.run();
}
}
//定义一个Run接口
interface Run{
void run();
}
二,Lambda表达式
Lambda 表达式jdk 8新增的功能,作用: 就是为了简化匿名内部类结构
前提: 函数式接口
函数式接口 : 只存在一个必须被重写的抽象方法的接口
检查一个接口是否为函数式接口: @FunctionalInterface
结构:()->{}
() : 重写的抽象方法的参数列表
{} : 重写抽象方法的方法体
-> : lambda符号,箭头符号,具有上下文推导的作用
//函数式接口只能有一个抽象方法,但可以存在静态方法与默认方法
//利用@FunctionalInterface注解可以检查接口是否为函数式接口
@FunctionalInterface
interface Jump{
void jump();
}
lambda表达式的使用方法
public class LambdaClass {
public static void main(String[] args) {
Jump j = null;
//无参方法
Jump b = () -> {
System.out.println("唱");
};
b.jump();
//当方法体里只有一句语句时,可省略{}
j = () -> System.out.println("跳");
j.jump();
Jump a = () -> {
System.out.println("rap");
};
a.jump();
//有参方法
Music l = (str) -> { return str;};
System.out.println(l.music("篮球"));
//当调用一个有且只有一个参数并有返回值类型的方法时,
//且方法体语句只有return语句时,
//可以省略参数的()和方法体语句里的{}和return
Music m = str -> str;
System.out.println(m.music("music"));
}
}
//定义一个Jump接口
@FunctionalInterface
interface Jump{
void jump();
}
//定义一个Music接口
interface Music{
String music(String str);
}