Может ли конструктор в унаследованных классах Java быть пустым - PullRequest
0 голосов
/ 02 мая 2018

У меня есть 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 ]

0 голосов
/ 02 мая 2018

Что касается конструктора Date (), я думаю, что вам нужно добавить конструктор no-arg в класс Date, поскольку он будет вызываться неявно при вызове конструктора Student без аргументов или по умолчанию.

В случае вызова метода oldGender (Student [] stds) не может быть другого способа, кроме как сделать его «статическим» для вызова в методе main ().

0 голосов
/ 02 мая 2018

Когда вы расширяете некоторый класс, вы обязаны вызывать 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 no args в Date классе

0 голосов
/ 02 мая 2018

Я думаю, у вас проблемы с 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));
    }

}
0 голосов
/ 02 мая 2018
Implicit super constructor Date() is undefined. Must explicitly invoke another constructor

В вашем классе дат конструктор без аргументов не написан явно.

Конструктор по умолчанию без аргумента (или) будет создан, если в классе нет другого конструктора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...