试图在子类中调用超类方法

时间:2018-11-19 19:37:13

标签: 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()); 它会在控制台“患者名称:”中打印出来。关于我做错事情的任何反馈或有关如何使其正常工作的想法

5 个答案:

答案 0 :(得分:1)

这里:

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

您的子类缺少对超类构造函数的合理调用。因此,当实例化Patient对象时,将使用上面的构造函数,所有患者的名字和姓氏都以“”结尾!

创建患者时,患者也应具有名称!但是,Patient中的构造函数仅设置Patient相关字段。并隐式地调用默认的超级构造函数。因此,“人”字段都设置为空字符串!

一种更好的方法如下:

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不变(通常)。为他们准备吸气剂没有意义。一次创建对象,然后数据就固定了!在Person中使用默认构造函数也没有没有要点。名称为的人没有任何意义。因此:不要创建允许您创建“无效”对象的类。您的课程 model 现实。没有名字的真人!

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

答案 1 :(得分:0)

我在您的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;
}
}

答案 2 :(得分:0)

如果问题是在从Patient类中调用toString方法时在main中输出名称,那么我认为下面的代码会为您提供帮助。

您是否尝试过像这样构造Patient对象?

    public static void main(String[] args) {

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

}

答案 3 :(得分:0)

实际上,您的代码中没有看到问题。

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

我认为您设置的名称错误,使用不正确的引用。检查一下。

答案 4 :(得分:0)

您的 PATIENT 子类没有任何构造函数。您没有为任何患者设置任何名字或姓氏。 为了使您在父类中使用熟悉的构造函数,请使用tru:

"select *, (Pcs_DC_col * Qty_multi_col) as Qty_DC_col from [products]"

这样,即使构造函数将被称为空,您也始终会得到firstName和lastName。 根据您的 toString 方法,它是正确的,它会调用超类方法:

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

但是请注意,您返回了STRING值,因此要使其在屏幕上可见,请记住使用:

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

这将是可见的:)