Java inherited 类 中的构造函数可以为空吗
Can constructor in Java inherited classes be empty
我在同一个项目中有 2 个 classes(Date
和 Student
)。我需要测试 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' 之外别无他法。
我在同一个项目中有 2 个 classes(Date
和 Student
)。我需要测试 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' 之外别无他法。