一、内部类
内部类是类的一个成员,与成员变量、方法、构造器、初始化块一起构成类的五大成员,关于内部类的各种概念与使用方法注意事项不再赘述(这种东西用到再看,一直都用不到说明根本没用。。)
二、匿名内部类
匿名内部类常用于实现方法的参数列表中的抽象类与接口的实例,例如在上一篇(java核心学习(六)面向接口编程)中,Command接口被用于一个方法的参数中,我们可以在调用该方法时实现这个接口,创建匿名内部类的时候同时会创建一个匿名实例,具体代码如下
public class CommandTest{ public static void main(String[] args){ ProcessArray pa = new ProcessArray(); int[] target = {1,2,3,4}; pa.process(target , new Command(){ //实现Command接口的方法 public void process(int[] target) { int sum = 0; for(int tmp : target){ sum +=tmp; } System.out.println("数组元素的和是"+sum); }); pa.process(target , new AddCommand()); } }
注意:匿名内部类中的变量必须声明是fianl的,在java7之前,如要引用匿名内部类之外的变量则必须声明为final,从java8开始,在匿名内部类中使用之外的变量会隐式转换为final。
三、Lambda表达式
Lambda表达式允许用简洁的代码来创建只有一个抽象方法的接口的实例。表面上看起来像是把一段代码当做参数传给了该方法
用Lambda表达式来改写CommandTest类,就是把接口名 与 方法头给去掉,留下方法的参数列表和方法体,因为接口名在调用的方法参数列表中已经声明过一次,是可以确定的,要实现的方法是唯一的,这两者都可以省略,根据 相同代码只写一次原则,推荐使用Lambda表达式
public class CommandTest{ public static void main(String[] args){ ProcessArray pa = new ProcessArray(); int[] target = {1,2,3,4}; pa.process(target , (int[] target) -> { int sum = 0; for(int tmp : target){ sum +=tmp; } System.out.println("数组元素的和是"+sum); }); pa.process(target , new AddCommand()); } }
Lambda表达式由三部分组成 分别是 形参列表 箭头 代码块。
Command接口:这是一种函数式接口,一个接口只含有一个抽象方法,就可被称为函数式接口,Lambda表达式的目标类型必须是函数式接口。函数式接口注解:@FunctionalInterface,用于让编译器检查是否为函数式接口。
只要目标类型为函数式接口类型的,都可以应用Lambda表达式来创建, 常见的有:赋值、传参、强制类型转换。