0

你好 StackOverflow 社区,

我遇到了一些涉及将元素添加到数组中的输出问题。我在课堂上创建了一个程序,它运行正常,但是当我在自己的计算机上运行相同的程序/代码时,我得到以下输出(有时会生成不同的数字/错误):

“玩具:

玩具演示.ToysDemo@15f5897toysdemo.ToysDemo@b162d5"

为了更清楚,这里是代码:

package toysdemo;



public class ToysDemo {
private float price;
private String name;

public float getPrice(){
    return price;
}

public void setPrice(float newPrice){
    price = newPrice;
}

public String getName() {
    return name;
}

public void setName(String newName) {
    name = newName;
}

public static void printToys(ToysDemo arrayOfToys[], int size) {
    //display content of array
    System.out.println("The toys: ");
    for (int i = 0; i < size; i++) {
        System.out.print(arrayOfToys[i]);
    }
    System.out.println();
}//print toys


public static void main(String[] args) {
    ToysDemo arrayOfToys[] = new ToysDemo[5];
    int numberOfToys = 0;
    // create two toys and save into array
    ToysDemo toy = new ToysDemo();
    toy.setPrice((float)111.99);
    toy.setName("Giant Squid");
    arrayOfToys[numberOfToys++] = toy;

    ToysDemo toy2 = new ToysDemo();
    toy2.setPrice((float)21.99);
    toy2.setName("small Squid");
    arrayOfToys[numberOfToys++] = toy2;


    //print toys into array
    printToys(arrayOfToys, numberOfToys); //the call
}
}

这是一个真正简单的程序,但令人沮丧的是,正确的输出无法显示。

如果有人能帮助我解决这个难题,我将不胜感激。

谢谢

4

4 回答 4

2

实际上,您正在打印ToysDemo对象的引用。为了完成这项System.out.println(arrayOfToys[i])工作,您的ToysDemo类需要重写toString方法。

示例代码:

public class ToysDemo {

    //class content...

    @Override
    public String toString() {
        return "My name is: " + name + " and my price is: " + String.format("%.2f", price);
    }
}
于 2013-03-31T02:18:16.160 回答
2

当您调用 时System.out.print(someToy),它会调用someToy.toString()并打印结果。
如果你不覆盖toString(),你会得到默认值Object.toString(),它会打印类名和内存地址。

于 2013-03-31T02:18:48.380 回答
1

您需要将函数 toString 添加到 ToysDemo 类。例如:

@Override
public String toString()
{
   return "Name: "+name+"\tPrice: "+price;
}
于 2013-03-31T02:20:23.543 回答
1

您需要覆盖 Object 类的 toString() 方法。如果您不这样做,JVM 将执行基类方法,该方法默认打印类的完全限定名称,即带有包名称和存储对象的内存地址的类名称,这就是您获得该输出的方式。现在,当您调用 system.out.print 时,它将转到覆盖的方法并实现它。

例如:

Employee {
    private String name;
    private int age;

    public void setName(String name) { this.name = name; }
    public String getName() { return this.name; }
    public void setAge(int age) { this.age = age; }
    public int getAge() { return this.age = age; }

    @Override
    public String toString() {
        return "Name of the employee is " + name + " and age is " + age; 
    }

    public static void main(String args[]) {
        Employee e = new Employee();
        e.setName("Robert"); 
        e.setAge(20); 
        System.out.println(e); 
    } 
} 
于 2013-03-31T11:49:21.600 回答