【Java作业】接口与多态
一、实验名称
实验六 接口与多态
二、实验内容
1.实验内容1
本实验的任务是设计和实现一个Soundable接口,该接口具有发声功能,同时还能调节声音大小(playSound( )、decreaseVolume( )、stopSound( ))。Soundable接口的这些功能将会由3种声音设备来实现,它们分别是:Radio,Walkman和Mobilephone。最后还需设计一个应用程序类来使用这些实现了Soundable接口的声音设备。程序运行时,先询问用户想听哪知设备,然后程序按照该设备的工作方式来输出发音。程序运行效果如下:
2.实验内容2
货车要装载一批货物,货物由三种商品组成:电视、计算机、洗衣机。卡车需要计算出整批货物的重量。
- 要求有一个ComputeWeight接口,该接口中有一个方法:
public double computeWeight() - 有三个实现该接口的类:Television、Computer和WashMachine. 这三个类通过实现接口给出自重。
- 有一个Truck类,该类用ComputeWeight接口类型的数组作为成员(Truck类面向接口),那么该数组的单元就可以存放Television对象的引用、Computer对象的引用或WashMachine对象的引用。
- 程序要求:①Truck中这三种物品的总量范围为30~50,随机生成;②用对象数组来管理;③根据随机数生成Television、Computer和WashMachine三类对象;④输出Truck对象所装载的货物的总重量。
三、 实验目的
1.学习如何定义接口
2.掌握接口的实现方式
3.使用实现了接口的类
4.掌握接口回调
5.理解接口与抽象类的区别
四、类图/类关系图/交互图等
五、程序及思路算法分析
实验内容1
思路分析:
实验内容1是一个简单接口实现练习。思路就是定义一个接口Soundable,然后有三个类去实现这个接口,其中这三个自然要实现接口中的方法。同时,在测试类Test1中定义一个死循环来监听程序的输入,当输入0,1,2时会创建相应的对象并将这个对象引用赋值给开始声明的soundable。然后调用其方法。
Soundable接口类
package com.dreamchaser.work7;
/**
* 具有发声功能的接口
*/
public interface Soundable {
void playSound();
void decreaseVolume();
void stopSound();
}
Radio类
package com.dreamchaser.work7;
public class Radio implements Soundable{
@Override
public void playSound() {
System.out.println("收音机播放广播:*人民广播电台");
}
@Override
public void decreaseVolume() {
System.out.println("增大收音机音量");
}
@Override
public void stopSound() {
System.out.println("关闭收音机");
}
}
Walkman类
package com.dreamchaser.work7;
public class Walkman implements Soundable{
@Override
public void playSound() {
System.out.println("随身听发出音乐:1234567");
}
@Override
public void decreaseVolume() {
System.out.println("增大随身听音量");
}
@Override
public void stopSound() {
System.out.println("关闭随身听");
}
}
Mobilephone类
package com.dreamchaser.work7;
public class Mobilephone implements Soundable{
@Override
public void playSound() {
System.out.println("手机发出来电铃声:叮当,叮当");
}
@Override
public void decreaseVolume() {
System.out.println("增大手机音量");
}
@Override
public void stopSound() {
System.out.println("关闭手机");
}
}
Test1测试类
package com.dreamchaser.work7;
import java.util.Scanner;
/**
* 测试类
*/
public class Test1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
Soundable soundable=null;
while(true){
System.out.println("你想听什么?请输入选择:0-收音机 1-随声听 2-手机");
int i=scanner.nextInt();
if (i==0){
soundable=new Radio();
}else if (i==1){
soundable=new Walkman();
}else {
soundable=new Mobilephone();
}
soundable.playSound();
soundable.decreaseVolume();
soundable.stopSound();
System.out.println("----------------------------");
}
}
}
实验内容2
思路分析:
同实验内容2一样都是三个类实现一个接口,值得一提的是Truck类。这个类由题目可知,有一个ComputeWeight数组。而数组的内容,也就是其中的对象引用是随机的,只要保证总质量在30-50之间即可。此时我在这个类中写了一个initialize方法来初始化computeWeights数组,并返回其总质量,其思路将在算法分析中讲述。而测试类Test2中就是创建了Truck对象来。
算法分析:
Truck类外层已经创建了这三个类的对象,在initialize方法中,外层是个死循环,内部先对a,b,c三个数做0-10的随机,然后判断总质量是否在30-50之间,如果在这之间则利用clone方法克隆相应数量的相应对象放在数组中,并break出循环返回总质量total,否则继续循环。
PS:clone方法的实现:1.相应的类实现cloneable标记接口(其内部什么也没有,仅做标记使用,程序在运行过程中会检查这个类是否实现了这个接口,如果没有则会抛出CloneNotSupportedException异常)
2.重写Object类的clone方法,将访问修饰符改为public(其实Object类中已经帮我们实现了clone方法,但是其访问修饰符为protected,所以我们只需重写该方法,将访问修饰符改成public即可,当然这个浅克隆的做法)
ComputeWeight 接口类
package com.dreamchaser.work7;
public interface ComputeWeight {
double computeWeight();
}
Computer 类
package com.dreamchaser.work7;
public class Computer implements ComputeWeight,Cloneable{
@Override
public double computeWeight() {
return 1;
}
//覆盖Object类中clone方法,将其提升为public
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Television类
package com.dreamchaser.work7;
public class Television implements ComputeWeight,Cloneable{
@Override
public double computeWeight() {
return 2;
}
//覆盖Object类中clone方法,将其提升为public
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
WashMachine类
package com.dreamchaser.work7;
public class WashMachine implements ComputeWeight,Cloneable{
@Override
public double computeWeight() {
return 3;
}
//覆盖Object类中clone方法,将其提升为public
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Truck类
package com.dreamchaser.work7;
public class Truck {
ComputeWeight[] computeWeights;
Computer computer=new Computer();
Television television=new Television();
WashMachine washMachine=new WashMachine();
/**
* 初始化货车上的货物,返回总重量
* @return
*/
public double initialize(){
double total=0;
while (true){
int a= (int) (Math.random()*10);
int b= (int) (Math.random()*10);
int c= (int) (Math.random()*10);
total=a*computer.computeWeight()+b*television.computeWeight()+c*washMachine.computeWeight();
if (total>30 && total<50){
computeWeights =new ComputeWeight[a+b+c];
for (int i=0;i<a;i++){
try {
computeWeights[i]= (ComputeWeight) computer.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
for (int i=a;i<a+b;i++){
try {
computeWeights[i]= (ComputeWeight) television.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
for (int i=a+b;i<a+b+c;i++){
try {
computeWeights[i]= (ComputeWeight) washMachine.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
break;
}
}
return total;
}
}
Test2测试类
package com.dreamchaser.work7;
public class Test2 {
public static void main(String[] args) {
Truck truck=new Truck();
//初始化truck的货物
double total=truck.initialize();
System.out.println("货车上总质量为"+total+"kg");
}
}
六、测试
实验内容1测试结果
实验内容2测试结果
七、实验心得
对于接口和clone机制的理解更加深刻了。
Java的interface中,成员变量的默认修饰符为:public static final;方法的默认修饰符是:public abstract。
接口只是对一类事物属性和行为的更高次抽象;对修改关闭,对扩展开放,可以说是java中开闭原则的一种体现。
其它:本章相关知识点程序与测试
注:实验心得可结合大纲规定相关任务
上一篇: 总结:java中的多态
下一篇: HashTable——哈希表(散列表)