1

我在同一个项目中有 2 个类(Date和)。Student我需要测试Student该类,但无法在静态方法中调用实例方法。我尝试通过添加Student a = new Student()under来创建对实例的引用public static void main(String[]args),但这需要public Student()创建一个构造函数。但是,这会导致以下错误:

隐式超级构造函数 Date() 未定义。必须显式调用另一个构造函数

如果我将实例方法更改为静态方法,我就能解决问题。但是想知道是否有其他方法可以在主方法中调用实例方法?

Date班级:

public class Date {

int day;
int month;
int year;

public Date(int day, int month, int year) {
    this.day=day;
    this.month=month;
    this.year=year;
}

public boolean equals(Date d) {
    if(d.day==this.day&&d.month==this.month&&d.year==this.year)
    {
        return true;
    }
    else
    {
        return false;
    }
}

public static boolean after(Date d1, Date d2) {
    if(d1.day>d2.day&&d1.month>d2.month&&d1.year>d2.year)
    {
        return true;
    }
    else
    {
        return false;
    }
}

}

Student班级:

public class Student extends Date{

public String name;
public boolean gender;

public Student(String name, boolean gender, int day, int month, int year) {
    super(day, month, year);
    this.name=name;
    this.gender=gender;
}

public Student() {

}

public boolean equals(Student s) {
    Date d=new Date(s.day,s.month,s.year);
    if(s.name==this.name&&s.gender==this.gender&&equals(d)==true)
    {
        return true;
    }
    else
    {
        return false;
    }
}

public boolean oldGender(Student[]stds) {
    Student old=stds[0];
    Date oldDate = new Date(old.day,old.month,old.year);
    for(int i=0;i<stds.length;i++)
    {
        Date d = new Date(stds[i].day,stds[i].month,stds[i].year);
        if(after(oldDate,d)==false)
        {
            old=stds[i];
        }
    }
    return old.gender;
}

public static void main(String[]args) {
    Student s1=new Student("Jemima",true,2,3,1994);
    Student s2=new Student("Theo",false,30,5,1994);
    Student s3=new Student("Joanna",true,2,8,1995);
    Student s4=new Student("Jonmo",false,24,8,1995);
    Student s5=new Student("Qianhui",true,25,12,1994);
    Student s6=new Student("Asaph",false,2,1,1995);
    Student[]stds= {s1,s2,s3,s4,s5,s6};
    Student a = new Student();
    System.out.println(oldGender(stds));
}

}
4

4 回答 4

0

当您扩展某个类时,您有义务使用super(args)构造调用该类的构造函数之一。新创建的类的构造函数可以是任何你喜欢的。

当扩展类没有 args 构造函数时,可以在扩展类中省略构造函数定义。这听起来像是一个例外,但实际上并非如此。编译器会为您即时添加空构造函数。

另一方面,当您显式定义空构造函数时(就像您所做的那样),您有义务在其中调用超类构造函数。

这正是错误所说的。

public Student() { 
//Here you need to call super(int day, int month, int year); as   Date(int day, int month, int year) 
}

或 delcare 类中没有 args 构造Date函数

于 2018-05-02T05:49:39.690 回答
0

我认为您遇到了 XY 问题。您最终想要调用oldGender但不能调用,因为oldGender它是非静态的,因此您尝试创建一个Student实例,但由于它没有构造函数而失败。

从我所见,oldGender实际上并不需要来自 的任何数据this,因此可以将其编写为一种static方法,就像您对Date.after. 只是让它静态!你可以这样称呼它

Student.oldGender(...)

请注意,Student扩展Date对我来说毫无意义。学生不是一种约会对象。我认为你应该重新考虑这一点。

我在called中添加了一个Date字段。我认为这可能是您尝试做但没有做的事情:Studentd

class Date {

    int day;
    int month;
    int year;

    public Date(int day, int month, int year) {
        this.day=day;
        this.month=month;
        this.year=year;
    }

    public boolean equals(Date d) {
        return d.day == this.day && d.month == this.month && d.year == this.year;
    }

    public static boolean after(Date d1, Date d2) {
        return d1.day > d2.day && d1.month > d2.month && d1.year > d2.year;
    }

}

class Student{

    Date d;
    String name;
    boolean gender;

    public Student(String name, boolean gender, int day, int month, int year) {
        this.d = new Date(day, month, year);
        this.name=name;
        this.gender=gender;
    }

    public boolean equals(Student s) {
        return s.name == this.name && s.gender == this.gender && this.d.equals(s.d);
    }

    public static boolean oldGender(Student[]stds) {
        Student old=stds[0];
        for (Student std : stds) {
            if (!after(old.d, std.d)) {
                old = std;
            }
        }
        return old.gender;
    }

    public static void main(String[]args) {
        Student s1=new Student("Jemima",true,2,3,1994);
        Student s2=new Student("Theo",false,30,5,1994);
        Student s3=new Student("Joanna",true,2,8,1995);
        Student s4=new Student("Jonmo",false,24,8,1995);
        Student s5=new Student("Qianhui",true,25,12,1994);
        Student s6=new Student("Asaph",false,2,1,1995);
        Student[]stds= {s1,s2,s3,s4,s5,s6};
        System.out.println(oldGender(stds));
    }

}
于 2018-05-02T06:03:06.537 回答
0

就 Date() 构造函数而言,我认为您需要在 Date 类中添加无参数构造函数,因为它会在调用无参数或默认 Student 构造函数时被隐式调用。

在调用“oldGender(Student[]stds)”方法的情况下,除了在 main() 方法中将其设置为“静态”之外,可能别无他法。

于 2018-05-02T06:08:00.920 回答
-1
Implicit super constructor Date() is undefined. Must explicitly invoke another constructor

在您的 Date 类中,没有显式编写无参数构造函数。

如果类中不存在其他构造函数,则将生成无参数(或)默认构造函数

于 2018-05-02T05:49:22.127 回答