Java中的构造函数是否可以为空

时间:2018-05-02 05:37:24

标签: java inheritance constructor static-methods instance-methods

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

  

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

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

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 个答案:

答案 0 :(得分:0)

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

在Date类中,无参数构造函数未明确写入。

  

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

答案 1 :(得分:0)

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

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

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

这正是错误所说的。

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

Date

中的delcare no args构造函数

答案 2 :(得分:0)

我认为你有一个XY问题。你最终想要调用oldGender但不能因为oldGender是非静态的,所以你试图创建一个Student实例,但是因为它没有构造函数而失败。

从我所看到的情况来看,oldGender并不真正需要来自this的任何数据,所以它可以写成static方法,就像使用{{1}一样}}。让它静止!你可以把它称为

Date.after

请注意Student.oldGender(...) 延长Student对我没有意义。学生不是一种约会。我想你应该重新考虑一下。

我在Date中添加了一个名为Date的{​​{1}}字段。我想这可能是你想要做的但却没有:

Student

答案 3 :(得分:0)

就Date()构造函数而言,我认为你需要在Date类中添加no-arg构造函数,因为在调用no-arg或默认的Student构造函数时它将被隐式调用。

如果要打电话给'oldGender(学生[] stds)&#39;方法可能没有其他方法可以使它静止&#39;静态&#39;在main()方法中调用。