Java继承问题:调用Manager的getDetails()时Employee输入值均为null
问题原因及解决方法
核心问题
你犯了两个关键错误:
- 你创建了
Employee e和Manager mgr两个独立对象,把用户输入的员工信息全赋值给了e,但mgr继承自Employee的属性完全没被设置,调用mgr.getDetails()时这些属性自然是默认值(字符串为null,int为0)。 Manager类里的setDetails(String department)是方法重载(参数列表和父类不同),不是重写,父类的setDetails(int, String, ...)方法依然能被Manager对象调用,但你没用到。
解决步骤
方法一:直接给Manager对象设置所有属性
修改MainClass,不需要创建多余的Employee e,直接用mgr设置员工属性和部门:
import java.util.Scanner; public class MainClass { public static void main(String[] args){ Scanner input = new Scanner(System.in); Manager mgr = new Manager(); System.out.println("Enter ID: "); int ID = input.nextInt(); input.nextLine(); System.out.println("Enter First Name: "); String firstName = input.nextLine(); System.out.println("Enter Middle Name: "); String middleName = input.nextLine(); System.out.println("Enter last Name: "); String lastName = input.nextLine(); System.out.println("Enter Salary: "); double salary = input.nextDouble(); input.nextLine(); System.out.println("Enter Birthdate: "); String birthDate = input.nextLine(); // 调用父类的setDetails方法设置员工属性 mgr.setDetails(ID, firstName, lastName, middleName, birthDate, salary); System.out.println("Enter Department: "); String department = input.nextLine(); mgr.setDetails(department); System.out.println(mgr.getDetails()); input.close(); } }
方法二:给Manager添加全参数的set方法(更规范)
在Manager类里添加一个能同时设置员工属性和部门的方法,避免分开调用:
public class Manager extends Employee{ protected String department; @Override public String getDetails(){ return super.getDetails() + "\nDepartment: " + department; } // 仅设置部门的方法 public void setDetails(String department){ this.department = department; } // 同时设置员工属性和部门的方法 public void setDetails(int ID, String firstName, String lastName, String middleName, String birthDate, double salary, String department){ super.setDetails(ID, firstName, lastName, middleName, birthDate, salary); this.department = department; } }
然后在MainClass里直接调用这个全参数方法,替换原来的两次set调用:
mgr.setDetails(ID, firstName, lastName, middleName, birthDate, salary, department);
额外建议
- 作为Java新手,尽量遵循封装原则:把类的成员变量设为
private,通过getter/setter方法访问,而不是用protected直接暴露。 - 方法命名尽量清晰,比如把
setDetails(String department)改成setDepartment(String department),避免和父类方法混淆。
内容的提问来源于stack exchange,提问作者Andre Ryan
相关产品推荐
相关产品推荐

