Java中的抽象类 - 创建对象

时间:2016-04-01 23:49:52

标签: java oop object abstract-class

我是第一次使用抽象类在Java中编写代码而且我遇到了问题。我有一个用户列表(数组),每个用户都是userClass的对象。我创建了一个抽象类'account'和2个类,它们扩展了'basicAccount'和'premiumAccount',我想根据输入为每个用户创建基本或高级帐户。我的问题是我不知道如何实现userClass,因此根据字符串'accountType'创建基本或高级类的对象示例:

public class userClass {
private String email;
private String accountType;
private account account;

public userClass(String email, String accountType){
    this.setEmail(email);
    this.setAccountType(accountType);

    if(accountType.equals("Basic")){
        basicAccount account = new basicAccount();
    }
    else if(accountType.equals("Premium")){
        premiumAccount account = new premiumAccount();
    }
}
你能帮帮我吗?我可以把那些if放在userClass方法中吗?

2 个答案:

答案 0 :(得分:2)

面向对象编程中一个非常重要的概念是多态。如果A和B遵循这些规则中的任何一个,多态性允许您使用对象A,就好像它是另一个类型B的实例

  • B是一个类,A的类型是B
  • 的子类
  • B是界面,A类型实现B

在您的情况下,第一条规则适用。 basicAccountpremiumAccount都是account的子类。因此,您可以将自己的高级帐户和基本帐户对象用作帐户对象!所以只需将新创建的对象分配到account字段!

if(accountType.equals("Basic")){
    basicAccount account = new basicAccount();
    this.account = account; // This works! Don't worry!
}
else if(accountType.equals("Premium")){
    premiumAccount account = new premiumAccount();
    this.account = account;
}

但副作用是,在将basicAccountpremiumAccount个对象用作account后,您无法访问basicAccountpremiumAccount的方法直接访问this.account

如果确实想要这样做,请尝试以下方法:

假设您在doStuff中定义了basicAccount方法,并且您想要调用它:

this.account.doStuff();

这不起作用,因为this.account的类型为accountaccount未定义名为doStuff的方法。

您需要做的是检查account字段是否为basicAccount类型:

if (this.account instanceof basicAccount)

在if语句中,将this.account强制转换为basicAccount并调用方法:

((basicAccount)this.account).doStuff();

答案 1 :(得分:1)

这样的事可能会这样做:

public class UserClass{
    Account account;

    public UserClass(String accountType){
         if(accountType.equals("Basic"){
              this.account = new basicAccount();
         } else {
              this.account = new premiumAccount();
         {
    }
}