Может ли конструктор в Java наследуемых классах быть пустым
У меня 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));
}
}
4 ответа
Когда вы расширяете некоторый класс, вы обязаны вызывать 1 из конструкторов этого класса, используя 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
учебный класс
Что касается конструктора Date(), я думаю, что вам нужно добавить конструктор no-arg в класс Date, так как он будет вызываться неявно при вызове конструктора ученика no-arg или по умолчанию.
В случае вызова метода oldGender(Student[]stds) не может быть другого способа, кроме как сделать его "статическим" для вызова в методе main().
Я думаю, что у вас проблема XY. Вы в конечном итоге хотите позвонить oldGender
но не могу, потому что oldGender
не является статичным, поэтому вы пытаетесь создать Student
экземпляр, но терпит неудачу, потому что у него нет конструктора.
Из того, что я вижу, oldGender
на самом деле не нужны никакие данные из this
так что это может быть просто записано как static
метод, так же, как вы сделали с Date.after
, Просто сделай это статичным! И вы сможете назвать это как
Student.oldGender(...)
Обратите внимание, что Student
простирающийся Date
не имеет смысла для меня. Студент это не свидание. Я думаю, вы должны переосмыслить это.
Я добавил добавил Date
поле в Student
называется 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));
}
}
Implicit super constructor Date() is undefined. Must explicitly invoke another constructor
В вашем классе дат конструктор без аргументов не написан явно.
Конструктор по умолчанию без аргумента (или) будет сгенерирован, если в классе нет другого конструктора