饮料购买

饮料购买

今天带大家使用封装,继承,[多态]来写一个简单的饮料购买程序

话不多说,直接看需求吧:

编写程序实现饮料购买:
编写程序,接收用户输入的信息,选择购买的饮料。
可供选择的饮料有:咖啡、矿泉水和可乐。
其中,购买咖啡时可以选择:容量,然后再选择加糖、加奶还是什么都不加。
购买可乐时可以选择:买可口可乐还是百事可乐。
购买矿泉水可以选择:容量

看完了需求,再来看一下效果图吧:

在这里插入图片描述

既然使用到了继承,那么咱们就要来写父类,找出他们共同的属性:姓名和饮料,我这里将他们的父类定义成了一个抽象类,并且提供了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这个简单的程序就这样解决了,有兴趣的大佬可以继续在上面扩展,同时也希望大家可以对本程序提出宝贵的意见,感谢大佬

猜你喜欢

转载自blog.csdn.net/qq_45280147/article/details/106268936