饮料购买
今天带大家使用封装,继承,[多态]来写一个简单的饮料购买程序
话不多说,直接看需求吧:
编写程序实现饮料购买:
编写程序,接收用户输入的信息,选择购买的饮料。
可供选择的饮料有:咖啡、矿泉水和可乐。
其中,购买咖啡时可以选择:容量,然后再选择加糖、加奶还是什么都不加。
购买可乐时可以选择:买可口可乐还是百事可乐。
购买矿泉水可以选择:容量
看完了需求,再来看一下效果图吧:
既然使用到了继承,那么咱们就要来写父类,找出他们共同的属性:姓名和饮料,我这里将他们的父类定义成了一个抽象类,并且提供了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这个简单的程序就这样解决了,有兴趣的大佬可以继续在上面扩展,同时也希望大家可以对本程序提出宝贵的意见,感谢大佬