《Java核心技术 卷I》读书笔记五
章节内容
- 接口
- 接口示例
- lambda表达式
- 内部类
- 代理
接口
接口不是类,是对类的一组需求描述。
接口的所有方法自动归属public,因此接口中方法不需要提供关键字public
接口中可以定义常量,接口中的域将被自动设为public static final
java8之前接口不能实现方法
如同使用instanceof检查一个对象是否属于某个特定类一样,也可以使用instance检查一个对象是否实现了某个特定的接口
虽然在接口中不能包含实例域或静态方法,但却可以包含常量
每个类只能拥有一个超类,但却可以实现多个接口。
在java8中,允许在接口中增加静态方法;允许为接口方法提供一个默认实现,必须用default修饰符标记
默认方法的好处:
- 实现接口的程序员只需要关心他们真正关心的接口方法,不用全部实现
- 接口演化,为旧JDK的接口增加方法而不用修改所有继承这个接口的类
lambda表达式
箭头->是java中的一种lambda表达式形式
对于只有一个抽象方法的接口,需要这种借口的对象时,就可以提供一个lambda表达式,这种接口被称为函数式接口。
PS:java设计者没有为lambda增加函数类型,我们不能把lambda表达式赋给Object的变量,因为Object不是一个函数式接口
将已有方法引用为lambda表达式可以使用::操作符,主要有三种情况:
- object::instanceMethod
- Class::staticMethod
- Class::instanceMethod
第三种情况中,第一个参数会成为方法的调用者。例如,String::compareToIgnoreCase等同于(x,y)-> x.compareToIgnoreCase(y)
构造器也是可以作为方法引用为lambda表达式
lambda表达式的三个部分:
- 一个代码块
- 参数
- 自由变量的值,这是指非参数而且不在代码中定义的变量。也就是闭包
闭包主要注意点: - 只能引用值不会改变的变量
- 如果在lambda表达式中引用,而这个变量可能在外部改变,这是不合法的
lambda表达式中的this代表创建这个lambda表达式的方法的this参数
内部类
内部类是定义在另一个类中的类,产生内部类的原因:
- 内部类方法可以访问该类定义所在的作用域中的额数据,包括私有
- 内部类可以对同一个包中的其他类隐藏起来
- 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷
使用内部类访问对象状态
内部类的对象总有一个隐式引用,指向了创建它的外部类对象
只有内部类可以是私有类,常规类都是宝可见性或公有可见性
内部类的特殊语法规则
内部类中的所有静态域都必须是final
局部内部类
局部类不能用public或private访问说明符进行声明,它的作用域被限定在声明这个局部类的块中。
匿名内部类
如果构造参数的小括号后面跟一个大括号,正在定义的就是内部类
静态内部类
在内部类不需要访问外围类对象的时候应该使用静态内部类
声明在接口的内部类自动成为static和public类
代理
创建代理对象需要使用Proxy类的newProxyInstance方法,需要三个参数:
- 一个类加载器
- 一个Class对象数组
- 一个调用处理器
代理类的特性
所有的代理类都扩展于Proxy类
一个代理类只有一个实域--调用处理器
代理类一定是public和final