超市购物小票——自定义类
1案例介绍与演示
将超市购物小票案例中零散数据(名称、货号、单价、计价单位等)封装为货物对象。
2案例分析
a)案例回顾
在超市购物小票案例中,我们封装了三个方法,在switch中为3个case执行用户选择的三个不同的操作:1输入购买数量 2打印购物小票 3退出系统
而所有的变量均”零散地”定义在成员位置。
b)重构内容分析
1:将原来的成员位置零散定义的变量,封装为商品项GoodsItem对象。
2:将所有使用变量值的地方全部改为使用GoodsItem对象
c)实现步骤
定义Person类
定义Person类,包含成员变量名称、年龄、地址
重构使用到变量的逻辑
将所有使用到成员位置商品属性的代码处,均由直接使用改为通过对象名访问对象属性的方式。
代码实现:
package StudentJavaSEday08;
/**
*
* 自定义数据类型 商品项类
*
* 属性
*
* 商品名称 String 商品id String 商品单价 double 商品数量 int 商品金额 double
*/
public class GoodsItem {
// 商品名称
String name;
// 商品id
String id;
// 商品单价
double price;
// 商品数量
int number;
// 商品金额
double money;
}
package StudentJavaSEday08;
/*
使用switch语句完成三个分支的代码逻辑
当用户输入1时,让用户输入所要购买的商品数量
当用户输入2时,给用户打印出对应的购物小票
当用户输入3时,退出系统
1.定义商品数据
2.提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统
3.接收用户输入的选择
4.使用switch进行判断
5.整体是一个死循环
代码重构
1.定义一个商品项类
2.在成员位置创建两个商品对象
3.给两个商品对象的属性赋值
定义一个方法为商品对象初始化属性的方法 方法名 init 参数 无 返回值 无
4.修改购买方法和打印小票方法 因为里边访问的变量都不存在了 需要改成商品对象去访问属性的方式
*/
//导入Scanner
import java.util.Scanner;
public class Supermarket {
// 定义少林寺酥饼核桃商品对象
static GoodsItem sls = new GoodsItem();
// 定义然光Q移商品对象
static GoodsItem rg = new GoodsItem();
public static void main(String[] args) {
// 调用init方法 用来初始化数据
init();
while (true) {
// 提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统
System.out.println("请输入您的操作:1.输入商品数量 2.打印购物小票 3.退出系统");
// 接收用户输入的选择 使用Scanner完成
// Scanner sc = new Scanner(System.in);
// 调用nextInt方法 接收用户的选择
// int choose = sc.nextInt();
// 调用键盘录入整数方法enterNumber接收用户输入的选择
int choose = enterNumber();
// 使用switch进行判断用户的选择
switch (choose) {
case 1:
// 调用buy方法 完成用户输入商品数量
buy();
break;
case 2:
// 调用printTicket方法 打印购物小票
printTicket();
break;
case 3:
System.out.println("优惠多多,期待下次光临!!");
System.exit(0);
break;
default:
System.out.println("请正确输入!");
break;
}
}
}
// 定义一个方法为商品对象初始化属性的方法 方法名 init 参数 无 返回值 无
public static void init() {
// 给少林寺对象赋值
sls.name = "少林寺酥饼核桃";
sls.id = "090115";
sls.price = 15.50;
// 给然光对象赋值
rg.name = "然光Q移";
rg.id = "090028";
rg.price = 16.00;
}
// 定义一个键盘录入整数的方法 方法名 enterNumber 需要的数据 无 返回的数据 一个用户输入的整数
public static int enterNumber() {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
return number;
}
// 将用户输入商品数量封装成方法 方法名 buy 需要的数据 无 返回的数据 无
public static void buy() {
Scanner sc = new Scanner(System.in);
// 依次让用户给每个商品的数量重新赋值
System.out.println("请输入少林寺酥饼核桃的购买数量:");
sls.number = sc.nextInt();
sls.money = sls.number * sls.price;
System.out.println("请输入然光Q移的购买数量:");
rg.number = sc.nextInt();
rg.money = rg.number * rg.price;
}
// 打印购物小票方法 方法名 printTicket 需要的数据 无 返回的数据 无
public static void printTicket() {
// ===============票头=========================
System.out.println(" 欢 迎 光 临");
System.out.println("品名 售价 数量 金额");
System.out.println("-------------------------------------");
// ===============票体=========================
System.out.println(sls.name + "(" + sls.id + ")" + " " + sls.price + " * " + sls.number + " = " + sls.money);
System.out
.println(rg.name + "(" + rg.id + ")" + " " + rg.price + " * " + rg.number + " = " + rg.money);
System.out.println("-------------------------------------");
// ===============票脚=========================
// 项数
int lineNumber = 2;
// 总数量
int totalNumber = sls.number + rg.number;
// 总金额
double totalMoney = sls.money + rg.money;
System.out.println(lineNumber + " 项商品 共计:" + totalNumber + " 件");
System.out.println("总计:" + totalMoney);
}
}
运行结果:
超市购物小票——集合
1案例介绍与演示
将本日第二章内容所有的Person对象放置到集合中使用。
2案例分析
d)重构内容分析
1:将原来的成员位置的多个商品项GoodsItem对象封装到一个ArrayList集合中
2:将所有使用变量值的地方全部改为先从集合中后去对象,再使用GoodsItem对象获取属性值的方式。
e)实现步骤
成员位置定义ArrayList集合
定义方法,用于为集合赋值,准备要操作的数据。
重构使用到变量的逻辑
将所有使用到成员位置商品项的代码处,均由使用对象名访问对象属性的方式改为先从集合中获取对象,再获取属性值的方式。
3自定义类型与集合的使用优点分析
当使用自定义类型时,将数据与数据之间产生了合理必要的联系:一个商品的属性应都属于一个商品,则可以以一个商品作为数据操作的基本单位。
当使用集合时,由原来成员位置定义多个对象改为定义一个集合对象。所有使用数据的地方循环遍历即可,无论有再多新数据的产生,其代码不需要更改。
代码实现:
/*
自定义数据类型 商品项类
属性
商品名称 String
商品id String
商品单价 double
商品数量 int
商品金额 double
*/
public class GoodsItem {
// 商品名称
String name;
// 商品id
String id;
// 商品单价
double price;
// 商品数量
int number;
// 商品金额
double money;
}
/*
使用switch语句完成三个分支的代码逻辑
当用户输入1时,让用户输入所要购买的商品数量
当用户输入2时,给用户打印出对应的购物小票
当用户输入3时,退出系统
1.定义商品数据
2.提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统
3.接收用户输入的选择
4.使用switch进行判断
5.整体是一个死循环
代码重构
准备数据
1.定义一个商品项类
2.在成员位置定义一个集合 用来存储所有商品
3.为成员位置的集合初始化商品
4.修改购买和打印小票方法 将商品对象从集合中取出来,访问商品对象的属性
*/
//导入Scanner
import java.util.Scanner;
//导入ArrayList
import java.util.ArrayList;
public class Supermarket2
{
//在成员位置定义一个集合 用来存储所有商品
static ArrayList<GoodsItem> list = new ArrayList<GoodsItem>();
public static void main(String[] args)
{
//调用init方法 用来初始化数据
init();
while(true){
//提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统
System.out.println("请输入您的操作:1.输入商品数量 2.打印购物小票 3.退出系统");
//接收用户输入的选择 使用Scanner完成
int choose = enterNumber();
//使用switch进行判断用户的选择
switch(choose){
case 1:
//调用buy方法 完成用户输入商品数量
buy();
break;
case 2:
//调用printTicket方法 打印购物小票
printTicket();
break;
case 3:
System.out.println("爱买不买,下次带钱来!!");
System.exit(0);
break;
default:
System.out.println("你瞎啊!");
break;
}
}
}
//定义一个方法为商品对象初始化属性的方法 方法名 init 参数 无 返回值 无
public static void init(){
//定义少林寺酥饼核桃商品对象
GoodsItem sls = new GoodsItem();
//给少林寺对象赋值
sls.name = "少林寺酥饼核桃";
sls.id = "090115";
sls.price = 15.50;
//定义然光Q移商品对象
GoodsItem rg = new GoodsItem();
//给然光对象赋值
rg.name = "然光Q移";
rg.id = "090028";
rg.price = 16.00;
//定义人参果商品对象
GoodsItem rsg = new GoodsItem();
//给然光对象赋值
rsg.name = "人参果";
rsg.id = "090001";
rsg.price = 111111.00;
//将商品对象添加到集合中
list.add(sls);
list.add(rg);
list.add(rsg);
}
//定义一个键盘录入整数的方法 方法名 enterNumber 需要的数据 无 返回的数据 一个用户输入的整数
public static int enterNumber(){
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
return number;
}
//将用户输入商品数量封装成方法 方法名 buy 需要的数据 无 返回的数据 无
public static void buy(){
Scanner sc = new Scanner(System.in);
/*
遍历存储商品的集合list,依次获取每个商品
让用户给每个商品的数量赋值
计算每个商品的金额
*/
for(int i = 0 ;i < list.size();i++){
//依次获取每个商品
GoodsItem thisItem = list.get(i);
System.out.println("请输入"+thisItem.name+"商品的购买数量:");
//让用户给每个商品的数量赋值
thisItem.number = sc.nextInt();
//计算每个商品的金额
thisItem.money = thisItem.number * thisItem.price;
}
}
//打印购物小票方法 方法名 printTicket 需要的数据 无 返回的数据 无
public static void printTicket(){
//===============票头=========================
System.out.println(" 欢 迎 光 临");
System.out.println("品名 售价 数量 金额");
System.out.println("-------------------------------------");
//===============票体=========================
/*
遍历商品集合,依次获取每个商品,打印每个商品的属性
*/
for(int i = 0 ;i<list.size();i++){
//依次获取每个商品
GoodsItem thisItem = list.get(i);
//依次获取每个商品
System.out.println(thisItem.name+"("+thisItem.id+")"+" "+thisItem.price+" * "+thisItem.number+" = "+thisItem.money);
}
//System.out.println(sls.name+"("+sls.id+")"+" "+sls.price+" * "+sls.number+" = "+sls.money);
//System.out.println(rg.name+"("+rg.id+")"+" "+rg.price+" * "+rg.number+" = "+rg.money);
System.out.println("-------------------------------------");
//===============票脚=========================
//项数
int lineNumber = list.size();
//总数量
int totalNumber = 0;
//总金额
double totalMoney = 0.0;
/*
遍历商品集合 ,依次获取每个商品
将每个商品的数量累加
将每个商品的金额累加
*/
//遍历商品集合
for(int i = 0 ;i < list.size();i++){
//依次获取每个商品
GoodsItem thisItem = list.get(i);
//总数量
totalNumber += thisItem.number;
//总金额
totalMoney += thisItem.money;
}
System.out.println(lineNumber+" 项商品 共计:"+totalNumber+" 件");
System.out.println("总计:"+totalMoney);
}
}
运行结果: