Конструктор подкласса - PullRequest
3 голосов
/ 15 марта 2012

Я создал суперкласс (Персона) и подкласс (Студент)

public class Person{
private String name;
private Date birthdate;
//0-arg constructor
public Person() {
    birthdate = new Date("January", 1, 1000);
    name = "unknown name";
}
//2-arg constructor
public Person(String newName, Date newBirthdate){
    this.name = newName;
    this.birthdate = newBirthdate;
}

//Subclass
public class Student extends Person{

    public Student(){
        super(name, birthdate)
}

Я получаю сообщение об ошибке: cannor ссылается на имя и дату рождения до того, как был вызван супертип-коктруктор. Я попробовал:

public Student(){
    super()
}

но мой тестер говорит, что я должен использовать super(name, birthdate);

Ответы [ 4 ]

4 голосов
/ 15 марта 2012

Если ваш конструктор по умолчанию для Student должен использовать конструктор с двумя аргументами Person, вам придется определить свой подкласс следующим образом:

public class Student extends Person{

    public Student() {
        super("unknown name", "new Date("January", 1, 1000));
    }

    public Student(String name, Date birthdate) {
        super(name, birthdate);
    }
}

Обратите внимание, что Person.name и Person.birthdate не видны в подклассах, поскольку они объявлены private.

1 голос
/ 15 сентября 2012

Похоже, здесь есть несколько заблуждений:

Когда вы создаете Student, не существует отдельного объекта Person - есть просто Student, который имеет все свойстваPerson.

Конструктор - это то, что создает Студента, поэтому внутри конструктора нет другого Студента / Человека, на поля которого вы могли бы ссылаться.Как только вы вызываете super, вы инициализируете часть Person объекта, и поля из Person становятся доступными, но, поскольку это новый объект, они не могут быть установлены на что-либо, если вы не сделаете это вконструктор.

Возможны следующие варианты:

1) использовать значения по умолчанию, установленные в Person:

public Student() {
   super(); // this line can be omitted as it's done by default
}

2) Принимать значения в качестве параметров ипередать их конструктору Person:

public Student(String newName, Date newBirthdate) {
    super(newName, newBirthdate);
}

3) Указать новые значения по умолчанию:

public Student() {
    super("Bob", new Date("January", 1, 1990));
}
1 голос
/ 15 марта 2012

Вам нужно будет создать конструктор Student, который принимает имя и день рождения в качестве параметров.

Приведенный вами пример не будет работать, если не будет создан экземпляр Student.

0 голосов
/ 15 марта 2012

Вам нужно как-то получить имя и параметры даты рождения для студента. Как насчет:

public Student(String name, Date birthdate){
    super(name, birthdate)
}

Вы также можете сделать:

public Student(){
    super("unknown name", new Date("January", 1, 1000));
}
...