實驗任務
- 任務一:設計實現發聲接口
- 任務二:動物樂園
實驗內容
任務一:設計實現發聲接口
任務目的:
- 理解並掌握如何定義接口
- 掌握接口的實現方式
任務描述:
設計和實現一個Soundable接口,該接口具有發聲功能,同時還能調節聲音大小
Soundable接口的這些功能將由有3種聲音設備來實現他們分別是Radio、Walkman、
Mobilephone。最后還需設計一個應用程序類來使用這些實現Soundable接口的聲音
設備。程序運行時,先詢問用戶想聽那個設備,然后程序按照該設備的工作方式來輸
出發音。
實施步驟:
1. 定義 Soundable接口
public interface Soundable { // 發出聲音 public void playSound() ; // 降低聲音 public void decreaseVolume(); // 停止聲音 public void stopSound(); }
2. 設計Radio類
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("關閉收音機。"); } }
3. 設計Walkman類
public class Walkman implements Soundable{ @Override public void playSound() { System.out.println("隨身聽發出音樂"); } @Override public void decreaseVolume() { System.out.println("降低隨身聽音量"); } @Override public void stopSound() { System.out.println("關閉隨身聽"); } }
4. 設計MobilePhone類
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("關閉手機"); } }
5. 設計SampleDisplay類
class SampleDisplay { public void display(Soundable soundable) { soundable.playSound(); soundable.decreaseVolume(); soundable.stopSound(); } }
6. 測試類
import java.util.Scanner; public class TestDemo { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("你想聽什么?請輸入:"); System.out.println("0-收音機 1-隨身聽 2-手機"); int choice; choice = in.nextInt(); SampleDisplay sampledisplay = new SampleDisplay(); if (choice == 0) sampledisplay.display(new Radio()); else if(choice == 1) sampledisplay.display(new Walkman()); else if(choice == 2) sampledisplay.display(new MobilePhone()); else System.out.println("瓜娃,你輸錯了!"); in.close(); } }
任務二:動物樂園
任務目的
能夠靈活運用接口解決多繼承問題
任務描述
編寫程序模擬動物園里飼養員給各種動物喂養各種不同食物的過程。當飼養員
給動物喂食時,動物發出歡快的叫聲。
實施步驟
在這個動物園里,涉及的對象有飼養員,各種不同動物以及各種不同的食物。這樣
很容易抽象出3個類Feeder、Animal和Food。假設只考慮貓科和狗類動物,則由Animal
類派生出Cat類、Dog類、同樣由Food類可以進一步派生出其子類Bone、Fish。因為他
們之間存在這明顯的is-a關系。
同樣魚是一種食物,但實際上,魚也是一種動物,Cat類和Dog類繼承了Animal的很多
屬性和方法,如果將Animal定義為接口,Animal中是不能定義成員變量和成員方法的,Food
類中雖然也有變量但是數量比Animal少,所以我們考慮將Food定義為接口,此時可以說“魚
是一種動物,同時也是一種食物”。
代碼實現:
定義Animal類
public abstract class Animal { private String name; public Animal(String name) { this.name = name; } public abstract void shout(); public abstract void eat(Food food); public String getName() { return name; } public void setName(String name) { this.name = name; } }
Animal的子類Cat類
public class Cat extends Animal{ public Cat(String name) { super(name); } public void shout() { System.out.println("喵嗚....."); } public void eat(Food food) { System.out.println(getName() + "正在吃着香噴噴的" + food.getName()); } }
Animal的子類Dog類
public class Dog extends Animal { public Dog(String name) { super(name); } @Override public void shout() { System.out.println("汪汪汪....."); } @Override public void eat(Food food) { System.out.println(getName() + "正在啃着香噴噴的" + food.getName()); } }
定義Food類
public interface Food { public abstract String getName(); }
Fish類
public class Fish extends Animal implements Food{ public Fish(String name) { super(name); } @Override public void shout() { } @Override public void eat(Food food) { } }
Bone類
public class Bone implements Food{ @Override public String getName() { return "bone"; } }
Feeder類
public class Feeder { private String name; public Feeder(String name) { this.name = name; } public void speak() { System.out.println("歡迎來到動物園!"); System.out.println("我是飼養員 "+getName()); } public void feed(Animal a, Food food) { a.eat(food); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
測試類:
public class TestDemo { public static void main(String[] args) { Feeder feeder = new Feeder("花花"); feeder.speak(); Dog dog = new Dog("小布丁"); Food food = new Bone(); feeder.feed(dog, food); Cat cat = new Cat("小貓崽"); food = new Fish("黃花魚"); feeder.feed(cat, food); } }