我们被指示在父类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中定义的,所以不应该出现这个错误。我的语法错了吗?逻辑错了吗?
答案 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;
}
}