1.实验目的
在面向抽象编程的基础上,掌握使用接口进行程序设计的核心思想是使用接口回调,明白接口也可以体现程序设计的“开-闭”原则,即对扩展开放,对修改关闭。
2.实验要求
深刻理解面向接口编程和“开-闭”原则,要求会定义接口变量,该接口变量存放了实现该接口的类的对象的引用,从而接口变量就可以回调类实现的接口方法。
3.实验步骤:
1)定义接口,声明若干个abstract方法。
2)创建类,在类中定义若干个参数为接口类型的方法。
3)通过实现接口的类的对象回调类重写的接口方法
4)实现相应功能
4.实验代码
(1)定义接口与乘客
Passenger.java
package huidiao;
interface Pay{ //定义接口Pay
double howMuch(); //计算需要多少钱
String showType(); //显示现在所乘坐的车的类型
void paid(); //方法:已支付
}
public class Passenger {
public void setPay(Pay p) { //乘车人支付
double s=p.howMuch(); //接口回调
String m=p.showType(); //接口回调
System.out.println("司机:"+m+"已经到达目的地,一共"+s+"元,请扫码支付");
System.out.println("乘客:好的,麻烦师傅等我拿一下手机......");
System.out.println("手机:叮咚!");
System.out.println("顾客:好了,师傅");
p.paid(); //接口回调
}
}
(2)汽车司机
CarDriver.java
package huidiao;
public class CarDriver implements Pay { //定义私家车类使用Pay接口
public double kilo; //成员变量公里数
public Passenger passenger; //公有成员变量乘车人
public CarDriver(Passenger passenger) { //构造函数
this.passenger=passenger;
}
public void setKilo(double k) { //行驶里程
this.kilo =k;
}
public String showType() {
return "私家车";
}
public double howMuch() { //怎么收费
double m;
m=8+1.5*(kilo-3);
return m;
}
public void paid() { //对接口方法paid的重写
System.out.println("司机:已经收到车钱!");
System.out.println("司机:感谢您的乘坐,祝您旅途愉快");
}
public void pleasePay() { //司机发起收钱
passenger.setPay(this);
}
}
(3)公交司机
Bus.java
package huidiao;
public class Bus implements Pay { //定义公交类使用Pay接口
public double kilo; //成员变量公里数
public Passenger passenger; //公有成员变量乘车人
public Bus(Passenger passenger) { //构造函数
this.passenger=passenger;
}
public void makeKilo(double k) { //行驶里程
this.kilo =k;
}
public String showType() {
return "公交车";
}
public double howMuch() { //怎么收费
double m;
m=kilo/2.0;
return m;
}
public void paid() { //对接口方法paid的重写
System.out.println("司机:已经收到车钱!");
System.out.println("司机:感谢您的乘坐,祝您旅途愉快");
}
public void pleasePay() { //司机发起收钱
passenger.setPay(this);
}
}
(4)主类
Mainclass.java
package huidiao;
import java.util.Scanner;
public class Mainclass {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Passenger Jack = new Passenger(); //乘客Jack
CarDriver Jan = new CarDriver(Jack); //私家车Jan
Bus A189 = new Bus(Jack); //公交车A189
Scanner reader=new Scanner(System.in);
double x;
System.out.println("请输入里程数:");
x=reader.nextDouble(); //输入里程数
Jan.setKilo(x);
Jan.pleasePay();
Jan.paid(); //Jack乘坐私家车行驶x米要付的钱
System.out.printf("***********************************\n");
A189.makeKilo(x);
A189.pleasePay();
A189.paid(); //Jack乘坐公交车行驶x米要付的钱
}
}
(5)说明
该程序充分体现了接口的“开-闭”原则,如果需要再添加一种乘车方式,只需再重新写一个类来实现接口Pay即可,而Passenger类不需要做任何改变(即对Passenger类的修改关闭)。