飲料購買
今天帶大家使用封裝,繼承,[多態]來寫一個簡單的飲料購買程序
話不多說,直接看需求吧:
編寫程序實現飲料購買:
編寫程序,接收用戶輸入的信息,選擇購買的飲料。
可供選擇的飲料有:咖啡、礦泉水和可樂。
其中,購買咖啡時可以選擇:容量,然後再選擇加糖、加奶還是什麼都不加。
購買可樂時可以選擇:買可口可樂還是百事可樂。
購買礦泉水可以選擇:容量
看完了需求,再來看一下效果圖吧:
既然使用到了繼承,那麼咱們就要來寫父類,找出他們共同的屬性:姓名和飲料,我這裏將他們的父類定義成了一個抽象類,並且提供了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這個簡單的程序就這樣解決了,有興趣的大佬可以繼續在上面擴展,同時也希望大家可以對本程序提出寶貴的意見,感謝大佬