那些曾经被我忽视的技术(Java)(更新中)
1.接口(的一些没那么常用的用法)
-
接口虽然不能
new
,但是接口可以声明变量Comparable x;
这表示x所引用的必须是一个implement Comparable
的类的对象
-
instanceof
,判断一个对象是否属于某个特定接口(也可以用来判断是否属于某个特定类)if(anObject instanceof Comparable){....}
-
回调(callback)
- 本质: 将一个接口对象(即某个实现了这个接口的类的对象)作为参数传递给另一个方法,在特定事件或条件触发时自动执行(这个接口的方法),“调用方定义逻辑,被调用方决定时机”
public class TimePrinter implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("the time is " + Instant.ofEpochMilli(e.getWhen()));
Toolkit.getDefaultToolkit().beep();
}
}
public class TimerTest {
public static void main(String[] args) {
TimePrinter tp = new TimePrinter();
Timer timer = new Timer(1000,tp);//Timer接收时间间隔和实现了ActionListenor的对象
timer.start();
JOptionPane.showMessageDialog(null,"Quit program?");
System.exit(0);
}
}
//看一下javax.swing.Time的构造函数
public Timer(int delay, ActionListener listener) {//可以看到第二个参数是这个接口的对象
...
}
2.lambda表达式
- 提到接口,就不得不提到lambda表达式,lambda表达式是对于匿名内部类/接口的实现的简写
以前面那份代码为例,下面这份代码和上面的是等价的
public class TimerTest {
public static void main(String[] args) {
Timer timer = new Timer(1000, e -> {
System.out.println("the time is " + Instant.ofEpochMilli(e.getWhen()));
Toolkit.getDefaultToolkit().beep();
});
timer.start();
JOptionPane.showMessageDialog(null,"Quit program?");
System.exit(0);
}
}
- 可以看得出来lambda表达式真的很简洁,下面给出他的用法和使用条件
- 用法:实现接口/抽象类/匿名内部类等等
- 使用条件(接口):有且仅有一个抽象函数(default/由于继承Object而拥有的函数不算抽象函数)
- 简要的说,lambda的语法大概就是这样
- (参数1,参数2...)->{代码块};(只有一个参数的时候可以省略括号)
- 不过需要注意的是,在代码块中如果引用了除了括号里的参数以外的变量,那么这个变量必须是不会再改变的(否则会编译报错),这和并发相关,例如
public static void repeatMessage(String text, int delay){
ActionListener listener = event->{
System.out.println(text);
Toolkit.getDefaultToolkit().beep();
};
text = "1111";//如果不删掉这行代码,就会编译报错,因为text被更改了
}