java - Java中的抽象类——创建对象

标签 java oop object abstract-class

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

最佳答案

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

  • B 是一个类,A 的类型是 B 的子类
  • B 是一个接口(interface),A 的类型实现 B

就您而言,适用第一条规则。两者basicAccountpremiumAccountaccount 的子类。因此,您可以使用高级帐户和基本帐户对象作为帐户对象!因此,只需将新创建的对象分配给 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对象为 account s,您无法访问 basicAccount 的方法和premiumAccount直接访问this.account .

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

假设您有 doStuff basicAccount中定义的方法你想调用它:

this.account.doStuff();

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

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

if (this.account instanceof basicAccount)

在 if 语句中,强制转换 this.accountbasicAccount并调用方法:

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

关于java - Java中的抽象类——创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36367576/

相关文章:

java - 在 JPA/Hibernate 中使用 Spring 定义的 transactionManager

Javascript:数组中的所有对象都具有相同的属性

android - 不同的对象

javascript - 向 JavaScript 对象添加方法

java - 为什么要在 OOPS 中定义重载方法?

r - 带有 ifelse 和两个对象的自定义函数需要以动态方式从正确的列中读取 R

java - Spring 长轮询

java - 正则表达式匹配管道字符第 n 次出现后的子字符串

java - 无法解析方法 'setOnRefreshListener(anonymous android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener)'

java - 合并排序抛出 StackOverflowError