在Java中将继承的对象打印为null

时间:2014-03-03 02:33:38

标签: java inheritance private

我们被指示在父类Person中将String“name”定义为private。但是,当我尝试显示Person和Employee对象的名称时,Employee名称将打印为“null”。我不允许将“名字”定义为公开。

人员类:

public class Person {

private String name;
public int weight, height;

public Person() {}

public Person(String name) {

    this.name = name;
}

public String getName() {

    return name;
}


public String toString() {

    return this.getName() + ", your height is " + height + " and your weight is "
            + weight;
}

员工类:

public class Employee extends Person {

private int id;

public Employee(String name, int id) {
    this.id = id;
    this.name = name;
}

public int getID() {
    return id;
}

}

主要课程:

Person a1 = new Person("Thomas");
    a1.height = 70;
    a1.weight = 160;
    Person a2 = new Employee("Rebecca", 6543);
    a2.height = 65;
    a2.weight = 128;
    Person a3 = new Employee("Janice", 8765);
    a3.height = 60;
    a3.weight = 120;
    Person[] arr = new Person[] {a1, a2, a3};
    Person a;
    for (int i = 0; i < arr.length; i++) {
        a = arr[i];
        System.out.println(a.toString() + "; your BMI is: " + a.calcBMI());
    }
    Person.countEmployees(arr);

输出:

托马斯,你的身高是70,你的体重是160;你的BMI是:22.955102040816328 null,你的身高是65而你的体重是128;你的BMI是:21.297988165680472 null,你的身高是60而你的体重是120;您的BMI是:23.433333333333334

我通过电子邮件问我的教授,她说因为toString()是在父类Person中定义的,所以不应该出现这个错误。我的语法错了吗?逻辑错了吗?

4 个答案:

答案 0 :(得分:3)

问题是你的Employee构造函数正在调用默认的Person构造函数(由编译器自动注入调用,因为默认的构造函数是定义的。你可以删除{{{}中的默认构造函数1}},你会发现它没有编译。)

您应该调用在Employee构造函数中接收名称的构造函数,而不是设置属性(不应该编译,顺便说一下)

Person

答案 1 :(得分:0)

您应该删除Employee构造函数中的行this.name = name;,并添加对super(name);的调用作为同一构造函数的第一行。

答案 2 :(得分:0)

这是因为它在Person类中是私有的,因此您无法在Employee类中访问它,因此您无法直接在那里设置它。

更改此

public Employee(String name, int id) {
    this.id = id;
    this.name = name;
}

为此,它调用您需要设置名称的构造函数:

public Employee(String name, int id) {
    super(name);
    this.id = id;
}

答案 3 :(得分:0)

我不确定你的这一类是如何编译的

public class Employee extends Person {

  private int id;

  public Employee(String name, int id) {
      this.id = id;
      this.name = name;
  }
}

当你说this.name = name并且Person.name是私有的时,如果你没有在Employee类中定义另一个名为name的变量,那么这不应该编译。

回到你的问题,你需要在Employee consructor中调用Person的构造函数,就像这样

public class Employee extends Person {

  private int id;

  public Employee(String name, int id) {
      super(name);
      this.id = id;
  }
}