如何在Java中使用toString方法?
任何人都可以向我解释在Object
类中定义的toString()
方法的概念吗? 它是如何使用的,它的目的是什么?
从Object.toString()文档:
返回对象的string表示forms。 通常,toString方法返回一个“文本表示”这个对象的string。 结果应该是一个简明但是信息丰富的表示,对于一个人来说很容易阅读。 build议所有子类重写此方法。
类Object的toString方法返回一个string,该对象是实例的类名,符号字符“@”和对象的哈希码的无符号hex表示forms。 换句话说,这个方法返回一个string,其值等于:
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表单中探索名为value的构造函数,都可以简单地使用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()); } } }
…复制这个程序到你的日食,并运行它…你会得到关于stringtoString的想法…
toString()
方法返回一个对象的文本表示。 一个基本的实现已经包含在java.lang.Object
,因为所有的对象都inheritance自java.lang.Object
所以保证Java中的每个对象都有这个方法。
重写方法总是一个好主意,特别是在debugging时,因为debugging器经常通过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()+"]"; } }
它可以select在应用程序的上下文中使用,但更常用于debugging目的。 例如,当您在IDE中find断点时,读取有意义的toString()
对象比检查其成员要容易得多。
对于toString()
方法应该做什么没有设置要求。 按照惯例,大多数情况下它会告诉你class级的名字和有关数据成员的价值。 通常情况下, toString()
方法是在IDE中自动生成的。
依赖于toString()
方法的特定输出或者在程序中parsing它是一个坏主意。 无论你做什么,都不要走这条路。
toString()返回对象的string/文本表示。 通常用于debugging,日志logging等诊断目的,toString()方法用于读取有关对象的有意义的细节。
当对象被传递给println,print,printf,String.format(),assert或者string连接操作符时,会自动调用它。
类Object中的toString()的默认实现返回一个string,该string包含此对象的类名称,后跟@符号以及使用以下逻辑的此对象的哈希代码的无符号hex表示forms,
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
现在,在Coordinates类中重写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}
很less有实施指针,
- 你应该总是重写toString()方法。 其中一个不需要重写的情况是以java.util.Math的方式对静态实用程序方法进行分组的实用程序类。 不需要覆盖的情况非常直观; 几乎总是你会知道的。
- 返回的string应该简洁明了,最好不言自明。
- 至less,用于在两个不同的对象(即equals()方法实现中使用的字段)之间build立等价的字段应该由toString()方法吐出。
-
为返回的string中包含的所有实例字段提供访问器/获取器。 例如,在坐标类中,
public double getX() { return x; } public double getY() { return y; }
有关toString()方法的全面介绍,请参见Josh Bloch在Effective Java™第二版的第10部分。
无论何时在String上下文中访问对象(不是string)时,编译器都会在封面下调用toString()。
这就是为什么
Map map = new HashMap(); System.out.println("map=" + map);
通过在你自己的类中重写Object的标准toString(),你可以在String上下文中使你的对象有用。
(并认为它是一个黑盒子!永远不要使用内容来呈现给人类)
编码:
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 Tendulkar]
[史蒂夫12 Daniel,Sachin 10 Tendulkar,Yuvi 12 Bhajji]
如果您在Pojo(Student.java)类中没有使用toString(),则会得到类似[com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
的输出。为了避免这种问题我们正在使用toString()方法。
正确地重写toString方法可以帮助Java的日志logging和debugging。
除了cletus在debugging方面的回答之外,每当你输出一个对象的时候都会使用它,就像你使用的时候一样
System.out.println(myObject);
要么
System.out.println("text " + myObject);
toString的主要目的是生成一个对象的String表示,意味着返回值总是一个String。 在大多数情况下,这只是对象的类和包的名称,但在一些像StringBuilder的情况下,您将实际得到一个String-text。
toString()
将指定的对象转换为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。 我认为它和Python中的__str__()
方法起着同样的作用,它是一个像__dict__()
和__init__()
这样的神奇方法,而是引用表示对象的string。
当使用加号(+)或在System.out.println()方法中使用时,JVM使用对象的string表示forms。 你可以从我的博客获得更多的细节