У меня есть 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));
}
}
Кстати, компилятор говорит вам ответ на ваш вопрос -нет
@ScaryWombat Разве Student a = new Student()
, за которым следует a.oldGender
, не единственный способ создать ссылку на экземпляр в статическом методе?
Нет, измените метод на public static boolean oldGender(Student[]stds)
Я знал студента, где все числа, но теперь есть еще даты! Вероятно, вы не захотите расширять Date
, но добавите переменную Date
в класс Student
. Или это не имеет смысла.
@AxelH Можно ли вызывать методы и конструктор в классе Date
в классе Student
без использования наследования?
Вы можете Date date = new Date(x,y,z)
, а затем использовать методы с экземпляром date
.. Date.after
- это static
, поэтому вам даже не нужен экземпляр. На данный момент у вас есть некоторые проблемы с пониманием ООП, на них, к сожалению, невозможно ответить, потому что это станет книгой ...
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));
}
}
Мое поле даты должно быть под классом даты без выбора. Пытаемся теперь найти выход для вызова этого поля в этом классе без использования наследования.
Что касается конструктора Date (), я думаю, вам нужно добавить конструктор no-arg в класс Date, поскольку он будет вызываться неявно при вызове конструктора no-arg или конструктора Student по умолчанию.
В случае вызова метода 'oldGender (Student [] stds)' не может быть другого способа, кроме как сделать его 'статическим' для вызова в методе main ().
Это безумие, что Студент все равно унаследует от Date но, почему вы изначально пытались сделать
Student a = new Student()
?