帮我解释下面java的代码!求解释下第二个类的数组是怎样的?就是调用了第一个类作为了数组!这样数组怎么写

第一类:
public class Customer {

String custNo;
int custScore;
}
第二个类:
import java.util.*;
public class CustManager {
Customer[] custs=new Customer[3];

public void initial(){
Scanner input=new Scanner(System.in);
for(int i=0;i<custs.length;i++)
{
Customer cust=new Customer();
System.out.println("请输入第"+(i+1)+"个会员编号:");
cust.custNo=input.next();
System.out.println("请输入第"+(i+1)+"个会员积分:");
cust.custScore=input.nextInt();
custs[i]=cust;
}
}
//下面有些方法省略了..................................

最后是测试类:
import java.util.*;
public class CustomerTest {
public static void main(String[]args){
Scanner input=new Scanner(System.in);
CustManager manager=new CustManager();
manager.initial();
manager.show();
System.out.println("请输入你要查询的会员编号:");
String custNo=input.next();
//下面省略了.................................

呵呵,知道楼主想问什么了。

其实这个就是对象数组的问题。

首先我先提个问题。不知道楼主数组学得怎么样??
其实我想说的是对象数组和之前的数组一样样的。只不过,之前的数组是基本数据类型。
在这里数组的元素是对象。。。。。记住是对象。它具有对象所有的特性。

好了下面我用注释的方法来分析代码
//遍历对象数组,从控制台初始化对象数组
for(int i=0;i<custs.length;i++)
{
//创建一个新对象。并赋值
Customer cust=new Customer();
System.out.println("请输入第"+(i+1)+"个会员编号:");
cust.custNo=input.next();
System.out.println("请输入第"+(i+1)+"个会员积分:");
cust.custScore=input.nextInt();
//并这个对象的地址的引用树赋值给相应的对象数组,这时对应下标的数组下面的这个对象就有了栈和堆中的地址
custs[i]=cust;
}
关键就是怎么去理解对象数组,这个概念。

再总结下,对象数组就是数组中的一种,和基本数据类型的数组没有差异。只是它现在的每个元素是一个对象。
它在操作数据的时候需要实例 化//这是很多初学者的通病,不会去new。当然这里不需要。。因为它把整个对象赋值给了
它可以通过.操作,.属性和.方法。
custs[i]。。。此时就是一个对象。

希望楼主好好理解下追问

前面的数组学得还可以。不过到了这里真的懵了。好了,custs[i]=cust;这样赋值,不会乱吗?它是怎样把那两个属性分开了存储和

追答

这里要讲的话要提到堆了。对象在实例化的时候,会在根据属性开辟连接的空间。每个属性都会有自己的空间,是不会乱的。

这也是为什么类在实例化后,属性会有初始值,而局部变量必须赋值才能使用。
为了让楼主更好的明白,我这边换一种写法
在for中代码如下,不需要通过另一个对象
custs[i]=new Customer();
System.out.println("请输入第"+(i+1)+"个会员编号:");
custs[i]=.custNo=input.next();
System.out.println("请输入第"+(i+1)+"个会员积分:");
custs[i]=.custScore=input.nextInt();

楼主可以试着对比一下

追问

谢谢,那我再想问下,这个数组的长度是怎么算的?定义长度为5,那是不是就是2*5,可以放10个元素了

追答

这个数组只开辟五个连续的空间,这五个空间存储的是对象的引用,也就是对象的地址。。
注意这里存储的是指向对象的地址。。所以数组的长度还是5.
每个对象有N个属性。这N个属性是在堆中另外开辟出来的空间。

总结一下,数组的长度是根据实例化的时候决定的。
int [] nums=nw int[长度];
这个长度决定 数组长度,而且只要创建好的数组,长度是不可变的。
对象数组比较特殊的是,每个元素存储的都是指向堆中对象的地址。注意是地址。。。。。

希望楼主好好体会一下
要不你就把System.out.println(custs[i]);输出出来,你就会看到,它是一个十六进制的地址

追问

是不是每循环输入一次都要实例化一次?

追答

是的。建议楼主你这样试,你就会明白了,直接输出数据
for(int i=0;i<custs.length;i++){
System.out.println(custs[i]);
}
此时你会发现都是为null。显示,因为没有实例化。所以你在要操作的时候必须要给对象实例化。
如果不实例化的话,相当 于对null操作。会报空指向异常的nullPointException;

我说了上面其实两种方法就是一种。是给数组的每个元素,也就是对象实例化上

追问

非常非常感谢

追答

呵呵。没事,刚学对象数组是会比较郁闷 的。
建议你多打断点。。多用输出语句。把各种结果输出出来对比就会清楚些

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-22
Customer[] custs=new Customer[3];
custs这个数组中,每个元素都是一个Customer类的对象,这个数组的长度为3 ,也就是custs里面装了3个Customer类的对象,每个对象包含 custNo 和 custScore两个属性。追问

为什么custNo 和 custScore这两个属性在输入和输出时不会乱呢,它是怎存储的。可以跟我说下这种数组的语法或者说是用法吗

追答

Customer cust=new Customer();//实例化Customer
System.out.println("请输入第"+(i+1)+"个会员编号:");
cust.custNo=input.next();//为custNo赋值
System.out.println("请输入第"+(i+1)+"个会员积分:");
cust.custScore=input.nextInt();//为custScore赋值
custs[i]=cust;//把cust作为custs数组的第i个元素存储
上面是分别为两个属性赋值的,怎么会乱呢?输出也是一样的道理,至于内存是怎么操作的,个人水平有限,没法解释。。。
这和你接触的其他数组没啥区别,唯一区别就是类型是你自定义的。
对了,你可以把这个数组理解成二维数组,这样容易理解一些,把cust也理解为数组,里面存了两个元素,custNo,custScore

追问

谢谢,那我再想问下,这个数组的长度是怎么算的?定义长度为5,那是不是就是2*5,可以放10个元素了

第2个回答  2011-09-22
看了前面两位仁兄的解答,觉得已经很充分了。但是看了看楼主的陆续追问,感觉还是没太理解,那么兄弟我再简单的辅助说明下:
第一、普通数组(基本数据类型数组)。
无论任何数组,普通的也好、对象数组也好、一维数组也好,多维数组也罢,也可以看做是一种对象,或者一种类,他在内存中的存贮架构(自我架构)都是基本相同的。数组的名字和数组第一元素的标识(如:custs[0])都代表着此数组在内存中存储的首地址,即数组第一个元素的内容地址就是整个数组在内存中的首地址;再者,比较宏观的看,每个数组元素中的内从结构至少分三段(三个部分),第一段是此元素的内存地址号,第二段此元素的存储的数据(这里说的数据是广义的),第三段一般会存储些关于数据的辅助信息,比如说某个数组元素里存储的不是常量(如“abc”)而是变量s(如s="abc"),那么此段就会存储变量s的一些内存信息,如变量s的数据类型等等。
第二、对象数组。
其实对象数组的存储非常好理解,比方说此问题中的数据 custs[] ,每一个元素中即custs[0] 、custs[1] 、custs[2] 中存储的并不是对象cust的所有信息数据,而只是将具体对象的内存存储首地址存贮起来,当我们来调用数组元素的时候,如Customer t_cust = new Customer(); custs[1] = t_cust;这相当于内存指引和指针引用,就是将custs[1] 中Customer类在内存中实例化后的内存分配的首地址在原对象没有销毁的前提下又付给了t_cust,此时t_cust和custs[1]存储的都是某个Customer类实例对象的内存地址号,只要是你不去人工销毁custs[1]所指引的对象,或跳出custs[1]的生存域,那么对t_cust对象的任何改动都直接影响在custs[1存储对象的身上。你也如果看得仔细的话,肯定会问,那在custs[1] = t_cust之前的Customer t_cust = new Customer()刚刚new出来的t_cust实际原有的内存存储段及信息数据最后哪里去了呢?答案是:被JVM内存自动回收机制给释放了。
以上两点结合起来即可解决楼主的相关疑问。追问

不是很明白你后面说什么啊,谢谢你,那我再想问下,这个数组的长度是怎么算的?定义长度为5,那是不是就是2*5,可以放10个元素了

追答

第一、不客气,限于我文字表达能力不够好,没让楼主理解其意,没帮上忙,不用谢了;
第二、定义一个长度为5的数组,为什么会是2*5=10个元素呢?楼主先说下自己的理解吧,大家一起来探讨探讨。。。 。。。

追问

数组不是有两个属性变量吗,不要分开来存储吗?真的不是很明白对象数组是怎么输入和存储的。还有是不是每循环输入一次都要实例化一次?

第3个回答  2011-09-23
List<String>

泛性(j2SE 5.0的新特性)

for (String arg :args)
{
list.add(arg.trim());
}

增强后的for循环(j2SE 5.0的新特性)

主要作用简化了之前的for循环:
相当与 (这个你看得懂吧)
for(int i=0;i<args.length;i++){
list.add(args[i]);
}

格式: for(类型 参数名 : 数组或集合类)
类型必需与数组或集合类的类型相同,
参数的值是动态的,所有数组或集合类的每一个值。

你可以实验一下:(就懂了)
一。数组:
int[] num = ;
for(int arg:num){
System.out.println(arg);
}

二。集合类:
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
for(String arg: list){
System.out.println(arg);
}