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