Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的抽象类-创建对象_Java_Oop_Object_Abstract Class - Fatal编程技术网

Java中的抽象类-创建对象

Java中的抽象类-创建对象,java,oop,object,abstract-class,Java,Oop,Object,Abstract Class,我第一次使用抽象类用Java编写代码,我遇到了一个问题。我有一个用户列表(数组),每个用户都是userClass的对象。我已经创建了一个抽象类“account”和两个扩展了它的类“basicAccount”和“premiumAccount”,我想根据输入为每个用户创建基本或高级帐户。我的问题是我不知道如何实现userClass,因此它会根据字符串“accountType”创建基本类或高级类的对象示例: public class userClass { private String email;

我第一次使用抽象类用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方法中吗?

像这样的东西可能会做到:

public class UserClass{
    Account account;

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

像这样的东西可能会做到:

public class UserClass{
    Account account;

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

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

  • B是一个类,a的类型是B的子类
  • B是一个接口,A的类型实现了B
在您的情况下,第一条规则适用。
basicAccount
premiumAccount
都是
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之后,您无法通过直接访问
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();

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

  • B是一个类,a的类型是B的子类
  • B是一个接口,A的类型实现了B
在您的情况下,第一条规则适用。
basicAccount
premiumAccount
都是
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之后,您无法通过直接访问
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();

实际上,您的代码基本上是正确的。您只需要删除“account”变量前面的account类(premiumAccount和basicAccount)。只是将它们初始化为相关的子类。实际上,您的代码基本上是正确的。您只需要删除“account”变量前面的account类(premiumAccount和basicAccount)。只需将它们初始化为相关的子类。