В вашей реализации есть какая-то ошибка:
- Объект
Student
не должен иметь полей static
. static
означает, что они относятся не к указанному c объекту, а к самому классу.
Объект является конкретной c реализацией класса. Вы определяете класс Student
, чтобы определить, как выглядит ученик, с указанием c, который вы создаете.
Когда вы объявляете класс, вы говорите, что у ученика обычно есть имя, пол и возраст.
Когда вы истанчиваете ученика с помощью конструктора (new Student("Sam", "Male", 13)
), вы определяете конкретную реализацию c.
class Student {
public String name;
public String gender;
public int age;
//setting default values for the member variables
public Student(){
name = "default name";
gender = "default gender";
age = 0;
}
//constructor of the parameters for the name, gender, and age.
public Student(String name, String gender, int age){
this.name = name;
this.gender = gender;
this.age = age;
}
Класс
Male
и
Female
должны быть изменены. Нет ничего плохого в том, чтобы расширить класс
Student
, чтобы установить значение по умолчанию для поля
gender
. Было бы более полезно расширить его, если, например, у класса
Male
есть определенное поле c (например,
favouriteSoccerPlayer
), которое вместо обычного ученика не должно быть. В этом случае класс
Male
унаследует поля от родительского класса (
Student
) и добавит еще одно дополнительное поле:
class Male extends Student {
private String favouriteSoccerPlayer;
public Male(String name, int age) {
super(name, "Male", age); // call the constructor of the super class
}
public Male(String name, int age, String favouriteSoccerPlayer) {
super(name, "Male", age); // call the constructor of the super class
this.favouriteSoccerPlayer = favouriteSoccerPlayer;
}
// getter and setter for only this field
}
, тогда вы можете, например, сделать что-то вроде этого:
Male male = new Male("John", 32, "Maradona");
System.out.println(male.getName());
и вы вызовете метод, который объект Male
наследует от Student
класса.