java核心学习,七 内部类、匿名内部类、Lambda表达式

一、内部类

  内部类是类的一个成员,与成员变量、方法、构造器、初始化块一起构成类的五大成员,关于内部类的各种概念与使用方法注意事项不再赘述(这种东西用到再看,一直都用不到说明根本没用。。)

二、匿名内部类

  匿名内部类常用于实现方法的参数列表中的抽象类与接口的实例,例如在上一篇(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表达式来创建, 常见的有:赋值、传参、强制类型转换。