在数组中创建子类对象,在java中使用哪种类型的超类

时间:2016-12-15 20:43:21

标签: java oop

我试图报道OOP的东西,但我坚持到这里。我在公司类中遇到错误,员工[0] .setBonus(50)部分。除了在Employee类中定义Bonus方法之外,还有其他方法可以解决它吗?或者无论如何将所有对象保存在一个数组中?我定义了奖励方法,但还有另外一件事,我必须在Empoyee课程中返回' getBonus方法?


   public class Company
    {
    private static Employee[] employees;
    public Company()
    {
    employees= new Employee[]{new Manager("Sapo",10000),new Employee("James",5000),new Employee("Jessie",5001)};
    }
    public static void main(String[] args)
    {
        Company company= new Company();
        employees[0].setBonus(50);
        System.out.println(employees[0].getBonus());    
    }
    }
public class Employee extends Person
{
 int salary;
public Employee(String name,int salary) {
    super(name);
    setSalary(salary);
    // TODO Auto-generated constructor stub
}
public void setSalary(int salary)
{
    this.salary= salary;
}
public int getSalary()
{
    return salary;
}
}

    public class Manager extends Employee
{
private int bonus;

public Manager(String name, int salary) {
    super(name, maas);
}
public void setBonus(int bns)
{
    bonus=bns;
}

public int getBonus()
{
    return bonus;
}
public int getSalary()
{
    return salary+bonus;
}
}

我很困惑。

3 个答案:

答案 0 :(得分:2)

  

或者无论如何将所有对象保存在一个数组中?

你可以,但它会强迫你写:

if ( employees[0] instanceof Manager){
   ((Manager) employees[0]).setBonus(50);
}

这不是一个好习惯。

从功能上讲,如果奖金是仅拥有Manager个实例的属性,则Employee实例不应尝试设置或获取它。

当你这样做时:

 employees[0].setBonus(50);

编译器不知道具体实例。它只看到Employee。 在这个非常简单的代码中,我们直接看到第一个员工是经理,但在实际应用程序中,数组可能会被多次修改。试图记住哪些索引是管理者容易出错。如果您需要在一个或多个经理上调用经理特定的方法,您应该确定知道哪些变量是经理。所以宣称他们是经理似乎是更自然的方式。

为了解决您的问题,两个阵列似乎更有趣:一个用于员工,另一个用于管理员:

private static Employee[] employees;

private static Manager[] managers;

现在你可以做到:

public Company()
{
   employees= new Employee[]{new Employee("James",5000),new Employee("Jessie",5001)};
   managers= new Employee[]{new Manager("Sapo",10000)};
}

 public static void main(String[] args){
        Company company= new Company();
        managers[0].setBonus(50);
        System.out.println(managers[0].getBonus());    
    }

答案 1 :(得分:2)

如果你真的想这样做,你可以将员工[0]作为经理,但你必须知道不是很好的解决方案。 E.g:

    Company company= new Company();
    Manager manager = Manager.class.cast(employees[0]);
    manager.setBonus(50);
    System.out.println(manager.getBonus());

答案 2 :(得分:0)

你的抽象是错误的。你看,编译器只有编译时可用的信息

您有一系列员工对象。您在运行时的代码将Manager对象放入该数组并不重要!编译器不知道这一点。他只知道有一个员工。

Employee类有方法setBonus()。因此,你无法调用该方法!

一种可能的解决方案是将奖金作为Manager的构造函数的参数;整个想法可能看起来像这样:

public class Manager extends Employee {
  private final int bonus;

  public Manager(String name, int salary, int bonus) {
    super(name, salary);
    this.bonus = bonus;
  }

  @Override
  int getSalary() {
    return super.getSalary() + bonus;
  }

注意:

  • 你应该避免使用超类的字段;这些是该类的私有实现细节。子类应该关心它们。相反,你可以从超类中调用该方法。
  • 另一方面,您应该努力使您的字段 final 。这使得很多事情变得更加容易。
  • 覆盖方法时......使用@Override注释!

最后:构造函数是错误的位置,用于创建“测试数据”。换句话说:您的主要方法是创建该员工阵列;然后你只需传递到你的公司构造函数中。您希望清楚地将您的“真实业务逻辑”与主要存在于 test 那些“业务逻辑”的东西分开。