实际和正式的参数列表的长度不同

时间:2014-02-06 22:34:42

标签: java

我正在为UCSDStudent制作一个构造函数,我发现我的构造函数没有问题。 请指出一些具体问题并帮助我做出自己的解决方案!

    class UCSDStudent extends Base {
    private String name;
    private long Studentnum;

    public UCSDStudent (String name, long number) {
        UCSDStudent s = new UCSDStudent();
        s.setName(name);
        s.setStudentNum(number);
    }

    public void setName(String setName) {
        name = setName;
    }
    public void setStudentNum(long setStudentNum){
        Studentnum = setStudentNum;
    }

    public String getName () {
        return this.name;
    }

    public long getStudentNum () {
        return this.Studentnum;
    }

    ....... // some more code, but I will put the instantiation in the main func.

    // create Student and place in symbol table
    if(!symtab.insert (
    new UCSDStudent (buffer, number), 1)){
    System.out.println("Couldn't insert " + "student!!!"); 
    }

    ......

    UCSDStudent stu = new UCSDStudent (buffer, 0);

这是基类。

public abstract class Base {

    public String getName () {              // identifier function

            return null;
    }               
}

2 个答案:

答案 0 :(得分:2)

声明

public UCSDStudent (String name, long number) {
        UCSDStudent s = new UCSDStudent();
        s.setName(name);
        s.setStudentNum(number);
}

应改为

public UCSDStudent(String name, long number) {
        this.setName(name);
        this.setStudentNum(number);
}

没有理由在类构造函数中创建新的UCSDStudent对象。在执行构造函数之后它实际上会丢失,并且永远不会保存传递给构造函数的值。

此外,您应该考虑Base超类。如果它需要任何初始化,你应该从UCSDStudent构造函数的第一行调用它的构造函数。

答案 1 :(得分:1)

public UCSDStudent (String name, long number)
{
    UCSDStudent s = new UCSDStudent();
    s.setName(name);
    s.setStudentNum(number);
}

此代码无法编译,因为您正在调用UCSDStudent的默认构造函数,但尚未定义。如果定义带参数的构造函数,则必须定义默认构造函数。