java - 尝试在子类中调用父类(super class)方法

标签 java subclass superclass

可能是一个相当菜鸟的问题,但我无法弄清楚。我有一个 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;
    }
}

我正在尝试调用名为 Patient 的子类中的 toString 方法

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());
    }
}

当我从 Patient 类调用 toString 方法时,我无法让它在 main 中输出名称,但是当我测试它时,当我从 Person 类调用 toString 方法时,它会输出名称。 main 中的方法调用类似于 Patient pnt = new Patient(); System.out.print(Pnt.toString()); 它在控制台中打印出“患者姓名:”。关于我做错了什么的任何反馈或关于如何让它发挥作用的想法

最佳答案

这里:

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

您的子类缺少对父类(super class)构造函数的合理调用。因此,当您实例化患者对象时,将使用上述构造函数,并且所有患者最终都以“”作为名字和姓氏!

当您创建患者时,患者也应该有一个名称!但是 Patient 中的构造函数仅设置与 Patient 相关的字段。并且隐式地调用默认的 super 构造函数。因此,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;
  )

为什么这样更好:姓名和 ID 不会改变(通常)。为它们提供 setter/getter 是没有意义的。您创建对象一次,然后该数据就固定了!在 Person 中拥有默认构造函数也是没有意义的。一个名字的人没有任何意义。因此:不要创建一个允许您创建“无效”对象的类。您的类(class)模型现实。没有无名之人!

还有一个提示:在重写方法时使用@Override,以便编译器可以在出现错误时告诉您!

关于java - 尝试在子类中调用父类(super class)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53381486/

相关文章:

java - 如何匹配复杂的字符串?

java - 在本地运行 Heroku Java 教程时 Tomcat 未启动; "A child container failed during start"找不到 webapp 路径

java - 如何从子类修改父类(super class)变量?

java - 为什么在 put 方法中使用泛型声明 "<? super ArrayList> does not accept value "new Object()"的 HashMap?

java - Android 从另一个 Activity 中获取结果

java - 为什么是 ItemSkippedException?

具有私有(private)构造函数的 Java 子类会产生编译错误

c++ - 子类作为参数?

python - `super` 在多重继承中如何与类的 `__mro__` 属性交互?

java - 在父类(super class)中调用父类(super class)方法