Как использовать метод toString в Java? - PullRequest
110 голосов
/ 01 сентября 2010

Может кто-нибудь объяснить мне концепцию метода toString(), определенного в классе Object?Как это используется и какова его цель?

Ответы [ 13 ]

82 голосов
/ 01 сентября 2010

из Object.toString () документы:

Возвращает строковое представление объекта.В общем случае метод toString возвращает строку, которая «представляет собой текст» этого объекта.Результатом должно быть краткое, но информативное представление, которое легко читается человеком.Рекомендуется, чтобы все подклассы переопределяли этот метод.

Метод toString для класса Object возвращает строку, состоящую из имени класса, экземпляром которого является объект, символа знака "@" и шестнадцатеричного представления без знака хеш-кодаобъект.Другими словами, этот метод возвращает строку, равную значению:

getClass().getName() + '@' + Integer.toHexString(hashCode())

Пример:

String[] mystr ={"a","b","c"};
System.out.println("mystr.toString: " + mystr.toString());

output:- mystr.toString: [Ljava.lang.String;@13aaa14a
39 голосов
/ 25 октября 2012

Использование строки toString: всякий раз, когда вам требуется изучить конструктор с именем value в форме String, вы можете просто использовать String toString ... для примера ...

package pack1;

import java.util.*;

class Bank {

    String n;
    String add;
    int an;
    int bal;
    int dep;

    public Bank(String n, String add, int an, int bal) {

        this.add = add;
        this.bal = bal;
        this.an = an;
        this.n = n;

    }

    public String toString() {
        return "Name of the customer.:" + this.n + ",, "
                + "Address of the customer.:" + this.add + ",, " + "A/c no..:"
                + this.an + ",, " + "Balance in A/c..:" + this.bal;
    }
}

public class Demo2 {

    public static void main(String[] args) {

        List<Bank> l = new LinkedList<Bank>();

        Bank b1 = new Bank("naseem1", "Darbhanga,bihar", 123, 1000);
        Bank b2 = new Bank("naseem2", "patna,bihar", 124, 1500);
        Bank b3 = new Bank("naseem3", "madhubani,bihar", 125, 1600);
        Bank b4 = new Bank("naseem4", "samastipur,bihar", 126, 1700);
        Bank b5 = new Bank("naseem5", "muzafferpur,bihar", 127, 1800);
        l.add(b1);
        l.add(b2);
        l.add(b3);
        l.add(b4);
        l.add(b5);
        Iterator<Bank> i = l.iterator();
        while (i.hasNext()) {
            System.out.println(i.next());
        }
    }

}

... скопируйте эту программу в свое затмение и запустите ее ... вы получите представление о String toString ...

34 голосов
/ 01 сентября 2010

Метод toString() возвращает текстовое представление объекта. Базовая реализация уже включена в java.lang.Object, поэтому все объекты наследуются от java.lang.Object, поэтому гарантируется, что каждый объект в Java имеет этот метод.

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

public class Contact {
  private String firstName;
  private String lastName;
  public Contact (String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  public String getFirstName() {return firstName;}
  public String getLastName() {return lastName;}

  public String getContact() {
    return firstName + " " + lastName;
  }

  @Override
  public String toString() {
    return "["+getContact()+"]";
  }
}
15 голосов
/ 01 сентября 2010

Возможно, он может использоваться в контексте приложения, но гораздо чаще он используется для целей отладки.Например, когда вы достигаете точки останова в IDE, гораздо проще прочитать значимые toString() объектов, чем проверять их элементы.

Не существует установленного требования для метода toString()следует сделать.По договоренности чаще всего вам сообщают имя класса и значение соответствующих членов данных.Чаще всего toString() методы автоматически генерируются в IDE.

Использование определенного вывода метода toString() или его синтаксический анализ в программе - плохая идея.Что бы ты ни делал, не иди по этому пути.

12 голосов
/ 31 октября 2015

toString () возвращает строковое / текстовое представление объекта. Обычно используемый для диагностических целей, таких как отладка, ведение журнала и т. Д., Метод toString () используется для чтения значимых подробностей об объекте.

Он автоматически вызывается, когда объект передается в println, print, printf, String.format (), assert или оператор объединения строк.

Реализация по умолчанию функции toString () в классе Object возвращает строку, состоящую из имени класса этого объекта, за которым следует знак @ и шестнадцатеричное представление без знака хеш-кода этого объекта с использованием следующей логики

getClass().getName() + "@" + Integer.toHexString(hashCode())

Например, следующее

public final class Coordinates {

    private final double x;
    private final double y;

    public Coordinates(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public static void main(String[] args) {
        Coordinates coordinates = new Coordinates(1, 2);
        System.out.println("Bourne's current location - " + coordinates);
    }
}

печать

Bourne's current location - Coordinates@addbf1 //concise, but not really useful to the reader

Теперь переопределение toString () в классе Coordinates, как показано ниже,

@Override
public String toString() {
    return "(" + x + ", " + y + ")";
}

Результаты в

Bourne's current location - (1.0, 2.0) //concise and informative

Полезность переопределения toString () становится еще больше, когда метод вызывается для коллекций, содержащих ссылки на эти объекты. Например, следующее

public static void main(String[] args) {
    Coordinates bourneLocation = new Coordinates(90, 0);
    Coordinates bondLocation = new Coordinates(45, 90);
    Map<String, Coordinates> locations = new HashMap<String, Coordinates>();
    locations.put("Jason Bourne", bourneLocation);
    locations.put("James Bond", bondLocation);
    System.out.println(locations);
}

печать

{James Bond=(45.0, 90.0), Jason Bourne=(90.0, 0.0)}

вместо этого

{James Bond=Coordinates@addbf1, Jason Bourne=Coordinates@42e816}

Несколько указателей реализации,

  1. Вы почти всегда должны переопределять метод toString (). Один из случаев, когда переопределение не требуется, - это служебные классы, которые группируют статические служебные методы в виде java. util.Math . Случай, когда переопределение не требуется, довольно интуитивен; почти всегда вы бы знали.
  2. Возвращаемая строка должна быть краткой и информативной, в идеале не требующей пояснений.
  3. По крайней мере, поля, используемые для установления эквивалентности между двумя различными объектами, т. Е. Поля, используемые в реализации метода equals () , должны быть выделены методом toString ().
  4. Предоставить методы доступа / получения для всех полей экземпляра, которые содержатся в возвращаемой строке. Например, в классе Coordinates,

    public double getX() {
        return x;
    }
    public double getY() {
        return y;
    }
    

Подробное описание метода toString () приведено в пункте 10 книги «Эффективное Java ™, второе издание» Джоша Блоха.

5 голосов
/ 29 декабря 2015

Кодировка:

public class Test {

    public static void main(String args[]) {

        ArrayList<Student> a = new ArrayList<Student>();
        a.add(new Student("Steve", 12, "Daniel"));
        a.add(new Student("Sachin", 10, "Tendulkar"));

        System.out.println(a);

        display(a);

    }

    static void display(ArrayList<Student> stu) {

        stu.add(new Student("Yuvi", 12, "Bhajji"));

        System.out.println(stu);

    }

}

Student.java:

public class Student {

    public String name;

    public int id;

    public String email;

    Student() {

    }

    Student(String name, int id, String email) {

        this.name = name;
        this.id = id;
        this.email = email;

    }

     public String toString(){           //using these toString to avoid the output like this [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
          return name+" "+id+" "+email;     
         }  


    public String getName(){

        return name;
    }

    public void setName(String name){

        this.name=name;
    }

    public int getId(){

        return id;
    }

    public void setId(int id){

        this.id=id;
    }

    public String getEmail(){

        return email;

    }

    public void setEmail(String email){

        this.email=email;
    }
}

Выход:

[Стив 12 Даниэль, Сачин 10 Тендулкар]

[Стив 12 Даниэль, Сачин 10 Тендулкар, Юви 12 Бхаджи]

Если вы не используете toString () в классе Pojo (Student.java), вы получите вывод типа [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]. Чтобы избежать подобных проблем, мы используем метод toString ().

5 голосов
/ 01 сентября 2010

Каждый раз, когда вы обращаетесь к объекту (не являющемуся строкой) в контексте строки, компилятор вызывает toString () под прикрытием.

Вот почему

Map map = new HashMap();
System.out.println("map=" + map);

работает, и, переопределив стандартное toString () из Object в ваших собственных классах, вы можете сделать ваши объекты полезными и в строковых контекстах.

(и считать его черным ящиком!кроме представления человеку)

4 голосов
/ 23 мая 2013

Правильно переопределенный метод toString может помочь в регистрации и отладке Java.

3 голосов
/ 01 сентября 2010

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

 System.out.println(myObject);

или

System.out.println("text " + myObject);
2 голосов
/ 01 сентября 2010

Основная цель toString - генерировать строковое представление объекта, что означает, что возвращаемое значение всегда является String.В большинстве случаев это просто класс объекта и имя пакета, но в некоторых случаях, например, StringBuilder, вы получите фактически String-text.

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