You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java继承问题:调用Manager的getDetails()时Employee输入值均为null

问题原因及解决方法

核心问题

你犯了两个关键错误:

  1. 你创建了Employee e和Manager mgr两个独立对象,把用户输入的员工信息全赋值给了e,但mgr继承自Employee的属性完全没被设置,调用mgr.getDetails()时这些属性自然是默认值(字符串为null,int为0)。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:10:32