那些曾经被我忽视的技术(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被更改了
    }

我要成为大剑天尊!