Java 如何使用多个构造函数创建对象?

Java 如何使用多个构造函数创建对象?,java,Java,我编写了以下代码和驱动程序,但我不确定如何使用这两个构造函数创建银行帐户对象。一个构造器取得初始余额,第二个构造器开立一个没有钱的账户。此外,账户余额是否应包括有效性检查 或者,我可以执行以下操作: 将费用作为描述银行账户的一部分。根据需要更新BankAccount类。用户应该能够为每个帐户设置费用金额,并通过一种方法添加费用。向驱动程序添加代码以演示费用功能。有人能解释一下这是什么问题吗 //Bank Account class import java.text.NumberFormat

我编写了以下代码和驱动程序,但我不确定如何使用这两个构造函数创建银行帐户对象。一个构造器取得初始余额,第二个构造器开立一个没有钱的账户。此外,账户余额是否应包括有效性检查

或者,我可以执行以下操作:

将费用作为描述银行账户的一部分。根据需要更新BankAccount类。用户应该能够为每个帐户设置费用金额,并通过一种方法添加费用。向驱动程序添加代码以演示费用功能。有人能解释一下这是什么问题吗

//Bank Account class   
import java.text.NumberFormat;

public class BankAccount {

private String ownerName;
private String accountId;
private double accountBalance;

public BankAccount(String ownerName, String accountId, double accountBalance) {
    this.ownerName = ownerName;
    this.accountId = accountId;
    if(accountBalance >= 0) { 
        this.accountBalance = accountBalance;           
    } else {
        System.out.println("Due to your negative account balace, you will be issued a fee.\n");
    }
}

public BankAccount(double accountBalance) {
    accountBalance = 0;
}

public String getOwnerName() {
    return ownerName;
}

public void setOwnerName(String ownerName) {
    this.ownerName = ownerName;
}

public String getAccountId() {
    return accountId;
}

public void setAccountId(String accountId) {
    this.accountId = accountId;
}

public double getAccountBalance() {
    return accountBalance;
}

public void setAccountBalance(double accountBalance) {
    if(accountBalance >= 0) { 
        this.accountBalance = accountBalance;           
    } else {
        System.out.println("Due to your negative account balace, you will be issued a fee.\n");
    }
}

public void withdraw(double amount) { 
    if(amount > 0 && amount < accountBalance) { 
        accountBalance -= amount;           
    } else {
        System.out.println("Invalid withdraw amount! Please try again.\n");
    }
}

public void deposit(double amount) { 
    if(amount > 0) { 
        accountBalance += amount;
    } else {
        System.out.println("Invalid deposit amount! Please try again.\n");
    }
}

public String toString() { 
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
    return "Account Owner's Name: " + ownerName + "\n" + "Account ID: " + accountId + "\n" + 
           "Balance in the account: " + currencyFormatter.format(accountBalance);
}
}

//Driver Program
public class BankAccountDriver {

public static void main(String[] args) {

    BankAccount myAccount = new BankAccount("Smith", "123jahgsd", 1200);                      
    myAccount.withdraw(0.453);
    myAccount.deposit(1000.1);
    System.out.println(myAccount);
}
}

根据要使用的构造函数创建对象。例如,要使用第一个构造函数,需要三个参数,如下所示:

BankAccount first = new BankAccount("Bob", "ID45", 400.50);
要使用第二个构造函数,你只需要一个参数,平衡,就像这样

BankAccount second = new BankAccount(400.50);
它们都将创建BankAccount的实例,不同的是在创建时,第一个银行帐户将填写字段ownerName和accountId,而第二个银行帐户将这些字段设置为空字符串值。但是,第二个对象的余额为0,而第一个对象的余额为400.5

编辑:就像用户ScaryWombat建议的那样,第二个构造函数中存在一个缺陷,因为如果您想定义一个余额为0的对象,那么添加余额参数就没有意义了。此外,在这种情况下,最好也为其他字段提供默认值

public BankAccount() {
    ownerName = "unknown";
    accountId = "unknown";
    accountBalance = 0;
}
因此,现在当您使用此构造函数创建BankAccount实例时,它将具有默认值unknown、unknown和0

BankAccount third = new BankAccount();
另外,对于费用部分,您需要做的不仅仅是在BankAccount类中创建另一个名为“费用”的字段,还需要创建一个setter方法以允许用户设置其费用

private double fee;
.
.
.
public void setFee (double fee) {
   this.fee = fee;
}
在main方法中,用户可以通过以下方式访问它:

BankAccount account = new BankAccount("Fred", "ID145", 400);
account.setFee(15); //this will set the fee to 15
您可以这样做:

   public BankAccount(String ownerName, String accountId, double accountBalance) {
       this.ownerName = ownerName;
       this.accountId = accountId;
       this.accountBalance = accountBalance;
   }

   public BankAccount() {
       this("some default name", "some default id", 0.0);
   }

如果你想创建一个余额为零的银行账户,那么

public BankAccount(String ownerName, String accountId, double accountBalance) {
    this.ownerName = ownerName;
    this.accountId = accountId;
    this.accountBalance = accountBalance;
}

public BankAccount() {
    this.accountBalance = 0;
}
您可以将它们实例化为

BankAccount mine = new BankAccount("Scary", "123", 1000000.00);
BankAccount empty = new BankAccount();
编辑


如果您选择使用第二个方法构造一个方法,那么id和owner也将为null,并且可能不是很有用

您不能使用两个构造函数创建一个银行帐户对象。您只需调用两个构造函数中的一个来创建新对象。所以你要么:

BankAccount account = new BankAccount("Sweeper", "ABCDEF", 10000);
或:

请注意,第二个构造函数的参数是无意义的,因为无论参数是什么,您都将余额初始化为0:

public BankAccount(double accountBalance) {
    accountBalance = 0;
}
我认为这更有意义:

public BankAccount() {
    this.accountBalance = 0;
}
至于你的第二个问题,我会给你一些提示


您需要向类中添加一个名为“费用”的新字段。为它添加getter和setter。

都是很好的答案,但它们实际上忽略了真正的问题;也就是说:你不能放下构造函数,因为你可以

您创建了满足需求所需的代码。换句话说:你后退一步;然后分别为您的银行帐户类设计预期的用例

和要考虑的事项:避免使用这样的不同路径创建的类。 示例:允许id/所有者字段为空非常危险。将这些字段保留为空值;这意味着你要么需要到处检查;如果你忘了在这里或那里;您迟早会遇到NullPointerException

请记住:您的对象是用来表示模型的!现实事实上,银行账户没有所有者是不行的;或者身份证

从这个意义上讲,类的合理实现更像:

public class BankAccount {
  private final String owner;
  private final String id;
  private double currentBalance;

  public BankAccount(String owner, String id) {
    this(ownwer, id, 0);
  }

  public BankAccount(String owner, String id, double currentBalance) {
    this.owner = owner;
    ...
注意:

您希望防止更改所有者/id,因此将其设置为最终值;因此,这些字段也没有setter方法 在实际的解决方案中,您不会使用字符串来表示名称或ID,而是使用不同的类 您也永远不会使用double来表示货币。这是一个超基本的东西:金钱不应该用浮点数来表示!您将关注BigDecimal类;或者简单地使用int而不是double,表示1.75美元等于175美分 再看一眼现实世界:现在,你不需要建立一个银行账户的模型来计算当前余额。相反,银行账户可能与表示存款和支付交易的事件历史关联。
最后一点:对于您当前的练习,这种取款/存款验证是可以的;在现实世界中,验证也可能发生在许多其他地方。回到我最初的陈述:这完全取决于你的模型;一个简单的模型可以说,银行账户本身就是在验证事物;但一个更现实的解决方案是,您有其他组件来处理规则、法律和进行验证的各种主题。

不清楚您在问什么,但BankAccount的两个构造函数都包含一个openin
g平衡。当你问问题时,你需要非常清楚-应该是具体的,每个帖子只有一个问题。此外,账户余额是否应该包括有效性检查?什么类型的支票?正余额、零余额或负余额都可以。这是我的观点,请记录在案:我再次更新了答案,以讨论您问题的验证主题。@ally这是正确的。但是,我可以补充一点,您的第二个构造函数参数是没有意义的。您正在将帐户余额设置为0。为什么要在那里放一个参数?@RSon1234 true刚刚编辑了我的答案来反映这一点。让BankAccount second=new BankAccount400.50是不好的行为;然后将帐户余额0@ScaryWombat是的,但OP是这样定义构造函数的,而不是Chris@ScaryWombat很好,我编辑了我的答案来记录这一点。谢谢你的建议!如果余额为零,则为是,但这也会创建一个id为空且所有者名称为空的帐户。@AndyTurner Agreement不是很有用。我更新了我的答案以反映这一点。你是唯一一个回答如何使用多个构造函数创建对象的人?我想我对以下要求感到困惑:一个构造函数有初始余额,而第二个构造函数没有钱开户。我认为我必须将余额初始化为零。非常好的分数,但是,也许所有者应该能够改变;但是我想说一个比压缩构造函数更干净的设计就是只有一个构造函数,使用名称和id。然后使用存款方法来设置余额。明白!谢谢你澄清这一困惑:@ScaryWombat也许是为了这个练习;但是很好;在现实世界中,银行账户不会改变所有者。你把钱从一个账户转到另一个账户,但不是整个账户。@ScaryWombat好吧,这就是如何模拟所有者的作用。实际上,您不会使用所有者名称,而是使用其中的某个所有者id字段;这应该是最后的决定-
public class BankAccount {
  private final String owner;
  private final String id;
  private double currentBalance;

  public BankAccount(String owner, String id) {
    this(ownwer, id, 0);
  }

  public BankAccount(String owner, String id, double currentBalance) {
    this.owner = owner;
    ...