试图在java中使用多态和ArrayList

时间:2016-02-19 15:25:55

标签: java arraylist polymorphism

我必须在java的作业中使用Polymorphism和ArrayList,但我需要帮助。如果有人能帮助我,我真的很感激。我无法从ArrayLis访问我的子类方法。

所以我有一个超类

    public class Table{
    private int TotalAmount;
    //setters and getters
    }

我有两个子类

    public class TableFidelity extends Table{
    private int Points;
    //setters and getters
    }


    public class TableCompany extends Table{
    private int NumberOfTimesServed;
    //setters and getters
    }

我必须在同一个ArrayList中使用我的两个子类

    public static void main(String[] args){
    Table table=new Table();
    ArrayList<Table> Tables=new ArrayList<Table>();
    Table tablefidelity =new TableFidelity ();
    Table tablecompany =new TableCompany ();
    Tables.add(tablefidelity);
    Tables.add(tablecompany);
    System.out.println(Tables.get(0).getTotalAmount());
    //I can get the total Amount from the superclass
    System.out.println(Tables.get(0).getPoints());
    //but I can't do this
    System.out.println(Tables.get(1).NumberOfTimesServed());
    //or this 
    }

当我按下时,Netbeans不会显示getPoints或NumberOfTimesServed。它只显示了超类方法。

1 个答案:

答案 0 :(得分:1)

如果您希望每个Table打印有关其中包含内容的信息,那么最好在Table类上定义一个方法来做到这一点。然后,您可以在子类中覆盖它以打印这些类生成的额外信息。

在最简单的层面上,你有

class Table {
  ....
  public void printInfo() {
    System.out.println(totalAmount);
  }
}

然后

class TableFidelity extends Table {
  ....
  @Override
  public void printInfo() {
    super.printInfo();
    System.out.println(Points);
  }
}

等等。这是工作中的多态性:调用printInfo()的类不需要知道它是在Table还是TableFidelity或其他任何地方调用它。覆盖方法涉及到这一点。

实际上,您可能不希望将其限制为标准输出。所以你可以通过一些东西来告诉它你想要的信息去哪里。

或许更好,您可以在toString()及其子类中覆盖Table,沿着上面的行(但构建String而不是打印它)。但这取决于你将如何使用这些类。

还有一点需要注意:如果这是一项任务,你可能会因为命名约定的不良风格而删除标记。确保您的实例字段的名称以小写字母开头,而不是大写字母。