#java #constructor #subclass
#java #конструктор #подкласс
Вопрос:
Вот назначение:
Разработайте и реализуйте класс, представляющий Person, вместе с 3 подклассами, используя следующие рекомендации:
a. Создайте класс с именем Person и его три подкласса с именами Employee, Student, Retired .
б. У человека есть следующие поля данных: имя, год_о_рождения, isStudying и isEmployed. В нем также есть методы для установки и получения значений каждого из полей, а также метод для вычисления текущего возраста и отображения статуса человека. Конструктор, который устанавливает для полей isStudying и isEmployed значение false, также включен в класс Person . Вы можете добавить дополнительные поля данных и методы, если хотите.
1. Наконец, создайте тестовый класс Java, который имитирует использование вашего класса Person. В вашем тестовом классе вы должны как минимум: а) создать 4 экземпляра Person, б) напечатать имена ваших экземпляров, в) распечатать статус ваших экземпляров на основе значений их атрибутов age, isStudying и isEmployed.
public class Person2 {//begin class
//declare variables
String name;
int year_of_birth;
boolean isStudying;
boolean isEmployed;
int age;
public Person2(String name, int year_of_birth, boolean isEmployed, boolean isStudying, int age){//begin constructor
this.name = name;
this.year_of_birth = year_of_birth;
this.isEmployed = false;
this.isStudying = false;
this.age = age;
}//end constructor
public int getYear(){//get year method
return year_of_birth;
}//end method
public String getName(){//get name method
return name;
}//end method
public boolean getEmployed(){//get employed method
return isEmployed;
}//end method
public boolean getStudying(){//get employed method
return isStudying;
}//end method
public int getAge(){//get year method
age = 2014 - year_of_birth;
return age;
}//end method
public void setName(String name){//set name method
this.name = name;
}//end method
public void setYear (int year){//set year method
this.year_of_birth = year;
}//end method
public void setEmployed(boolean employed){//set employed method
this.isEmployed = employed;
}//end method
public void setAge (int age){//set year method
this.age = age;
}//end method
public static void main(String[] args) {
// TODO code application logic here
}
}
class Student extends Person2 {//begin class
public Student(String name, int year_of_birth, boolean isEmployed, boolean isStudying, int age){//begin constructor
this.name = name;
this.year_of_birth = year_of_birth;
this.isEmployed = isEmployed;
this.isStudying = isStudying;
this.age = age;
}//end constructor)
@Override
public int getYear(){//get year method
return year_of_birth;
}//end method
@Override
public String getName(){//get name method
return name;
}//end method
@Override
public boolean getEmployed(){//get employed method
return isEmployed = false;
}//end method
@Override
public boolean getStudying(){//get employed method
return isStudying = true;
}//end method
@Override
public int getAge(){//get year method
age = 2014 - year_of_birth;
if (age > 30){
System.out.println("Person is not a student");
}
return age;
}//end method
}
Этот код, очевидно, не завершен, я зацикливаюсь на этой ошибке конструктора. В нем говорится, что «фактические и формальные аргументы отличаются по длине».
Комментарии:
1. можете ли вы опубликовать, где вы получаете ошибку? Также вы, похоже, не вызываете конструктор суперкласса в Student?
Ответ №1:
Ваша проблема в том, что вы не вызываете суперконструктор Person2
. Ваш конструктор в Student
пытается вызвать конструктор по умолчанию (без аргументов) Person2
, который не существует.
У вас есть только один конструктор Person2
, и вы должны вызвать этот конструктор из конструктора Student
:
public Student(String name, int year_of_birth, boolean isEmployed, boolean isStudying, int age) {
super(name, year_of_birth, isEmployed, isStudying, age);
}
Это также означает, что вам не нужно повторять весь этот код инициализации дважды.
Вы также не должны повторять все методы, Student
которые находятся внутри Person2
. Если вы их удалите, Student
они все равно унаследуют их. В этом весь смысл расширения класса в первую очередь. Вы должны переопределять подобный метод только в том случае, если вам не нужно унаследованное поведение, но вместо этого требуется какое Student
-то конкретное поведение.
Комментарии:
1. и по умолчанию Java пытается вызвать (несуществующий) конструктор без параметров
2. Смотрите мою правку о вашем коде в целом. Можете ли вы принять ответ, если он правильный?
Ответ №2:
При расширении любой функциональности вы должны попытаться использовать эту функциональность…
Ваш class Student extends Person2
, но использует ли он что-нибудь из Person2
?
Почему вы переопределяете все методы и предоставляете идентичную функциональность в своем подклассе???
Комментарии:
1. Мы работаем над переопределением на этой неделе в классе. Из видео в классе говорится, что вам нужно сделать это при использовании модулей в подклассе.
2. Посмотрите видео еще раз — любая непубличная функциональность из суперкласса доступна в подклассе. Вам нужно переопределить ее только в том случае, если вы меняете поведение.