你说不行的代码段,关键在这:(简称为代码①)
Student stu[] = new Student[5];
Admin a = new Admin();
a.wyx(stu);
以及调用的时候:(简称为代码②)
public void wyx(Student stu[])
{
Scanner in = new Scanner(System.in);
String name = in.nextLine();
stu[0].setName(name);
System.out.println(stu[0].getName());
}
而后面你说可以的方法是这样的(简称为代码③)
public void wyx(Student stu[])
{
Scanner in = new Scanner(System.in);
String name = in.nextLine();
Student stud = new Student();
stud.setName(name);
stu[0] = stud;
System.out.println(stu[0].getName());
}
为什么不可以?这里你首先要清楚你在wyx方法里用到的形参是一个Student对象的数组,在代码②中,你直接使用stu[0].setName(name);,那么要想取得它的前提就是你的下标0有存在的对象,也就是你必须在你代码①里给你的stu 对象的0下标赋值,也就是:
stu[0] = new Student();
否则你只是给数组开辟了大小,但并未在相应的位置给定实例化的对象,那么你在代码段②里直接引用是引用到空指针上的,并不存在对象。恰好你在代码①中就只是使用了
Student stu[] = new Student[5];
并没有对数组里的做对象的初始化,所有你这个代码运行时会出错。
代码段③里,就恰恰符合上面所说,你创建一个新的对象:
Student stud = new Student();
再给它赋值了name,最后把这个对象给了stu数组对象的0下标
stu[0] = stud;
这样你的stu[0]具有正确的对象引用,你在后面的输出中调用它就正常了。
如果说你要前面方法可用,改为下面方式:
public class 类对类的操作 {
public static void main(String[] args)
{
Student stu[] = new Student[5];stu[0] = new Student(); -- 这里创建一个新的Student实例,并让stu[0]引用,只是根据你后面方法只引用了stu[0]
Admin a = new Admin();
a.wyx(stu);
}
}
另外有一些简单的建议:
你的代码段里对数组的写法使用的是Student stu[],那么比较建议的写法是Student[] stu;
如果你真的要传递Student stu[] = new Student[5];,那么有两种建议:
① 你给你的数组对象先实例化好,可以用循环,如果没学到循环,可以一个一个创建;
② 如果不想在创建时候就实例化,那么也可以在使用的时候进行判断,判断如果是空引用,不包含对象再进行实例化,关键代码如下:
if (null == stu[0]) {
stu[0] = new Student();
}
因为你的Student[5]并没初始化5个student对象,只是创建了一个可以容纳5个student对象的数组