2012-03-15 1 views
3

Я создал суперкласс (Person) & подкласс (Student)Подкласс конструктор

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 & даты рождения, прежде чем супертип cosntructor была вызвана. Я пробовал:

public Student(){ 
    super() 
} 

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

ответ

1

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

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

4

Если конструктор по умолчанию для 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.

+0

У меня уже есть конструктор параметров 2. Дело в том, что я должен использовать супер (имя, дата рождения) в конструкторе 0-param – user1200325

+0

@ user1200325 - Я пересмотрел свой ответ –

0

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

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

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

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

@Jochen - copy-paste - корень всего зла :) – MByD

+0

У меня уже есть параметр 2 конструктор. Дело в том, что я должен использовать super (name, birthdate) в конструкторе 0-param – user1200325

+0

См. Edit. – MByD

1

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

При создании Student, существует не отдельный Person object-- есть только 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)); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^