对希望符合这个接口的类的一组需求
eg.Comparable接口的代码
public interface Comparable { int compareTo(Object other); }
任何实现Comparable接口的类都要包含compareTo方法
public interface Moveable { void move(double x,double y); double SPEED=95; } //接口中的字段总是public static final
步骤:
eg. 如果希望Arrays类的sort方法对Employee对象数组进行排序,Employee类就必须实现Comparable接口
class Employee implements Comparable
public int compareTo(Object o) { Employee other=(Employee) o; return Double.compare(salary,other.salary); }
public class EmployeeInterface implements Comparable<EmployeeInterface>{ private String name; private double salary; public EmployeeInterface(String name,double salary) { this.name=name; this.salary=salary; } public String getName() { return name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public void raiseSalary(double byPercent) { this.salary+=this.salary*byPercent/100; } @Override public int compareTo(EmployeeInterface o) { return Double.compare(this.salary,o.salary); } } import java.lang.reflect.Array; import java.util.Arrays; public class EmployeeSortTest { public static void main(String[] args) { EmployeeInterface[] staff=new EmployeeInterface[3]; staff[0]=new EmployeeInterface("Harry Hacker",35000); staff[1]=new EmployeeInterface("Carl Cracker",75000); staff[2]=new EmployeeInterface("qaq",100); Arrays.sort(staff); //排序 一定要实现接口Comparable for(EmployeeInterface e:staff) { System.out.println("name="+e.getName()+" salary="+e.getSalary()); } } } //结果: //name=qaq salary=100.0 //name=Harry Hacker salary=35000.0 //name=Carl Cracker salary=75000.0
抽象类的问题:每个类只能扩展一个类
而每个类可以实现多个接口
C++支持多重继承,但Java不支持
使用default关键字 可以为接口方法提供一个默认实现
default int compareTo(T other) { return 0; }
eg. Iterator接口
解决默认方法冲突:
先在一个接口中将一个方法定义为默认方法,又在超类或另一个接口中定义同样的方法,what happened?
在这种模式中,可以指定某个特定事件发生时应该采取的动作。
Java:向定时器传入某个类的对象,然后,定时器调用这个对象的方法。由于对象可以携带一些附加信息,所以传递一个对象比传递一个函数要灵活得多。
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.time.Instant; import javax.swing.*; public class TimerTest { public static void main(String[] args) { TimePrinter listener=new TimePrinter();//创建监听器对象 Timer timer=new Timer(1000,listener); //这里传递listener这个对象 timer.start(); JOptionPane.showMessageDialog(null,"Quit program?"); System.exit(0); } } class TimePrinter implements ActionListener { @Override public void actionPerformed(ActionEvent event) { System.out.println("At the tone,the time is "+ Instant.ofEpochMilli(event.getWhen())); Toolkit.getDefaultToolkit().beep(); } }