求教如何用for循环实例一堆对象

我想写一个商店商品录入,先自定义一个Goods类,添加了各种商品属性作为成员变量,以及用来赋值的构造方法。  

接着在shopmanagemet这个类中的main方法里边建立了一个Goods类数组,数量未知,就指向了null,再建一个for循环,for循环条件是(;;)目的是为了无限循环,for循环的目的是通过不断地实例化Goods类创建对象。保存录入的商品属性。因为不知道最后自己要录入多少个商品,就在for循环里设置了一个if条件语句,当输入N则break跳出循环,也就停止了录入。    

问题来了,怎么样实例化,我实例化出来的总是说空指针,老报错,两天了解决不了、  

求教编写个用for循环实例化某个类,创建一堆对象的例子,使用for方法,不出错


回复讨论(解决方案)

别用数组,用ArrayList就可以,记得不要指向null。


   for(int i=0;i<100;i++){
      Good g=new Good();
}


   for(int i=0;i<100;i++){
      Good g=new Good();
}



那么有一个问题,每个对象名都是g,那么怎么在后续添加查询的时候区分,那不就歧义重复,也用不了,这个方法不对

建议使用ArrayLIst集合,这样可以解决数量问题,并且方便。
ArrayList<Goods> goodsList  = new ArrayList<Goods>();
for(;;){
Goods g = new Goods();
goodsList.add(g);
}



   for(int i=0;i<100;i++){
      Good g=new Good();
}

 


那么有一个问题,每个对象名都是g,那么怎么在后续添加查询的时候区分,那不就歧义重复,也用不了,这个方法不对

你了解一下集合就很好弄了,数组是固定长度,不适合做这些,要么你可以定义数组长度特别大,也可以弄,但是不建议

Good g[] = new Good[1000];
for(int i=0; i<1000; i++){
      g[i] = new Good[];
}

能否贴出你的代码一观

1.建立一个商品的实体类,里面包含你要的属性
2.建立一个类,声明一个map
3.声明一个变量i用来计数
4.循环往map里面put对象 key为goods+i,value为new goods()
5.结束

维护很方便,用goods加对应的编号就可以取出对应的对象。不懂可以继续问。

   for(int i=0;i<100;i++){
      Good g=new Good();
}



你这个是无意义的,你看看定义的变量是局部的,出了循环就没什么作用了,你在循环外也用不了

你目前要了解的一点是,数组长度是死的,而且你必须定,不存在什么后面来定,不先确定长度,怎么知道给你分配多大的内存空间?就无法更改大小了。所以你想不停的录入就不行。
你空指针的原因是
明确一点,引用类型的数组存的是引用:
比如 Goods[] array = new Goods[100];----------这句话并不是生成了100个goods对象,而是生产了100个Goods的引用,只是名字是这样的,第一个引用叫array[0],array[1]....aryyay[99],这样来访问的。
PS:你定义了一个数组,那么它就不再是Goods类了,而是Goods[]类。将数组理解成一个新的类。只是它的属性是Goods类型,所以你才能对数组这样引用而你给它的对象却是Goods,那么当然无法引用上去,你只能参考一个匹配的类型,比如给个数组让他引用才行。

不知道你学到集合没有,集合就是封装后的数组,实现了动态增加减少的效果,当然里面所谓动态本质也就是换上一个新数组,然后把变动后的数组给它,丢弃以前的。如果没学到集合,那么你现在能实现的就是给数组定一个固定的长度,然后每次循环的时候新建一个对象给它。具体来说实现大概就是这个意思:

Goods[] wares = new Goods[100];---------定义了100个goods类的引用
for(int i = 0;i < wares.length;i ++){---------------这样写的好处在于,数组内容增长,不会替换前面的,而且有了长度确定不会出现数组下标越界而报错
   会用构造函数,你可以用变量单独定义再填入数据,这样可以要求输入。这里我就假设你的Goods类只有一个字符串类型的name
    System.ou.println('请输入商品的名字:')
   String name = 输入(就Scanner的那个);

     wares[i] = new Goods(name);
   是否再次输入提示,要继续就不做操作,不继续输入的内容就break跳出循环
}


来源:itnose

上一篇: Java数据类型(2)自动封装拆箱

下一篇: 计算机程序的思维逻辑 (90) - 正则表达式 (下 - 剖析常见表达式)

分享到: 更多