【问题标题】:Abstract class in Java - creating objectsJava中的抽象类——创建对象
【发布时间】:2016-07-21 22:10:45
【问题描述】:

我第一次使用抽象类在 Java 中编写代码,但遇到了问题。我有一个用户列表(数组),每个用户都是 userClass 的对象。我创建了一个抽象类“帐户”和 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 方法中吗?

【问题讨论】:

  • 其实你的代码大部分是正确的。您只需要删除“帐户”变量前面的帐户类(premiumAccount 和 basicAccount)。只需将它们初始化为相关的子类。

标签: java oop object abstract-class


【解决方案1】:

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

  • B 是一个类,A 的类型是 B 的子类
  • B 是一个接口,A 的类型实现了 B

在您的情况下,第一条规则适用。 basicAccount 和 premiumAccount 都是 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;
}

不过,一个副作用是,在使用basicAccount 和premiumAccount 对象作为accounts 之后,您无法通过直接访问this.account 来访问basicAccount 和premiumAccount 的方法。

如果你真的想这样做,试试这个方法:

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

this.account.doStuff();

这不起作用,因为this.account 是account 类型,而account 没有定义名为doStuff 的方法。

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

if (this.account instanceof basicAccount)

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

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

【讨论】:

    【解决方案2】:

    这样的事情可能会做到:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2016-07-22
      相关资源
      最近更新 更多