java类中用类的数组作为函数参数传给类,为什么不能直接对类的数组进行操作?

classStudent{privateStringname;publicvoidsetName(Stringname){this.name=name;}publicSt... class Student{
private String name;
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
}
class Admin{
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 class 类对类的操作 {
public static void main(String[] args)
{
Student stu[] = new Student[5];
Admin a = new Admin();
a.wyx(stu);
}
}
这样做是不对的,我也不知道为什么。但是把Admin类中的操作改成下面这样就可以了:
class Admin{
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());
}
}
我想问问大神们为什么得借助另外一个类的变量才能达到我想完成的效果??
展开
 我来答
JulianDeep
2016-09-17 · TA获得超过155个赞
知道小有建树答主
回答量:201
采纳率:100%
帮助的人:201万
展开全部

你说不行的代码段,关键在这:(简称为代码①)

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);
}
}


另外有一些简单的建议:

  1. 你的代码段里对数组的写法使用的是Student stu[],那么比较建议的写法是Student[] stu;

  2. 如果你真的要传递Student stu[] = new Student[5];,那么有两种建议:

     ① 你给你的数组对象先实例化好,可以用循环,如果没学到循环,可以一个一个创建;

     ② 如果不想在创建时候就实例化,那么也可以在使用的时候进行判断,判断如果是空引用,不包含对象再进行实例化,关键代码如下:

    if (null == stu[0]) {

        stu[0] = new Student();

    }

一别永别
推荐于2018-05-15 · TA获得超过130个赞
知道小有建树答主
回答量:164
采纳率:0%
帮助的人:129万
展开全部
因为你的Student[5]并没初始化5个student对象,只是创建了一个可以容纳5个student对象的数组
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式