Чи може хтось пояснити мені поняття toString()методу, визначене на Objectуроці? Як він використовується та яка його мета?
Чи може хтось пояснити мені поняття toString()методу, визначене на Objectуроці? Як він використовується та яка його мета?
Відповіді:
З 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
Використання String.toString:
Кожен раз, коли вам потрібно вивчити конструктор, який називається значенням у 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());
}
}
}
... скопіюйте цю програму у свій Eclipse та запустіть її ... ви отримаєте ідеї про String.toString...
toStringце не призначено і не підходить для цілей інтерфейсу.
toStringдля відображення об'єкта в графічному інтерфейсі? Якщо у мене є багатий об'єкт і я хочу його показати в графічному інтерфейсі, то ні, я не створюю для нього додаткового рендерінгу, а також не витягую з нього об'єктну властивість для використання в GUI, я зберігаю його простий і реалізований, toStringщоб мати можливість обійти все, що над головою. Якщо ви хочете зробити це більш чистим способом, створіть клас обгортки, який призначений для цілей інтерфейсу, та реалізує його toStringметод для повернення рядкового властивості wrappee.
toString()Метод повертає текстове представлення об'єкта. Базова реалізація вже включена, java.lang.Objectі тому, що всі об'єкти успадковуються від java.lang.Objectнеї, гарантується, що кожен об’єкт у Java має цей метод.
Перевизначення методу - це завжди хороша ідея, особливо якщо мова йде про налагодження, тому що налагоджувачі часто показують об'єкти за результатом toString()методу. Тому використовуйте змістовну реалізацію, але використовуйте її в технічних цілях. Логіка програми повинна використовувати getters:
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()+"]";
}
}
Можливо, він може мати використання в контексті програми, але набагато частіше він використовується для налагодження. Наприклад, коли ви потрапляєте в IDE, точку прориву набагато простіше читати значущі toString()об'єкти, ніж перевіряти їх членів.
Немає встановленої вимоги щодо того, що toString()повинен робити метод. За умовою, найчастіше він розповість вам назву класу та значення відповідних членів даних. Найчастіше toString()методи автоматично створюються в IDE.
Покладатися на певний вихід із toString()методу або аналізувати його в межах програми - погана ідея. Що б ви не робили, не йдіть цим маршрутом.
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 () в класі Координати, як показано нижче,
@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}
Мало покажчиків реалізації,
Укажіть accessors / getters для всіх полів екземпляра, які містяться у повернутому рядку. Наприклад, у класі Координати,
public double getX() {
return x;
}
public double getY() {
return y;
}Всебічне висвітлення методу toString () міститься в пункті 10 книги «Ефективна Java ™, друге видання» Джоша Блоха.
Кодування:
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 ().
Кожного разу, коли ви отримуєте доступ до об'єкта (не є String) у String-контексті, компілятор викликає toString () під обкладинками.
Ось чому
Map map = new HashMap();
System.out.println("map=" + map);
працює, і замінивши стандартний toString () від Object у власних класах, ви також можете зробити свої об’єкти корисними і в String-контекстах.
(і вважайте це чорною скринькою! Ніколи, ніколи не використовуйте вміст ні для чого іншого, ніж представляти людині)
/**
* 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();
}
Якщо ви вивчите спочатку Python, а потім Java. Я думаю, він відіграє таку ж роль, що і __str__()метод в Python, це магічний метод, як __dict__()і, __init__()але для посилання на рядок, що представляє об'єкт.