第一类:
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();
//下面省略了.................................
前面的数组学得还可以。不过到了这里真的懵了。好了,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;
我说了上面其实两种方法就是一种。是给数组的每个元素,也就是对象实例化上
非常非常感谢
追答呵呵。没事,刚学对象数组是会比较郁闷 的。
建议你多打断点。。多用输出语句。把各种结果输出出来对比就会清楚些
为什么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个元素了
不是很明白你后面说什么啊,谢谢你,那我再想问下,这个数组的长度是怎么算的?定义长度为5,那是不是就是2*5,可以放10个元素了
追答第一、不客气,限于我文字表达能力不够好,没让楼主理解其意,没帮上忙,不用谢了;
第二、定义一个长度为5的数组,为什么会是2*5=10个元素呢?楼主先说下自己的理解吧,大家一起来探讨探讨。。。 。。。
数组不是有两个属性变量吗,不要分开来存储吗?真的不是很明白对象数组是怎么输入和存储的。还有是不是每循环输入一次都要实例化一次?