【问题标题】:JAVA:How to print my CreditCard object's contents, instead of address? (I am printing the reference address) [duplicate]JAVA:如何打印我的 CreditCard 对象的内容,而不是地址? (我正在打印参考地址)[重复]
【发布时间】:2017-07-10 16:04:05
【问题描述】:

我正在我的数据结构书中做一个练习,似乎我打印的是参考地址而不是实际内容?有人可以看看我的代码并帮助我吗?感谢您的宝贵时间。

public class CreditCard {
//  instance variables
private String customer;
private String bank;
private String account;
private int limit;
protected double balance;

// constructors - account for all cases, one with a bal, and one without
public CreditCard(String cust, String bk, String acnt, int lim, double bal){
    customer = cust;
    bank = bk;
    account = acnt;
    limit = lim;
    balance = bal;
}
public CreditCard(String cust, String bk, String acnt, int lim){
    this(cust, bk, acnt, lim, - 0.0);
}
// accessors
public String getCustomer(){return customer;}
public String getBank(){return bank;}
public String getAccount(){return account;}
public double getLimit(){return limit;}
public double getBalance(){return  balance;}

// updaters
public boolean charge(double price){
    if(price + balance > limit){
        return false;
    }
    else balance += price;
    return true;
}
public void makePayment(double amount){
    balance -= amount;
}

// utility (static)
public static void printSummary(CreditCard card){
    System.out.println("Customer = " + card.customer);
    System.out.println("Bank = " + card.bank);
    System.out.println("Account = " + card.account);
    System.out.println("Limit = " + card.limit);
    System.out.println("Balance = " + card.balance);
}

}// 结束类 CreditCard

【问题讨论】:

  • 您需要为您的CreditCard 类添加一个toString() 方法。此方法将覆盖Object 超类中的相同方法。在尝试获取对象的 String 表示时,它也会被隐式调用。默认情况下,您会得到您所看到的结果。

标签: java object printing output


【解决方案1】:

添加toString 方法(只需覆盖一个)。

public class CreditCard {
    //  instance variables
    private String customer;
    private String bank;
    private String account;
    private int limit;
    protected double balance;

    // constructors - account for all cases, one with a bal, and one without
    public CreditCard(String cust, String bk, String acnt, int lim, double bal) {
        customer = cust;
        bank = bk;
        account = acnt;
        limit = lim;
        balance = bal;
    }

    public CreditCard(String cust, String bk, String acnt, int lim) {
        this(cust, bk, acnt, lim, -0.0);
    }

    // accessors
    public String getCustomer() {
        return customer;
    }

    public String getBank() {
        return bank;
    }

    public String getAccount() {
        return account;
    }

    public double getLimit() {
        return limit;
    }

    public double getBalance() {
        return balance;
    }

    // updaters
    public boolean charge(double price) {
        if (price + balance > limit) {
            return false;
        } else {
            balance += price;
        }
        return true;
    }

    public void makePayment(double amount) {
        balance -= amount;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("CreditCard{");
        sb.append("customer='").append(customer).append('\'');
        sb.append(", bank='").append(bank).append('\'');
        sb.append(", account='").append(account).append('\'');
        sb.append(", limit=").append(limit);
        sb.append(", balance=").append(balance);
        sb.append('}');
        return sb.toString();
    }

    // you do not need this util method because of it converts to
    public static void printSummary(CreditCard card) {
        System.out.println("CreditCard = " + card);
    }
}// end class CreditCard

【讨论】:

  • 谢谢!实际上,我在发布问题后就解决了这个问题,但这非常有帮助和教育意义。
【解决方案2】:

你得到的是Object 类的toString() 实现。 引用自它的 javadoc:

结果应该是一个简洁但信息丰富的表示,易于人们阅读。建议所有子类重写此方法。

这意味着,您需要在 CreditCard 类中使用您自己的 toString() 实现来覆盖它。 可以这么简单:

@Override
public String toString() {
    return getClass().getName()
         + "[ customer = " + customer
         + ", bank = " + bank
         + ", account = " + account
         + ", limit = " + limit
         + ", balance = " + balance
         + "]";
}

如果你喜欢多行输出,你可以在上面的部分字符串中插入一些\n

顺便说一句: 您不再需要您的方法public static void printSummary(CreditCard card)。 而不是使用

CreditCard.printSummary(creditCard);

你现在可以简单地使用

System.out.println(creditCard);

在后台调用您的 toString() 方法。

【讨论】:

  • 谢谢。这非常有帮助和教育意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 2017-02-21
相关资源
最近更新 更多