《Java核心技术 卷I》读书笔记五

章节内容

  • 接口
  • 接口示例
  • lambda表达式
  • 内部类
  • 代理

接口

接口不是类,是对类的一组需求描述。
接口的所有方法自动归属public,因此接口中方法不需要提供关键字public
接口中可以定义常量,接口中的域将被自动设为public static final
java8之前接口不能实现方法
如同使用instanceof检查一个对象是否属于某个特定类一样,也可以使用instance检查一个对象是否实现了某个特定的接口
虽然在接口中不能包含实例域或静态方法,但却可以包含常量
每个类只能拥有一个超类,但却可以实现多个接口。
在java8中,允许在接口中增加静态方法;允许为接口方法提供一个默认实现,必须用default修饰符标记

默认方法的好处:

  1. 实现接口的程序员只需要关心他们真正关心的接口方法,不用全部实现
  2. 接口演化,为旧JDK的接口增加方法而不用修改所有继承这个接口的类

lambda表达式

箭头->是java中的一种lambda表达式形式
对于只有一个抽象方法的接口,需要这种借口的对象时,就可以提供一个lambda表达式,这种接口被称为函数式接口。
PS:java设计者没有为lambda增加函数类型,我们不能把lambda表达式赋给Object的变量,因为Object不是一个函数式接口

将已有方法引用为lambda表达式可以使用::操作符,主要有三种情况:

  1. object::instanceMethod
  2. Class::staticMethod
  3. Class::instanceMethod
    第三种情况中,第一个参数会成为方法的调用者。例如,String::compareToIgnoreCase等同于(x,y)-> x.compareToIgnoreCase(y)
    构造器也是可以作为方法引用为lambda表达式

lambda表达式的三个部分:

  1. 一个代码块
  2. 参数
  3. 自由变量的值,这是指非参数而且不在代码中定义的变量。也就是闭包
    闭包主要注意点:
  4. 只能引用值不会改变的变量
  5. 如果在lambda表达式中引用,而这个变量可能在外部改变,这是不合法的

lambda表达式中的this代表创建这个lambda表达式的方法的this参数

内部类

内部类是定义在另一个类中的类,产生内部类的原因:

  1. 内部类方法可以访问该类定义所在的作用域中的额数据,包括私有
  2. 内部类可以对同一个包中的其他类隐藏起来
  3. 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷

使用内部类访问对象状态

内部类的对象总有一个隐式引用,指向了创建它的外部类对象
只有内部类可以是私有类,常规类都是宝可见性或公有可见性

内部类的特殊语法规则

内部类中的所有静态域都必须是final

局部内部类

局部类不能用public或private访问说明符进行声明,它的作用域被限定在声明这个局部类的块中。

匿名内部类

如果构造参数的小括号后面跟一个大括号,正在定义的就是内部类

静态内部类

在内部类不需要访问外围类对象的时候应该使用静态内部类
声明在接口的内部类自动成为static和public类

代理

创建代理对象需要使用Proxy类的newProxyInstance方法,需要三个参数:

  1. 一个类加载器
  2. 一个Class对象数组
  3. 一个调用处理器

代理类的特性

所有的代理类都扩展于Proxy类
一个代理类只有一个实域--调用处理器
代理类一定是public和final

posted @ 2020-09-26 23:46  無花無酒鋤作田  阅读(112)  评论(0编辑  收藏  举报