1

我有一个项目,但我又遇到了以前遇到的问题。

我们有这个 Tester 文件。不应该编辑它。我希望你专注于这一行:

System.out.println(bb) ;

它打印对象对吗?

import java.util.Arrays ;
/**
   Presents some problems to the BillBoard class.
 */
public class BillboardTester
{
    public static void main(String[] args) 
    {
    int[] profits = new int[]{1, 2, 3, 1, 6, 10} ;
    int k = 2 ;
    System.out.println("Profits: " + 
               Arrays.toString(profits) + "   k = " + k)  ;
    Billboard bb = new Billboard(profits, k) ;
    System.out.println("Maximum Profit = " + bb.maximumProfit()) ;
    System.out.println(bb) ;

    k = 3 ;
    profits = new int[]{7, 4, 5, 6, 1, 7, 8, 9, 2, 5} ;
    System.out.println("Profits: " + 
               Arrays.toString(profits) + "   k = " + k)  ;
    bb = new Billboard(profits, k) ;
    System.out.println("Maximum Profit = " + bb.maximumProfit()) ;
    System.out.println(bb) ;
    }
}

然后通过打印对象,他期望得到这个结果:

Billboards removed (profit): 3(1) 0(1) => profit loss of 2
total value of billboards = 23
remaining maximum profit = 21

我不知道我必须在实际的 Billboard 类中创建什么方法,所以我可以把它打印出来。你有什么建议吗?我想知道这背后的逻辑,而不是解决那个特定问题的方法。

4

2 回答 2

4

覆盖toString方法。

每当您打印类的任何实例时,toString都会调用该方法。如果您不覆盖它,将使用Object's类,它返回具有形式的表示。toStringtype@someNumber

要打印您自己的表示,只需覆盖它,然后您的实现toString将被调用。

@Override
public String toString() {
    return this.getProfit();
}

您可以相应地更改返回的字符串。我不知道你k是什么,但你也可以在你的returned string.

于 2012-11-13T18:25:48.243 回答
4

覆盖toString方法。打印对象依赖于Object类中定义的方法。通过覆盖它,您的实现将被使用而不是那个。

考虑println的文档:

打印一个对象,然后终止该行。这个方法首先调用 String.valueOf(x) 来获取打印对象的字符串值,然后表现得好像它调用了 print(String) 和 println()。

println依赖于String.valueOf(x)谁调用x'stoString方法。

一个例子:

public String toString() {
    return "Billboards removed (profit):" + someParam + " => profit loss of " +
           profitLoss + "\ntotal value of billboards = " + totalValue + 
           "\nremaining maximum profit = " + remainingProfit;
}

长话短说,您只需返回String您“描述”其内容的对象的表示。如果你有一个Person对象,你toString可能会是这样的:

"Name: " + personName + "Email: " + personEmail.
于 2012-11-13T18:25:57.587 回答