一、理解
1、interface:接口
2、使用说明:
1.接口使用interface来定义。
2.在java中,接口和类是并列的两个结构。
3.如何定义接口:定义接口的成员
3.1、jdk7.0及以前:只能定义全局常量和抽象方法
全局常量:public static final ,但是public static final可以省略
抽象方法:public abstract ,可以省略不写。
3.2、jdk8.0:除了能定义全局常量和抽象方法,还可以定义静态方法和默认方法
4.接口不能定义构造器!意味着接口不能实例化
5.Java开发中,接口通过类去实现(implements)的方式来使用。
如果实现类覆盖(实现了接口中的所抽象方法),则此实现类可以实例化。
如果实现类没覆盖(实现接口中的所抽象方法),则此实现类仍为抽象类。
6.java类可以实现多个接口——>弥补了java的单继承性。
格式:class AA extends BB implements CC,DD,EE{}
7.接口与接口之间可以继承,而且可以多继承。
8.接口的使用具体体现了多态性。
9.接口,实际上可以看做一种规范。
二、举例
public class UsbTest {
public static void main(String[] args) {
Computer c = new Computer();
//1.接口实现非匿名实现类的非匿名对象
Flash f = new Flash();
c.method(f);
//2.接口实现非匿名实现类的匿名对象
c.method(new Printer());
//3.接口实现匿名实现类的非匿名对象
Usb u = new Usb(){
@Override
public void start() {
System.out.println("手机开始工作");
}
@Override
public void stop() {
System.out.println("手机结束工作");
}
};
c.method(u);
//3.接口实现匿名实现类的匿名对象
c.method(new Usb(){
@Override
public void start() {
System.out.println("mp3开始工作");
}
@Override
public void stop() {
System.out.println("mp3结束工作");
}
});
}
}
interface Usb{
void start();
void stop();
}
class Flash implements Usb{
@Override
public void start() {
System.out.println("U盘启动");
}
@Override
public void stop() {
System.out.println("U盘弹出");
}
}
class Printer implements Usb{
@Override
public void start() {
System.out.println("打印机开始工作");
}
@Override
public void stop() {
System.out.println("打印机停止工作");
}
}
class Computer{
public void method(Usb usb){//Usb usb = new Flash()/new Printer()
usb.start();
System.out.println("设备进行工作");
usb.stop();
}
}
运行结果:
注意点:
接口的使用过程中:
1.接口的使用,也满足多态性
2.接口看作一种规范
3.开发中,注意面向接口编程
三、体会面向接口编程的思想
在应用程序当中,我们调用的都是JDBC当中定义的接口,不会出现某个数据库厂商的API文档。
四、Java8中关于接口的新规范
1:接口中定义的静态方法,只能通过接口本身调用
2:可以通过实现类的对象,调用接口中的默认方法。实现类可以重写接口中的默认方法。如果实现类的对象调用覆盖的方法,实现类的对象运行的仍然是实现类中重写了的默认方法。
3:如果子类(实现类继承的父类中与实现接口中同名同参数的方法时(且这个方法子类(实现类)并没重写),默认调用的是父类的方法——>类优先原则
4:如果实现类同时实现多个接口,这多个接口中同名同参数的默认方法时,在实现类没重写默认方法的情况下,实现类会报错——>接口冲突。那么此时,实现类中就必须重写这个默认方法
5:如何在子类(或实现类中调用自己重写的方法、父类、接口中被重写的方法
public void myMethod(){
method3();//调用子类重写的方法
super.method3();//调用父类中被重写的方法
//调用接口中被重写的默认方法
CompareA.super.method3();
CompareB.super.method3();
}
5.面试题
1、抽象类与接口的异同?
相同点:都不能实例化,可以被继承。
不同点:
1)抽象类有构造器,接口不能定义构造器。
2)抽象类可以定义抽象方法,子类重写后使用。接口(jdk7、jdk8、jdk9新特性)
3)类:单继承;接口:多继承
类与接口:多实现