匿名内部类由于没有名字,创建格式如下:
父类名|接口名 对象名 = new 父类构造器(参数列表)|实现接口()
{
//匿名内部类的类体部分
}
匿名内部类必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一个接口。同时它也是没有class关键字,这是因为匿名内部类是直接使用new来生成一个对象的引用。当然这个引用是隐式的。
这里重点阐述Lambda函数,学习其对实现的接口的方法的重写原理和过程。ps:lambda函数不能应用于类。
下面有两个示例,希望对大家的理解有所帮助。
示例1
public class LambdaDemo {
public static void main(String[] args) {
// 接口中只定义了1个抽象方法,可以利用Lambda表达式
// 来重写这唯一的一个抽象方法
// 方式一
/* Cacl c = new Cacl() {
@Override
public double add(double i, double j) {
return i + j;
}
}; */
// 方式2
// 表示重写Cacl中唯一的一个抽象方法add
// Lambda表达式只能作用在函数式接口上
/* Cacl c = (double a, double b) -> {
return a + b;
}; // 这里必须加分号,结尾
// 方法体只有一句,可以省略{}和return不写
Cacl c = (double i,double j) -> i + j; */
// 方式3
// 重写的是Cacl接口中的方法add
// add方法的参数列表的类型是已知的
// 可以省略参数类型不写
Cacl c = (x, y) -> x + y; // 可读性很差,看不到重写的是哪个方法
// 但是符合函数式编程方式,大数据方向常用的方式
System.out.println(c.add(5.6, 9.9));
}
}
interface Cacl{
public double add(double i, double j);
}
小结:使用labmda函数重写方法的前提是实现的接口中有且仅有一个需要重写的抽象方法
示例2
public class LambdaDemo2 {
public static void main(String[] args) {
//方法体只有一句
// 这一句方法体直接操作参数
// 这一句方法体是调用了已有类Math中的静态方法sqrt
// Calculator c = (d) -> Math.sqrt(d);
// 参数列表可以省略
Calculator c = Math::sqrt;
System.out.println(c.sqrt(9));
}
}
interface Calculator{
double sqrt(double d);
}
小结:lambda函数符合函数式编程需求,但是其代码可读性很差,在实际开发中,可能看不到其具体实现的什么方法。