1、接口属性
- 接口不能用new操作符实例化
- 接口可以声明变量,这个变量必须引用实现了这个类的对象
- 可以用instanceof检查一个对象是否实现了某个接口 eg. a instance if b
- 接口中不能有实例字段,但是可以定义常量,常量默认是public static final,且不能更改
- 一个类只能有一个超类,但是可以实现多个接口,使用逗号将要实现的接口分开
eg. public class Employee implements Cloneable,Comparable
2、抽象类和接口的对比
- 都可以声明通用方法
- Java类只能有一个父类,一个类只能继承一个抽象类
- 一个类却可以实现多个接口
3、静态方法和私有方法。
转载自 java接口中的默认方法、静态方法、私有方法_灬繁花落雨灬的博客-CSDN博客_java 接口私有方法
4、默认方法
- 默认方法的标识符为default,不能省略
- 有了默认方法后,即使实现类中没有定义这个方法,类对象仍然可以直接调用
- 接口新加了非默认方法后,如果类中没有实现这个方法,那么这个类编译会报错;如果不编译直接使用老的jar包不会报错,但是不能调用新加的方法
5、默认方法冲突
- 超类优先。如果超类中定义了一个具体方法,同名且同参数的接口的默认方法会被忽略
- 接口冲突。一个接口中提供了默认方法,另一个接口提供了同名且同参数的方法(不论是否是默认方法),编译器都会要求实现类覆盖这个方法来解决冲突
- 如果一个接口增加了默认方法,那么对于增加默认方法前能正常工作的代码不会有任何影响
6、接口与回调
public class TimerTest {
public static void main(String... args)
{
var tp = new TimerPrinter();
Timer t = new Timer(1000, tp);
t.start();
JOptionPane.showMessageDialog(null, "quit program?");
System.exit(0);
}
}
class TimerPrinter implements ActionListener
{
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("at the tone, the time is: " + Instant.ofEpochMilli(e.getWhen()));
Toolkit.getDefaultToolkit().beep();
}
}
7、克隆
对于实现克隆的类,需要的步骤:
- 默认的clone方法是否满足要求
- 是否可以在可变的子对象上调用clone来修补默认的克隆方法
- 是否不该使用clone
- 需要实现步骤1和步骤2,需要满足:实现cloneable接口;重新定义clone方法,并设置修饰符为public
8、lambda表达式
- 应用场景:对于只有一个抽象方法的接口,当需要这个接口的对象时,就可以提供一个lambda表达式替代这个对象。这种接口称为函数式接口