Java核心技术卷1学习笔记6
接口、lambda表达式与内部类
1、接口
1.1、接口概念
接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。接口中的所有方法默认属于public,因此,在接口 声明方法中,不必提供关键字public。
实现一个接口:
(1)将类声明为实现给定的接口
(2)对接口中的所有方法进行定义
关键字:implements
1.2、接口的特性
接口不是类,不能使用new运算符实例化一个接口;不能构造接口的对象,但可以声明接口的变量。接口中的域将被自动设为public static final。
1.3、接口与抽象类
使用抽象类表示通用属性:每个类只能扩展于一个类。
Java不支持多继承。
1.4、静态方法
1.5、默认方法
可为接口方法提供一个默认实现。必须用default修饰符标记这个方法。
默认方法一个重要用法是“接口演化”。
1.6、解决默认方法冲突
(1)超类优先。
(2)接口冲突。
2、接口示例
2.1、接口与回调
回调(callback)是一种常见的程序设计模式,可以指出某个特定事件发生时应该采取的动作。
2.2、Comparator接口
2.3、对象克隆
Cloneable接口:该接口指示一个类提供了一个安全的clone方法。
3、lambda表达式
lambda表达式是一个传递的代码块,可以在以后执行一次或多次。
3.1、lambda表达式语法
参数,箭头以及一个表达式。如果代码要完成的计算无法放在一个表达式,就可以像写方法一样,把这些代码放在{}中,并包含显示的return语句。
3.2、函数式接口
对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口称为函数式接口(functional interface)。
3.3、方法引用
例:表达式System.out::println是一个方法引用,它等价于lambda表达式:
x->System.out.println(x)。
用::操作符隔开方法名与对象名或类名。
3.4、构造器引用
与方法引用类似,只不过方法名为new。
例:Person::new是Person构造器的一个引用。
可以用数组类型建立一个构造器引用。
3.5、变量作用域
lambda表达式中捕获的变量必须实际上是最终变量。实际上的最终变量指:这个变量初始化之后就不会再为它赋新值。
在一个lambda表达式中使用this关键字时,是指创建这个lambda表达式的方法的this参数。
3.6、处理lambda表达式
4、内部类
内部类是定义在另一个类中的类。
4.1、使用内部类访问对象状态
内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域。
只有内部类可以是私有的,而常规类只可以具有包可见性,或公有可见性。
4.2、内部类的特殊语法规则
内部类中声明的所有静态域都必须是final。
4.3、局部内部类
局部类不能用public或private访问说明符进行声明。它的作用域被限定在声明这个局部类的块中。优势:对外部世界可以完全的隐藏起来。
4.4、由外部方法访问变量
4.5、匿名内部类
假如只需要创建这个类的一个对象,就不必命名了。
由于构造器名字必须与类名相同,所以匿名类不能有构造器,可以将构造器参数传递给超类构造器。尤其是在内部类实现接口的时候,不能有任何构造参数。
4.6、静态内部类
可将内部类声明为static,以便取消产生的引用。