2015-09-02 3 views
1

Я пытаюсь ссылаться на имя объекта во время выполнения в небольшой консоли Java, но я не могу. Моя консоль продолжает возвращать «VirtualFriend @ 17dfafd1» вместо фактического имени объекта VirtualFriend, который я передаю в параметре. Как преобразовать это в фактическую строку, которая показывает имя объекта вместо его хэш-кода? Вот код для справки:Java - проблема со ссылкой на имя объекта во время выполнения

public class VirtualFriend { 

    // variables 
    private String myName; 
    private int myAge, myFood; 

    // other variables 
    private int a, b; 
    private VirtualFriend other; 

    // general constructor 
    public VirtualFriend() { 
     myName = "Unknown"; 
     myAge = 5; 
     myFood = 2; 
    } 

    // specific constructor 
    public VirtualFriend(String myName, int myAge) { 
     this.myName = myName; 
     this.myAge = myAge; 
     myFood = 2; 
    } 

    // name methods 
    public void setName(String myName) { 
     this.myName = myName; 
    } 

    public String getName() { 
     return myName; 
    } 

    // integer method 
    public int add(int a, int b) { 
     this.a = a; 
     this.b = b; 
     return a + b; 
    } 

    // void methods 
    public void printName() { 
     System.out.println(myName); 
    } 

    public void greet(VirtualFriend other) { 
     this.other = other; 
     System.out.println("Hi there " + other + ". It's nice " 
       + "to meet you. My name is " + myName + "."); 
    } 

    // main method 
    public static void main(String[] args) { 

     VirtualFriend Liz = new VirtualFriend("Liz", 16); 
     VirtualFriend Boo = new VirtualFriend("Boo", 16); 

     Liz.greet(Boo); 
    } 
} 
+1

Любой вызов 'getName()' или реализация 'toString()'. – Andreas

+0

@Andreas Как бы реализовать toString()? – Shrey

ответ

1

Вам нужно позвонить other.getName() в своем заявлении для печати. Переменная с именем name не имеет особого значения в Java; когда он видит объект, конкатенированный строкой, он пытается вызвать метод toString() для этого объекта. Если этот объект не определяет toString(), то (через наследование от объекта object) он вызывает метод "default" toString(), который возвращает строку, которую вы наблюдали; имя_класса @ хэш-код.

+1

Спасибо! Это сработало. – Shrey

2

Всякий раз, когда мы хотим, чтобы любой класс представлял себя в виде строки, вызывается функция toString(). Он определен в классе Object. Так будет в каждом классе. Эта функция toString() возвращает имя класса с его хеш-кодом.

Если вы хотите изменить его поведение, просто переопределите эту функцию.

@Override 
public String toString(){ 
    return myName; 
} 
1

При использовании оператора + для конкатенации строк, Java позволит использовать любой объект в качестве одного из операндов, если другая строка. В этом случае на объект имеется подразумеваемый вызов toString(). Так что ваш println на самом деле это:

System.out.println("Hi there " + other.toString() + ". It's nice " 
      + "to meet you. My name is " + myName.toString() + "."); 

Все объекты имеют toString(), но по умолчанию, результат будет выглядеть примерно так [email protected] где иксы шестнадцатеричные цифры. Если вы хотите разумный вид toString(), вы должны переопределить его самостоятельно в своем классе:

@Override 
public String toString() { 
    return <whatever String expression you want>; 
} 

Многих из классов, определенных Java уже toString() переопределения. Сам тип String имеет toString() переопределенный, и он просто возвращает строку (так что myName.toString() совпадает с myName). Но ваш собственный класс не будет иметь встроенного переопределения. (Кроме того, массивы не имеют toString() переопределены, и вам нужно использовать Arrays.toString(arr), чтобы сделать строку из массива.)

1

-Whenever мы печатаем любой объект Java, то по умолчанию он печатает что-то вроде класса @ хххх .. .

-Но если вы хотите напечатать объект с его ассоциированным значением, вам необходимо переопределить метод toString() в этом классе.