Может ли конструктор в классах, унаследованных от Java, быть пустым

У меня есть 2 класса (Date и Student) в одном проекте. Мне нужно протестировать класс Student, но я не могу вызвать метод экземпляра в статическом методе. Я попытался создать ссылку на экземпляр, добавив Student a = new Student() в public static void main(String[]args), но для этого нужно создать конструктор public Student(). Однако это приводит к следующей ошибке:

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

Я смогу решить проблему, если поменяю метод экземпляра на статический. Но мне было интересно, есть ли другой способ вызвать метод экземпляра в основном методе?

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));
}

}

Это безумие, что Студент все равно унаследует от Date но, почему вы изначально пытались сделать Student a = new Student()?

Scary Wombat 02.05.2018 07:40

Кстати, компилятор говорит вам ответ на ваш вопрос -нет

Scary Wombat 02.05.2018 07:41

@ScaryWombat Разве Student a = new Student(), за которым следует a.oldGender, не единственный способ создать ссылку на экземпляр в статическом методе?

user8855615 02.05.2018 07:46

Нет, измените метод на public static boolean oldGender(Student[]stds)

Scary Wombat 02.05.2018 07:49

Я знал студента, где все числа, но теперь есть еще даты! Вероятно, вы не захотите расширять Date, но добавите переменную Date в класс Student. Или это не имеет смысла.

AxelH 02.05.2018 08:02

@AxelH Можно ли вызывать методы и конструктор в классе Date в классе Student без использования наследования?

user8855615 02.05.2018 08:18

Вы можете Date date = new Date(x,y,z), а затем использовать методы с экземпляром date .. Date.after - это static, поэтому вам даже не нужен экземпляр. На данный момент у вас есть некоторые проблемы с пониманием ООП, на них, к сожалению, невозможно ответить, потому что это станет книгой ...

AxelH 02.05.2018 08:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
59
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

The No-argument (or) default constructor will be generated if there is no other constructor is present in a class

Ответ принят как подходящий

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

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

}

Мое поле даты должно быть под классом даты без выбора. Пытаемся теперь найти выход для вызова этого поля в этом классе без использования наследования.

user8855615 02.05.2018 09:02

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

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

Другие вопросы по теме