Java inherited 类 中的构造函数可以为空吗

Can constructor in Java inherited classes be empty

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

Implicit super constructor Date() is undefined. Must explicitly invoke another constructor

如果我把实例方法改成静态方法就可以解决问题。但是想知道是否有其他方法可以在main方法中调用实例方法?

Date class:

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 class:

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

}
Implicit super constructor Date() is undefined. Must explicitly invoke another constructor

在你的 Date Class 中,没有明确地写无参数构造函数。

The No-argument (or) default constructor will be generated if there is no other constructor is present in a class

当您扩展某些 class 时,您必须使用 super(args) 构造调用该 class 的构造函数之一。新创建的 class 的构造函数可以是任何你喜欢的。

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

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

这正是错误所说的。

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

或在 Date class

中删除无参数构造函数

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

据我所知,oldGender 并不真正需要来自 this 的任何数据,因此它可以写成 static 方法,就像您对 Date.after。只是让它静态!你可以这样称呼它

Student.oldGender(...)

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

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

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

}

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

在调用 'oldGender(Student[]stds)' 方法的情况下,除了在 main() 方法中调用它 'static' 之外别无他法。