Java实验七, 接口与多态

一. 实验目的

1. 理解接口与多态;

2. 掌握接口回调技术;

3. 掌握面向接口编程思想。

二. 实验内容及要求

卡车要装载一批货物,货物由电视机、计算机和洗衣机组成,卡车需要计算出整批货物的重量。编写能够满足如下条件的程序:

1. 定义一个接口,包含计算货物重量的抽象方法。

2. 分别定义实现上述接口的用于计算电视机、计算机和洗衣机的类。

3. 定义一个卡车类,在其中定义一个数组成员变量表示其装载的货物,并提供能计算所载整批货物重量的方法。

4. 在主类中模拟卡车装载N件货物,每件货物的类别随机,输出其所载货物的总重量。

三. 实验过程及结果

 Goods.java
public interface Goods {
	double cal_weight();//计算货物重量的抽象方法
}
 TV.java
public class TV implements Goods{
	double singleTVWeight;//单个电视机重量
	double single_weight[] = {5.5, 3.1, 4.1, 6};//可选择的电视机重量

	public TV(int randomInt) {
		this.singleTVWeight = single_weight[randomInt];
	}//构造方法,从single_weight[]中随机选中一个重量并设置

	public double cal_weight() {
		return singleTVWeight;
	}//计算电视机重量的方法,返回电视机重量
}
 Computer.java
public class Computer implements Goods{
	double singleComputerWeight;//单个电脑重量
	double single_weight[] = {1.5, 1.9, 2.0, 2.4};//可选择的电脑重量

	public Computer(int randomInt) {
		this.singleComputerWeight = single_weight[randomInt];
	}//构造方法,从single_weight[]中随机选中一个重量并设置

	public double cal_weight() {
		return singleComputerWeight;
	}//计算电脑重量的方法,返回电脑重量
}
 WashingMachine.java
public class WashingMachine implements Goods{
	double singleWMWeight;//单个洗衣机重量
	double single_weight[] = {13.5, 11.9, 20, 12.4};//可选择的洗衣机重量

	public WashingMachine(int randomInt) {
		this.singleWMWeight = single_weight[randomInt];
	}//构造方法,从single_weight[]中随机选中一个重量并设置

	public double cal_weight() {
		return singleWMWeight;
	}//计算洗衣机重量的方法,返回洗衣机重量
}
 Truck.java
import java.util.Random;

public class Truck {
	static Goods[] goods;//数组成员变量,表示其装载的货物
	
	static void show_weight(Goods[] goods) {
		double sum = 0;//货物总重,初始为0

		for (Goods g: goods) {
			sum += g.cal_weight();
		}//计算货物总重
		
		System.out.printf("卡车装载货物的总重量为:%.2fkg\n", sum);
	}
	
	public static void main(String[] args) {
		Random random = new Random();//创建随机数生成器random
		Truck.goods = new Goods[50];//设置N为50

		//计算电脑、洗衣机、电视机总数
		int countTV = 0, countWM = 0, countCom = 0;
		//计算电脑、洗衣机、电视机总重
		double TVWeight = 0, WMWeight = 0, ComWeight = 0;
		
		for (int i = 0; i < Truck.goods.length; i++) {
			int selection = random.nextInt(3);
			int index = random.nextInt(4);
			
			if (selection == 0) {//若随机数为0,货物种类为“电脑”
				Truck.goods[i] = new Computer(index);
//设置数组中第i个货物种类为“电脑”
				countCom++;//电脑总数加1
				ComWeight += Truck.goods[i].cal_weight();
			} else if (selection == 1) {//若随机数为1,货物种类为“洗衣机”
				Truck.goods[i] = new WashingMachine(index);
//设置数组中第i个货物种类为“洗衣机”
				countWM++;//洗衣机总数加1
				WMWeight += Truck.goods[i].cal_weight();
			} else if (selection == 2) {//若随机数为2,货物种类为“电视机”
				Truck.goods[i] = new TV(index);
//设置数组中第i个货物种类为“电视机”
				countTV++;//电视机总数加1
				TVWeight += Truck.goods[i].cal_weight();
			} 
		}
		
		System.out.printf("电脑总数:%d, 总重:%.2fkg\n", countCom, ComWeight);
		System.out.printf("洗衣机总数:%d, 总重:%.2fkg\n", countWM, WMWeight);
		System.out.printf("电视机总数:%d, 总重:%.2fkg\n", countTV, TVWeight);
		System.out.println("卡车装载货物的总数为:" + Truck.goods.length);
		Truck.show_weight(Truck.goods);
	}
}	

四. 实验中的问题及心得

1. 通过此次实验我对面向接口编程有了更深的了解:

(1)面向接口编程要遵循开-闭原则,使程序对接口的修改“关闭”,否则一旦修改接口(比如增加一个abstract方法),则实现该接口的类都要修改;对增加实现接口的类开放,这样可以使程序的功能易于扩充

(2)java只允许单继承,每个子类只能有一个父类;而使用接口,每个类却可以实现多个接口

2. 此次实验中,既使用了接口回调,也使用了对象数组,我对对象数组也有了更深的理解。比如:

(1)A[] a;

(2)a = new A[10];

(3)a[i] = new A();

前两步只是定义了数组a有10个元素,每个元素都是A类的对象,这些对象目前都是空对象;第三步后,数组中每个元素才是真正的对象

猜你喜欢

转载自blog.csdn.net/weixin_42250302/article/details/89293175