可能是一个很菜鸟的问题,但我无法弄清楚。我有一个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());
它会在控制台“患者名称:”中打印出来。关于我做错事情的任何反馈或有关如何使其正常工作的想法
答案 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());
}
这将是可见的:)