Как использовать метод toString в Java?

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

Ответ 1

Из Object.toString() docs:

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

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

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

Пример:

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

output:- mystr.toString: [Ljava.lang.String;@13aaa14a

Ответ 2

Использование String 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...

Ответ 3

Метод 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()+"]";
  }
}

Ответ 4

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

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

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

Ответ 5

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 current location - " + coordinates);
    }
}

печатает

Bourne current location - [email protected] //concise, but not really useful to the reader

Теперь, переопределяя toString() в классе "Координаты", как показано ниже,

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

приводит к

Bourne 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 [email protected], Jason [email protected]}

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

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

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

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

Ответ 6

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

Вот почему

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

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

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

Ответ 7

Кодирование:

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 [[email protected], [email protected]]
          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), вы получите результат как [[email protected], [email protected]]. Чтобы избежать такой проблемы, мы используем метод toString().

Ответ 8

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

Ответ 9

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

 System.out.println(myObject);

или

System.out.println("text " + myObject);

Ответ 10

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

Ответ 11

toString() преобразует указанный объект в строковое значение.

Ответ 12

/**
 * This toString-Method works for every Class, where you want to display all the fields and its values
 */
public String toString() {

    StringBuffer sb = new StringBuffer();

    Field[] fields = getClass().getDeclaredFields(); //Get all fields incl. private ones

    for (Field field : fields){

        try {

            field.setAccessible(true);
            String key=field.getName();
            String value;

            try{
                value = (String) field.get(this);
            } catch (ClassCastException e){
                value="";
            }

            sb.append(key).append(": ").append(value).append("\n");

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    return sb.toString();
}

Ответ 13

Если вы сначала изучите Python, а затем Java. Я думаю, что он играет ту же роль, что и __str__() в Python, это магический метод как __dict__() и __init__(), но ссылаться на строку, представляющую объект.