一、接口
1.接口的概念
-
接口中的所有方法自动式public,在实现接口时,必须把方法声明为public,不然就是默认访问权限
-
类的默认方法访问权限是包可见性,不是private,包可见性指同一个包内的类可以访问,private是谁都不能访问。
-
接口可以包含多个方法,包含常量,但是不能有实例字段,接口绝不会实现方法,这是实现接口的类干的事情。
2.接口与抽象类
上边说了接口中不能实现具体方法,不能有实例字段,那么为什么不用抽象类而选择接口呢?
- 1.抽象类必须有抽象函数
- 2.一个子类只能扩展一个抽象类,但是可以实现多个接口
3.接口与回调callback
回调是指某个特定事件发生时应该采取的动作
比如利用定时器Timer类,隔一段时间就做出相应的操作,就是回调。
Timer类的构造函数中必须有相应动作的对象,而相应动作的类必须要继承ActionListener
每隔一段时间就做出动作的PrintTimer类:
public class TimePrinter implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) { //ActionEvent提供了事件的相关信息,包括时间,重写接口定义定时器到时的操作
//定时1.打印当前时间
System.out.println("准点报时,此时的时间为:"+ Instant.ofEpochMilli(e.getWhen()));
//定时2.响铃
Toolkit.getDefaultToolkit().beep();//getDefaultToolkit获得默认的工具箱,beep发生一声铃响
}
}
将做出动作的对象传入定时器Timer类:
public static void main(String[] args)
{
TimePrinter listener = new TimePrinter();
//构造一个定时器,每隔1秒通知一次listener,动作监视对象listener就是定时器回调的对象
Timer timer = new Timer(1000,listener);
//定时开始
timer.start();
//显示截止对话框
JOptionPane.showMessageDialog(null,"quit program?");
System.exit(0);
}
4.克隆clone
默认的克隆是浅拷贝,即对两个对象的子对象是共享的,当子对象不会变化的时候利用浅拷贝就够了,深拷贝则需要自己重新代码,克隆所有的子对象
二、lambda
5.1使用lambda的原因:
当一个程序需要反复的使用另一个段代码块的时候,不同于引入一个对象的便捷形式,如果这段引入的代码块十分冗长就需要使用lambda了。因为lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。
比如下面的重写优先级比较器的例子中,传统的方式优先队列需要传入一个Comparator的对象,先new再重写其中的compare函数,非常的麻烦,如果用lambda方法,就省去了new和重写Override注解的过程。而且比较器这种会频繁被优先级调用的代码越简洁越好。
5.2 lambda的语法
lambda举例:(Integer o1,Integer o2)->o2-o1
()中是函数传入的参数
->后边是函数体,这里没写return,因为会自动识别return 就是o2-o1
当函数体里边有if语句的时候需要把每一种情况都return,如:
(Integer a,Integer b)->
{
if(a>b)return a;
else return b;
}
5.3 举例:重写lambda的比较器
这里用一个优先队列重写比较器的例子来说明lambda
优先队列的比较器使用lambda重写
class compute {
public static void main(String[] args) {
PriorityQueue<Integer> que = new PriorityQueue<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
}
// (Integer o1,Integer o2)->o2-o1
);
que.add(5);
que.add(10);
que.add(3);
que.add(20);
que.add(1);
while(!que.isEmpty()){
System.out.println(que.poll().toString());
}
}
}
不使用lambda表达式的最小堆:
使用lambda表达式的最大堆:
#### 5.4 lambda实现函数式接口
在前边的回调函数可以改成