1. 强制类型转换有可能发生编译错误或者强制类型转换异常,可以使用instanceof操作符先测试对象。
2. 定义在接口中的任何变量自动成为public static final静态常量。
3. 接口中可以添加静态方法和默认方法。
4. 两个接口的方法冲突时,且至少一个提供的是默认方法,实现类必须覆写该方法以解决冲突。使用super关键字可以调用父类的该方法:父类.super.方法。
5. 如果一个类继承一个父类,且实现了一个接口,而且从父类和接口继承了同样的方法,这种情况直接忽略接口的默认方法,使用父类方法。
6. 在Java中,方法能够访问它自己所在类的(其他)对象的任何私有成员。使用方法:类对象实例.私有成员
7. ”lambda表达式“是一块代码,你可以用将他传递出去,这样后面就可以执行一次或多次。
8. 当你期望只有一个抽象方法的接口对象时,就可以提供一个lambda表达式,这样的接口被称为函数式接口。
9. 对lambda表达式你只能做一件事情,将其放入类型为函数式接口的变量中,这样他就被转换为该接口的实例。不能将他赋值给其他变量。
10. 方法引用等同于lambda表达式。有三种使用方式:
(a)类::实例方法,第一个参数将成为方法的接收者
(b)类:静态方法,所有参数都被传递给方法
(c)对象::实例方法,对象作为方法的接收者
11. 可以在方法引用中捕获this,例如:this::equals 等同于 x->this.equals(x)
12. 在内部类中,可以使用 外部类.this::方法名 来捕获外部类的this引用,也可以捕获super
13. 构造函数的方法引用都是 类::new
14. 可以使用数组类型来编写构造函数引用。int[]::new 等同于 n->new int[n]
15. 数组构造函数引用可以用来绕过java的一个限制,无法构造一个泛型数组。toArray方法返回的是一个Object数组,而不是特定类型的数组。可以使用另一个版本的toArray(类[]::new)来构造返回特定类型的数组。
16. 使用@FunctionalInterface注解标记函数式接口,编译器会检查接口是否带有单个抽象方法,javadoc也能识别。
17. lambda表达式的方法体与嵌套代码块具有相同的作用域。
18. lambda表达式有三个部分:
(a)代码块
(b)参数
(c)自由变量,既不是参数变量,也不是代码块内定义的临时变量
19. 带有自由变量值的代码块就是闭包。lambda表达式就是闭包。
20. lambda表达式可以捕获闭合作用域内的变量,但是有一个约束,只能捕获那些值不会改变的变量,也被称为有效final变量。
21. 增强型for循环中的变量是有效final变量,因为他的作用域是单个迭代。
22. 可以在方法中定义类,这样的类被称为局部类。
23. 在java引入lambda表达式之前,匿名内部类是提供runnable,comparator以及其他函数式对象最简洁的语法。现在只有你需要提供两个或以上抽象方法是,匿名类才有使用需要。