重学Java—接口、lambda 表达式与内部类

1、接口(interface):描述类具有什么功能,并不给出每个功能的具体实现。
一个类可以实现(implement)一个或多个接口,在需要接口的地方,随时使用实现了相应接口的对象。
2、lambda:一种表示可以在将来某个时间点执行的代码块的简洁方法。
使用lambda表达式,用一种精巧而简洁的方式表示使用回调或变量行为的代码。
3、内部类(inner class):定义在一个类的内部,其中的方法可以访问包含它们的外部类的域。
内部类主要用于设计具有相互协作关系的类集合。
ps:代理(proxy)是实现任意接口的对象,用来构建系统级的工具。

接口

接口中所有方法都自动地属于public,
因此在接口中声明方法时,不必提供关键字public。

lambda表达式

lambda表达式是一个可传递的代码块(以及必须传入代码的变量规范),可一次或多次执行。(简单理解,带参数的表达式)
1、第一个看到的lambda表达式:

(String first,String second)->first.length()-second.length()

2、如果代码要完成的计算无法放在一个表达式中,就可以像写方法一样,把这些代码放在{}中,并包含显式的return语句。

(String first,String second)->
    {
        if(first.length()<second.length)return -1;
        else if(first.length()>second.length)return 1;
        else return 0;
    }

即使lambda表达式没有参数,仍然要提供空括号,就像无参方法一样。

()->{for(int i=100;i>=0;i--) System.out.println(i);}

函数式接口

对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口称为函数式接口(functional Interface)。
lambda表达式可以转换为接口。
表达式 System . out :: println 是一个方法引用 ( method reference ) , 它等价于 lambda 表达式
x 一 > System . out . println ( x )
从这些例子可以看出 , 要用 : : 操作符分隔方法名与对象或类名 。 主要有 3 种情况 :
• object :: instanceMethod
• Class : : s tatic Method
• Class / . instanceMethod
使用 lambda 表达式的重点是延迟执行 deferred execution ) 毕竟 , 如果想耍立即执行代码, 完全可以直接执行 , 而无需把它包装在一个丨 ambda 表达式中 。 之所以希望以后再执行代码 , 这有很多原因 , 如 :
• 在一个单独的线程中运行代码 ;
• 多次运行代码 ;
•在算法的适当位置运行代码 ( 例如 , 排序中的比较操作 );
•发生某种情况时执行代码 ( 如 , 点击了一个按钮 , 数据到达,等等 ) ;
• 只在必要时才运行代码

内部类

内部类(inner class)是定义在另一个类中的类。
用内部类的意义:
1、可以访问该类定义所在的作用域中的数据,包括私有数据;
2、内部类可以对同一个包中的其他类隐藏起来;
3、当想要定义 一个回调函数且不想编写大量函数时,使用匿名(anonymous)内部类比较便捷。
*内部类对象总有一个隐式引用,指向了创建它的外部类对象。
内部类中声明的静态域都必须是final。因为正常静态域只有一个实例,如果这个域不是final,可能就不是惟一的。
外部类不能直接访问内部类的成员,但可以通过内部类的对象访问。
*可以实现多重继承:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。但使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。
局部类不能用 public 或 private 访问说明符进行声明
。 它的作用域被限定在声明这个局部类的块中。
匿名内部类不能有构造方法。

你可能感兴趣的:(Java工程师成长之路)