商品录入案例总结_1120
需求与功能
定义一个商品的类 当中有 : 商品名字 , 商品价格 ,商品随机码(类似第三题的随机码)等属性;
- a:生成对应的 构造方法 , get set方法.toString()方法.
- b:生成五个商品对象,保存起来. 数据要 键盘 录入
- c:将所有商品的信息 展示出来.
- d:键盘录入商品随随机码 ,判断该随机码是否存在
分析
a:生成对应的 构造方法 , get set方法.toString()方法.
通过快捷键能够快速地点出来。
b:生成五个商品对象,保存起来. 数据要 键盘 录入
创建一个方法,参数列表为对象数组。键盘录入用Scanner,通过循环实例化对象,再通过调用set方法给对象赋值,最后将对象保存到数组中。
c:将所有商品的信息 展示出来.
创建一个方法,参数列表为对象数组。通过for循环遍历传入数组的数据,用toString()方法将数据打印。
d:键盘录入商品随随机码 ,判断该随机码是否存在
创建一个方法,参数列表为对象数组。键盘录入用Scanner,通过调用netx()再调用equals()方法判断是否与传入的数组对象中的元素的随机码相同。
代码实现
商品类的定义
class Goods{
private String name; //商品名字
private double price; //商品价格
private String randNum; //商品随机码
public Goods() { //空参构造
super();
}
public Goods(String name, double price, String randNum) {//有参构造
super();
this.name = name;
this.price = price;
this.randNum = randNum;
}
//get/set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getRandNum() {
return randNum;
}
public void setRandNum(String randNum) {
this.randNum = randNum;
}
//重写toString()方法
public String toString() {
return "Goods [商品名字=" + name + "\t价格=" + price + "元\t随机码="+ randNum + "]";
}
}
创建一个商品类Goods,定义商品名称,商品价格,商品随机码。有参和无参构造方法,set和get方法,最后重写toString()方法。这些方法都是可以通过快捷键写出来的。
第一个功能方法的实现:
//b:生成五个商品对象,保存起来. 数据要 键盘 录入 public static void enterGoods(Goods[] arr){ String randNum = ""; //定义一个字符串变量,存放随机码 for(int i = 0; i < arr.length; i++){ Goods g = new Goods(); //创建对象 System.out.println("请录入商品的名字:"); String name = new Scanner(System.in).next(); g.setName(name); //录入商品名字,通过setName()方法给商品名字赋值 System.out.println("请录入商品的价格:"); double price = new Scanner(System.in).nextDouble(); g.setPrice(price); //录入商品价格,通过setName()方法给价格名字赋值 randNum = randNum(); //调用随机码方法,获取随机码 g.setRandNum(randNum); //通过setRandNum()方法给商品随机码赋值 arr[i] = g; //把信息录入完成的对象存储到对象数组 System.out.print("商品录入成功!"); System.out.println("该商品的随机码为:"+randNum); } }
需要注意的是,在for循环内部要创建对象。通过创建的对象去调用set()方法,把用户输入的数据赋值给该对象。再把这个对象存储到对象数组中。如果没有创建对象,而是直接用arr[i]直接调用set()方法赋值的话,会报错,显示空指针异常。
第二个功能方法的实现:
//c:将所有商品的信息 展示出来. public static void goodsInfoShow(Goods[] arr){ System.out.println("商品信息:"); for(int i = 0; i < arr.length; i++){ System.out.println(arr[i].toString()); //调用toString()方法,打印商品信息 } }
利用for循环遍历每一个对象数组的元素,再通过调用toString()方法打印商品信息。
第三个功能方法的实现:
//d:键盘录入商品随随机码 ,判断该随机码是否存在 public static void isRandNumIn(Goods[] arr){ System.out.println("请输入一个四位数的随机码:"); Scanner sc = new Scanner(System.in); String str = sc.next(); //获取用户输入的随机码 for(int i = 1; i <= arr.length; i++){ //遍历商品数组 if (str.equals(arr[i-1].getRandNum())){ //调用equals()方法,与商品数组进行比较 System.out.println("该随机码存在!"); System.out.println(arr[i-1].toString()); //如果该随机码存在,就打印与之对应的商品信息 break; }else if(i == arr.length){ System.out.println("该随机码不存在!"); } } }
在这里我把for循环的:起始位置定义为1,是因为这样容易判断随机码不存在的情况,即:当i == arr.lenthg时,证明对象数组中,没有与之对象的元素。
获取随机码
//获取随机码的方法 public static String randNum() { String str = ""; for(int i = 0; i < 4; i++){ //随机四个数字,和字符串拼接,使其转换成字符串 str = new Random().nextInt(10)+str; } return str; }
这里我把获取随机码打包成一个方法,方便调用。
主方法
public class GoodsInfo { public static void main(String[] args) { Goods[] g = new Goods[4]; //创建一个长度为5的Goods对象数组 enterGoods(g); //调用enterGoods()方法,录入商品信息 goodsInfoShow(g); //调用goodsInfoShow()方法,打印商品信息 isRandNumIn(g); //调用isRandNumIN()方法,判断随机码是否存在 }
在主方法创建一个对象数组,长度为5。调用各方法。
总结
Scanner和Random的用法,我经常采用匿名的方式写。不过也有一些是必须要定义一个变量去存储的。
在第一个功能方法的实现里,我定义了一个String变量,存储调用randNum()方法后的返回值。
如果没有定义一个randNum变量存储调用randNum()的返回值,而是直接在setRandNum()传入setRandNum(randNum());又用一个输入语句System.out.println(“该商品的随机码为:”+randNum());那么这样可能会导致同个商品的随机码出现不同。因为同个商品调用了两次randNum()方法。
在实现第一个功能的时候,我没有在实现方法里创建数组对象,结果一直报空指针异常。后来才发现,在for循环内部要创建对象。通过创建的对象去调用set()方法,把用户输入的数据赋值给该对象。再把这个对象存储到对象数组中。如果没有创建对象,而是直接用arr[i]直接调用set()方法赋值的话,就会报错。
在实现第三个功能时,要判断用户输入的随机码是否存在?一开始我用的是把用户输入的数据调用equals()方法,和数组对象进行遍历,如果相同就输入“存在”,如果和最后一个比较还是不相同,那么就输入“不存在”。我用if(){}else if(用户的数据和数组最后一个数据比较){“不存在”};
但是这样是错的。后来才改用:在for里把起始位置设置为1。当for循环最后仍没有break跳出,就证明该数据不存在。
做这个项目的时间花的太长,还是不够熟悉面线对象。看到项目,心里没有计划好框架,功能都是一个个写出来的,最后才拼接上。有很多细节也是一开始没有想到的。这应该是不熟手的原因。不过相比于之前,也算是有进步了。