当前位置: 首页 > 知识库问答 >
问题:

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

郭建华
2023-03-14

我编写了以下代码和驱动程序,但我不知道如何使用两个构造函数创建银行账户对象。一个构造函数获取初始余额,第二个构造函数在没有钱的情况下开设账户。此外,Account tBalance是否应该包括有效性检查?

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

将费用作为描述银行账户的一部分。根据需要更新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);
}
}

共有3个答案

陆文康
2023-03-14

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

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();

编辑

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

子车英达
2023-03-14

你可以这样做:

   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);
   }
翟沈义
2023-03-14

这些都是很好的答案,但它们实际上“错过了”真正的问题;那就是:你不会放下构造函数,因为你可以。

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

还有要考虑的事情:您避免使用如此不同的路径创建的类。

示例:允许id /所有者字段为空是极其危险的。这使得那些字段具有< code>null值;这意味着你要么需要到处做大量的检查;如果你忘记了这里或那里;您迟早会遇到NullPointerExceptions(相当快)。

请记住:您的对象旨在表示(模型!“现实”。实际上,银行账户不会没有所有者;或身份证。

从这个意义上说,一个合理的类实现看起来应该更像:

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,而是使用不同的类
  • 你也永远不会使用双倍来表示货币。这是一件不可思议的事情:钱不应该用浮点数来表示!(你会看向BigDecimal类;或者只是使用int而不是双精度(并将1.75 $表示为175美分)
  • 只需看一眼真实的现实世界:如今,您不会将银行帐户建模为具有“当前余额”。相反,银行账户可能与事件历史(表示存款和还清交易)相关联。

最后一点:对于您当前练习,取款/存款的那种“验证”是“可以的”;在“真实世界”中,验证也可能发生在许多其他地方。(回到我最初的陈述:这完全取决于你的模型;一个简单的模型可以说,银行账户本身就是在“验证”事物;但是一个更现实的解决方案是,你有其他的组件来处理“规则”、“法律”和各种各样的做“验证”的主题)。

 类似资料:
  • 我有一个Card类,它包含两个构造函数,你可以在下面的代码中看到。问题是,每个卡片对象包含2个字符串和2个图像,因为我想保存这些对象,所以我必须将图像的路径保存为字符串,然后检索它们,因此需要2个构造函数。然而,使用一些打印语句,我发现每当检索到一张卡片时,就会创建两个独立的对象:一个正常的对象和另一个空的对象。我知道这是因为我在第二张卡中使用第一个构造器创建了一张新卡。有没有办法避免这样的情况,

  • 在hibernate的xml方法中,创建hibernate SessionFactory对象时使用

  • 问题内容: 我一直认为无需调用构造函数即可创建对象。 但是,在 明智地 阅读《有效的Java 项目11:覆盖克隆》时 ,我发现了一条声明,指出 “没有调用构造函数”的规定太强了。行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象。如果该类是最终的,则clone甚至可以返回由构造函数创建的对象。 有人可以向我解释一下吗? 问题答案: 我一直以为clone()会创建一个对象而不调用构造函

  • 我一直认为,clone()创建对象时不需要调用构造函数。 但是,在阅读有效Java第11条:明智地覆盖克隆时,我发现了一条声明,上面写着 “不调用构造函数”的规定太强了。行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象。如果类是最终的,克隆甚至可以返回构造函数创建的对象。 谁能给我解释一下吗?

  • 在ScalaMock的旧版本中,这段代码可以工作。在Scala2.12和Scalamock3.6中,我得到了一个NullPointerException,因为即使我创建了一个存根,它仍然在调用BrokenClass的构造函数的“s.length”行。所以它试图取消引用“s”,它是空的,因为我没有传递任何东西给它,因为我想要的只是一个存根,它在调用特定方法时返回一个特定值。 有没有一种方法可以在不调

  • @adilooze解决方案