我在同一个项目中有2个班级(Date
和Student
)。我需要测试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));
}
}
答案 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
类
答案 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()方法中调用。