пытаясь вызвать метод суперкласса в подклассе - PullRequest
0 голосов
/ 19 ноября 2018

Наверное, довольно нубский вопрос, но я не могу понять. У меня есть класс Person для хранения имени, которое вводится с клавиатуры

public class Person {
    private String firstName;
    private String lastName;

    public Person()
    {
        firstName = "";
        lastName = "";
    }

    public Person(String first, String last)
    {
        setName(first, last);
    }

    public String toString()
    {
        return(firstName + " " + lastName);
    }

    public void setName(String first, String last)
    {
        firstName = first;
        lastName = last;
    }

    public String getFirstName()
    {
        return firstName;
    }

    public String getLastName()
    {
        return lastName;
    }
}

Я пытаюсь вызвать метод toString в подклассе Patient

public class Patient extends Person {
    private int patientID, patientAge;
    public Patient()
    {
       patientID = 0; //for a different part of the class that works
       patientAge = 0;
    }
    @Override
    public String toString()
    {
        return ("Patient Name: "+super.toString());
    }
}

Я не могу заставить его выводить имя в main, когда я вызываю метод toString из класса Patient, но когда я тестировал его, он выводит имя, когда я вызываю метод toString из класса Person. Вызов метода в main выглядит как Patient pnt = new Patient(); System.out.print(Pnt.toString()); распечатывает в консоли «Имя пациента:». Любые отзывы о том, что я делаю неправильно, или идеи о том, как заставить это работать

Ответы [ 5 ]

0 голосов
/ 19 ноября 2018

У вас нет конструктора для вашего подкласса PATIENT .Вы не устанавливаете firstName или lastName для любого пациента.Чтобы сохранить привычный конструктор, который вы использовали в родительском классе, используйте следующее:

public Patient() {
    super("default_firstName", "default_lastName");
    this.patientID = 0;
    this.patientAge = 0;
}
public Patient(String firstName, String lastName, int patientAge) {
    super(firstName, lastName);
    this.patientID = 0; //can be implemented some method for automatically setting numbers
    this.patientAge = patientAge;
}

Таким образом, вы всегда получаете firstName и lastName, даже если конструктор будет называться пустым.Согласно вашему методу toString , он корректен и вызывает метод суперкласса:

@Override
public String toString()
{
    return("Patient name is "+super.toString());
}

Но обратите внимание, что вы возвращаете значение STRING, чтобы сделать его видимым на экране, не забывайте использовать:

System.out.println(patient.toString());

Тогда будет видно:)

0 голосов
/ 19 ноября 2018

На самом деле я не вижу проблемы в вашем коде.

Person person = new Person();
person.setName("aa", "bb");
System.out.println(person);  // aa bb

Patient patient = new Patient();
patient.setName("cc", "dd");
System.out.println(patient);  // Patient Name: cc dd

Я думаю, что вы задали неправильное имя или используете неправильную ссылку.Проверьте это.

0 голосов
/ 19 ноября 2018

Я добавил несколько комментариев и код в ваш класс Person, которые должны исправить ваши проблемы.

public class Person {
private String firstName; //store the first name
private String lastName; //sore the last name

//initialize firstName and lastName to an empty string
public Person() {
    firstName = "";
    lastName = "";
}

//set firstname and lastname according to the parameters.
public Person(String first, String last) {
    //setName(first, last); remove this crap.
    // Use the contructor properly when initialize your person object. Like this:
    this.firstName = first;
    this.lastName = last;
}

//method to output the first name and last name
@Override
public String toString() {
    return (firstName + " " + lastName);
}

//method to set firstName and lastName according to the paramters
public void setName(String first, String last) {
    //
    firstName = first;
    lastName = last;
}
}
0 голосов
/ 19 ноября 2018

, если проблема заключается в выводе имени в main при вызове метода toString из класса Patient, я думаю, что приведенный ниже код поможет вам.

вы пытались создать Patientтакой объект?

    public static void main(String[] args) {

    Patient p = new Patient();
    System.out.println(p.toString());

}
0 голосов
/ 19 ноября 2018

Здесь:

public Person()
{
    firstName = "";
    lastName = "";
}

В вашем подклассе отсутствует разумный вызов конструктора суперкласса.Поэтому, когда вы создаете экземпляры своих объектов Patient, используется вышеуказанный конструктор, и все пациенты заканчиваются на "" в качестве имени и фамилии! *

Когда вы создаете пациента, тогда пациент должен иметь имя тоже!Но ваш конструктор в Patient устанавливает только поля, связанные с пациентом.И неявно, супер конструктор по умолчанию называется.Поэтому все поля Person должны быть пустыми строками!

Гораздо лучший подход будет выглядеть так:

class Person {
  private final String firstName;
  ... lastName

  public Person(String firstName, String lastName) {
   this.firstName = firstName;
  ...

, а затем

class Patient extends Person {
  private final int patientID;

  public Patient(int patientID, String firstName, String lastName) {
    super(firstName, lastName);
    this.patientID = patientID;
  )

Почему это так?лучше: имена и идентификаторы не меняются (обычно).Нет смысла иметь добытчиков для них.Вы создаете свой объект один раз, и тогда эти данные исправляются!Существует также нет смысла иметь этот конструктор по умолчанию в Person.Человек с пустыми именами не имеет смысла.Таким образом: не создавайте класс, который позволяет вам создавать «недопустимые» объекты.Ваши занятия модель реальность.Нет настоящих людей без имен!

И еще один совет: используйте @Override при переопределении методов, чтобы компилятор мог сообщить вам, когда вы что-то не так! *

...