飲料購買

飲料購買

今天帶大家使用封裝,繼承,[多態]來寫一個簡單的飲料購買程序

話不多說,直接看需求吧:

編寫程序實現飲料購買:
編寫程序,接收用戶輸入的信息,選擇購買的飲料。
可供選擇的飲料有:咖啡、礦泉水和可樂。
其中,購買咖啡時可以選擇:容量,然後再選擇加糖、加奶還是什麼都不加。
購買可樂時可以選擇:買可口可樂還是百事可樂。
購買礦泉水可以選擇:容量

看完了需求,再來看一下效果圖吧:

在這裏插入圖片描述

既然使用到了繼承,那麼咱們就要來寫父類,找出他們共同的屬性:姓名和飲料,我這裏將他們的父類定義成了一個抽象類,並且提供了info()的抽象方法,供後面選擇重寫調用,來看代碼:

public abstract class Drink{
    String name;//飲料的名字
    int capacity;//飲料的容量
    public abstract void info();//定義的一個抽象方法,後面其他的子類可以直接重寫調用
}

既然使用到了抽象類,那麼咱們來一起討論下抽象的概念:
用abstract修飾的類,表示一種抽象的類型
用abstract修飾的方法,表示一種抽象的行爲(比如說,心裏知道要做一件事,但是不知道怎麼做),如果有哪些行爲(方法)必須讓子類區做的話,可以把這些行爲(方法)定義抽象的,子類必須要實現這些行爲(方法)

注意事項:
1.抽象方法沒有方法體(沒有{}大括號)
2.抽象類不能直接創建對象,必須通過子類創建
3.抽象類中既可以有抽象方法,也可以有非抽象方法
4.繼承抽象類,需要實現抽象類中所有的抽象方法

根據需要看:編寫程序,接收用戶輸入的信息,選擇購買的飲料.可供選擇的飲料有:咖啡、礦泉水和可樂。
其中,購買咖啡時可以選擇:容量,然後再選擇加糖、加奶還是什麼都不加。
購買可樂時可以選擇:買可口可樂還是百事可樂。
購買礦泉水可以選擇:容量

現在開始創建Drink的子類Coffee類,並且重寫他的info方法,並增加了ingredients屬性,進行封裝
既然提到封裝,咱們就來聊一聊封裝吧:
封裝:就是將所有的屬性私有化(private修飾的屬性),即只能在本類中使用,如果在其他類中需要訪問的話,就需要通過奔雷提供的特定的getXXX和setXXX方法進行訪問
**注意:**在面向對象的開發中,一般建議用封裝的特性去編寫實體類(將所有的屬性私有化並提供get和set方法)

**封裝的思想:**將對象的屬性和行爲封裝起來,而將對象的屬性和行爲封裝起來的載體就是類

/**
 * 咖啡類
 *
 */
public class Coffee extends Drink {
	private String ingredients;//飲料的配料
	//使用封裝,寫ingredients的set/get方法,方便其他類的調用
	public void setIngredients(String ingredients) {
		this.ingredients = ingredients;
	}
	public String getIngredients() {
		return ingredients;
	}
	/**
	 * 因爲本類繼承了抽象類Drink,Drink類中有一個抽象的方法
	 * 所以在這裏面如果想要繼承Drink類,就需要重寫Drink中的info方法
	 * 方便後面的直接調用
	 */
	@Override
	public void info() {
		System.out.println("名稱:"+name);
		System.out.println("容量:"+capacity+"ml");
		System.out.println("配料:"+ingredients);
	}
	
}

創建Coke類,並繼承Drink,重寫info()方法,並添加可樂的種類屬性type,將type進行封裝

/**
 * 可樂類
 *
 */
public class Coke extends Drink {
	//可樂的種類
	private String type;
	//使用封裝,set/get方法
	public void setType(String type) {
		this.type = type;
	}
	public String getType() {
		return type;
	}
	/**
	 * 重寫父類的info方法
	 */
	@Override
	public void info() {
		System.out.println("您購買飲料的信息如下:");
		System.out.println("名稱:"+name);
		System.out.println("種類:"+type);
		System.out.println("容量:"+capacity+"ml");
	}
	
}

創建Water類,繼承Drink類,重寫info()方法

/**
 * 礦泉水類
 *
 */
public class Water extends Drink{
/**
 * 重寫了Drink類中的info方法
 */
	@Override
	public void info() {
		System.out.println("您要購買的信息如下:");
		System.out.println("名稱:"+name);
		System.out.println("容量:"+capacity+"ml");
	}

}

創建測試類,將上面的類綜合到一起

public class DrinkTest {
    //個人愛好,我喜歡定義成全局的鍵盤掃描器
    static Scanner in = new Scanner(System.in);
	static String jixu;
	public static void main(String[] args) {
		do {
		//提示語
		System.out.println("~~~~~~~~~~~~自動售水機歡迎您~~~~~~~~~~~~");
		System.out.println("請選擇購買的飲料:1.咖啡  2.礦泉水  3.可樂 4.退出");
		//定義type變量用來接收用戶輸入的信息
		int type = in.nextInt();
		//根據用戶選擇的類型來執行不同的操作
		if(type == 1) {
			System.out.println("請輸入購買容量:");
			Coffee c = new Coffee();//創建咖啡對象
			//這裏面使用繼承,咖啡類裏面沒有capacity和name屬性,將會使用父類的屬性,將這兩個內容賦值給父類的屬性
			c.capacity = in.nextInt();
			c.name = "咖啡";
			//使用switch提示用戶加糖,加奶,還是什麼都不加操作
			System.out.println("是否需要添加配料: 1.加糖  2.加奶 3.什麼都不加");
			int num = in.nextInt();//定義變量用來接收用戶輸入的操作
			//將變量使用在switch中,執行不同的操作
			switch(num) {
				case 1:
					//當用戶輸入1時,把加糖賦值給Coffee中的set方法
					c.setIngredients("加糖");
					break;
				case 2:
					c.setIngredients("加奶");
					break;
				case 3:
					c.setIngredients("什麼都不加");
					break;
					default :
						System.out.println("您輸入的指令不正確");
						break;
			}
			System.out.println("您要購買的飲料信息如下:");
			//調用咖啡類重寫父類的info方法
			c.info();
			//如果用戶輸入2的時候,執行的操作如下
		}else if(type == 2) {
			System.out.println("請輸入購買容量:");
			Water w = new Water();
			w.name = "礦泉水";
			//將用戶輸入的容量賦值給 Water類中的capacity屬性
			w.capacity = in.nextInt();
			//因爲Drink類是一個抽象類,並且有一個抽象方法,所以Water類繼承Drink需要重寫info方法,來調用重寫後的info方法
			w.info();
			//如果用戶輸入的是3,執行的操作
		}else if(type == 3) {
			System.out.println("請輸入購買容量:");
			Coke c = new Coke();
			c.name = "可樂";
			//將用戶輸入的容量賦值給coke中父類的capacity 屬性
			c.capacity = in.nextInt();
			System.out.println("請選擇可樂的種類: 1.可口可樂  2.百事可樂");
			//因爲可樂分種類,所以定義num變量來接收用戶輸入的種類
			int num = in.nextInt();
			//根據種類的不同,執行不同的操作
			switch(num) {
				case 1 :
					//如果是可口可樂將賦值
					c.setType("可口可樂");
					break;
				case 2:
					//如果是百事可樂將賦值
					c.setType("百事可樂");
					break;
					//如果用戶亂輸的話,提示語
					default:
						System.out.println("不好意思,咱這沒您想要的肥仔快樂水");
						break;
			}
			//最後跟Water類一樣,調用重寫後的info方法
			c.info();
            //退出程序
		}else if(type == 4) {
			System.out.println("歡迎下次光臨");
			break;
		}
		System.out.println("請問您是否繼續購買: y or n"); 
            //使用jixu變量來接收用戶輸入的是否是y
		 jixu = in.next();
            //如果輸入的是y執行,否則執行
		 if(jixu.equals("y")) {
			 System.out.println("請繼續操作......");
		 }else {
			 System.out.println("謝謝使用.....");
		 }
		
	}while("y".equals(jixu));
}
//使用變量jixu來接收用戶輸入的是否是y
		 jixu = in.next();
            //如果輸入的是y執行,否則執行
		 if(jixu.equals("y")) {
			 System.out.println("請繼續操作......");
		 }else {
			 System.out.println("謝謝使用.....");
		 }
		
	}while("y".equals(jixu));
}

ok這個簡單的程序就這樣解決了,有興趣的大佬可以繼續在上面擴展,同時也希望大家可以對本程序提出寶貴的意見,感謝大佬

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章