面相接口编程是一个很重要的思想,涉及到设计模式中的简单工厂模式
- 什么是接口?
一种标准规范,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
- 接口的特点有哪些?
- 接口可以多继承
- 接口的方法声明必须是 public abstract, 即便不写默认也是
- 接口里面不能包含方法具体实现
- 类继承接口必须实现接口里申明的全部方法,除非该类是抽象类
- 类里面可以声明 public static final 修饰的变量
- 接口不能被实例化,但是可以被实现类创建
- 抽象类和接口什么时候使用?
- 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
- 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
- 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
- 在 JDK8中,允许我们给接口添加两种非抽象的方法实现:
1、默认方法,添加 default 修饰即可;
2、静态方法,使用 static 修饰;
interface T1{
//这个是默认方法
default String get(String aa){
System.out.println("我是jdk1.8默认实现方法...");
}
//这个是静态方法
static void staticMethod(){
System.out.println("我是静态方法");
}
}
注意: 静态方法只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用,default 方法只能通过接口实现类的对象来调用。
- 如何定义接口?
//接口定义属性
public interface People {
int age=18;
String name="输出名字";
// 接口里面定义的成员变量都是 public static final 修饰
public void eat(); //定义方法
}
- 例题1: 定义USB接口, 实现读写功能
//USB接口
interface USB {
void read();
void write();
}
// 这是U盘的具体实现。
class Disk implements USB {
@Override
public void read() {
System.out.println("U盘正在通过USB功能读取数据");
}
@Override
public void write() {
System.out.println("U盘正在通过USB功能写入数据");
}
}
- 例题2: (务必跟着敲一遍)
计算2种交通工具运行1000Km所需的时间:
已知每种交通工具的参数都是3个整数A、B、C(自己定义)的表达式。
现有两种工具: Car 和Plane,
其中Car 的速度运算公式为:A*B/C ,Plane 的速度运算公式为:A+B+C。
public interface Common {
double runTime(double a, double b, double c);
String getName();//获取交通工具名称
}
// 接口实现,飞机
class Plane implements Common{
@Override
public double runTime(double a, double b, double c) {
return (a+b+c);
}
@Override
public String getName() {
return "Airplane";
}
}
// 接口实现 汽车
class Car implements Common{
@Override
public double runTime(double a, double b, double c) {
return (a*b/c);
}
@Override
public String getName() {
return "Car";
}
}
class ComputeTime{
public static void main(String[] args) {
double A = 3;
double B = 5;
double C = 6;
//定义速度v,时间t
double v,t ;
Common d = new Car();
v = d.runTime(A,B,C);
t = 1000/v;
System.out.println(d.getName()+"的平均速度:"+v+"km/h");
System.out.println(d.getName()+"的运行时间:"+t+"小时");
d=new Plane();
v = d.runTime(10,30,40);
t=1000/v;
System.out.println(d.getName()+"的平均速度:"+v+"km/h");
System.out.println(d.getName()+"的运行时间:"+t+"小时");
}
}
输出结果:
总结:
值得一提的是,接口所有的类是可以写到一个java文件夹里的, 为了便于理解查看,IDEA 会自动帮我们把接口和类分成若干java文件。