2013-03-31 2 views
0

Hello StackOverflow Community,Проблемы с выходом массива?

У меня возникла проблема с некоторым выходом, включающим добавление элементов в массив. Я создал программу в классе и работал нормально, но когда я запускаю ту же программу/код на своем собственном компьютере, я получаю следующий вывод (иногда генерируются разные числа/ошибки):

«Игрушки:

toysdemo.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 
} 
} 

это действительно простая программа, но это разочарование от того, как правильно выход не будет отображаться.

Я был бы очень признателен, если кто-нибудь может помочь мне разобраться в этой дилемме.

Спасибо

+0

Это не ошибка. – SLaks

ответ

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); 
    } 
} 
+0

Я вижу. Я не понимал, что это печать ссылок. Благодарим вас за предложение метода toString. Как вы думаете, может быть объяснением, что он работает до этого без toString? – Naan

+0

@ Когда вы запускаете программу, JVM будет выделять объекты в некотором месте в куче и давать каждому другой * адрес *. Каждый раз, когда вы запускаете программу, вы должны видеть разные * адреса * для своих объектов, объясняя старое поведение. Возможно, ваш класс уже определил метод toString, и вы, вероятно, его уничтожили, или вы использовали массив 'int []' или 'String []' вместо 'ToysDemo []' array. –

2

При вызове System.out.print(someToy), он вызывает someToy.toString() и печатает результат.
Если вы не переопределяете toString(), вы получите по умолчанию Object.toString(), который печатает имя класса и адрес памяти.

+0

Спасибо за комментарий. Раньше у меня не было toString, и он отображал результат правильно. Вы знаете, почему это может быть? – Naan

+1

@Naan: Потому что вы печатали что-то еще (например, 'getName()') – SLaks

1

Вам необходимо добавить функцию toString в класс ToysDemo. Например:

@Override 
public String toString() 
{ 
    return "Name: "+name+"\tPrice: "+price; 
} 
1

Вам необходимо переопределить метод toString() класса Object. Если вы этого не сделаете, JVM выполнит метод базового класса, который по умолчанию печатает полностью квалифицированное имя класса i.e с именем пакета и адресом памяти, в котором объект хранится, и именно так вы получили этот вывод. Теперь, когда вы вызываете system.out.print, он переходит к методу overriden и реализует его.

Например:

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); 
    } 
} 
+0

Не могли бы вы показать пример? – Kezz101

+1

Ниже приведен пример класса Employee { private String name; частный возраст; public void setName (String name) { this.name = имя; } public String getName() { return this.name; } public void setAge (int age) { this.age = age; } public int getAge() { return this.age = age; } public String toString() { возвращение «Имя сотрудника« + имя + »и возраст« + возраст »; } public static void main (String args []) { Сотрудник e = новый Сотрудник(); e.setName ("Robert"); e.setAge (20); System.out.println (e); }} о/р: Имя сотрудника Роберт и возраст 20 Спасибо – tarunajain

+0

Удивительный пример :) – Kezz101