1.解决默认方法冲突
场景一:
如果先在一个接口中将一个方法定义为默认方法,然后在另外一个接口中定义了同样的方法,会出现什么情况?
我们以接口:WoMan和Man;测试:Jane。
Man
public interface Man {default public void sleep() {System.out.println("男人都需要睡觉");}}
WoMan
public interface WoMan {default public void sleep() {System.out.println("女人都需要睡觉");}}
Jane
总结:
01-接口冲突
我们使用Jane实现两个接口(不同名,方法相同),Java编译器会报告一个错误,让我们自己来选择两个冲突方法中的一个。
场景二:
如果先在一个接口中将一个方法定义为默认方法,然后在超类(父类)中定义了同样的方法,会出现什么情况?
超类(父类)Person;接口Man;测试Jane
Person
public class Person {public void sleep() {System.out.println("人都需要睡觉");}
}
Man
public interface Man {default public void sleep() {System.out.println("男人都需要睡觉");}}
Jane
总结:
02-超类(父类)优先
通过控制台打印出来的是"人都需要睡觉",可以看出这段程序优先访问超类(父类)中的方法,由此可以证明:超类和接口都有相同的方法,则程序会优先访问超类中的方法。
2.接口与回调
01-回调概念
我们在执行程序后,程序会发生什么动作(程序会做哪些事情)。
02-举例说明
我们都知道 java.swing
包中有一个 Timer
类, 可以使用它在到达给定的时间间隔时发出通告 。
假如我们的程序中有一个时钟,我们通过请求来达到每秒钟获得一个通告,以便能够更新时钟的表盘(可以理解为秒针)。
这句话大意就是说:(当到达时间间隔时,需要做哪些操作)。
思路:
1)我们需要告诉定时器要做什么?定时器需要调用哪个方法,所以需要实现ActionListener
这个接口。
2)我们需要构造一个对象,并将它传递给Timer
构造器。
3)启动定时器。
代码:
package com.eleven.intefacee;import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;public class TimerTest {public static void main(String[] args) {ActionListener listener = new TimePrinter();Timer t = new Timer(10000, listener); // 每隔10秒打印一次t.start();JOptionPane.showMessageDialog(null, "退出程序?");System.exit(0);}
}
/*** 当到达指定的时间间隔时,定时器就会调用actionPerformed方法* @author sywangu**/
class TimePrinter implements ActionListener{@Overridepublic void actionPerformed(ActionEvent event) {System.out.println(new Date());Toolkit.getDefaultToolkit().beep();}}
3.Comparator接口
01-按照长度比较字符串