黑马程序员技术交流社区
标题:
自定义toString 的调用过程
[打印本页]
作者:
赵学刚
时间:
2012-12-4 20:52
标题:
自定义toString 的调用过程
本帖最后由 赵学刚 于 2012-12-5 00:42 编辑
问题:测试类并没有调用toString ,为什么会自动起到转换效果呢?谁能解析下测试类MapTest调用toString的过程。。。。。谢谢!!!
public class Student implements Comparable<Student> {
private String name;
private int age;
private String address;
public String toString(){
return this.age+this.name;
}
Student (String name ,int age){
this.age=age;
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
//自定义哈希值指定集合元素存储到哈希表中
public int hashCode(){
return name.hashCode()+age*32;
}
//自定义比较方法
public boolean equals(Object obj){
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s=(Student)obj;
return this.name.equals(s.name)&&this.age==s.age;
}
@Override //当集合按二叉树存储时,可以按自然顺序排序
public int compareTo(Student s) {
int num=new Integer(this.age).compareTo(new Integer(s.age));
if(num==0){
return this.name.compareTo(s.name);
}
return num;
}
public class MapTest {
/**
* 需求:取出所有map元素
*/
public static void main(String[] args) {
Map<Student,String> map=new TreeMap<Student,String>();
map.put(new Student("lisi1",123), "tianjingo");
map.put(new Student("lisi2",12), "tianjingo");
map.put(new Student("lisi3",121), "tianjingo");
map.put(new Student("lisi2",127), "tianjingo");
Set<Map.Entry<Student,String>> keySet=map.entrySet();
Iterator<Map.Entry<Student,String>> it=keySet.iterator();
while(it.hasNext()){
Map.Entry<Student,String> me=it.next();
Student key=me.getKey();
String value=me.getValue();
System.out.println(key+"==="+value);
}
}
}
复制代码
作者:
尘世
时间:
2012-12-4 20:59
混个分数下载东西!!
作者:
xjandrew
时间:
2012-12-4 22:31
本帖最后由 xjandrew 于 2012-12-4 22:35 编辑
System.out.println 会自动调用Student里面参数的toString()方法.
如果子类中没有toString()方法,它就会调用其父类(Object )的toString()方法
而Object 类的 toString 方法是返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
你在主函数中加两句做个测试
Student s = new Student("zhangsan",122);
System.out.println(s);
作者:
罗会涛
时间:
2012-12-4 23:05
你明明是调用了toString方法的
你的程序74行"System.out.println(key+"==="+value);",这里调用了key和value的toString方法
在打印语句System.out.println();如果是对象的话,默认调用对象的toString.
你可以看PrintStream的println(Object x)方法,它打印String中的valueOf(Object x),而String中的valueOf(Object x)方法返回值就是x.toSting();所以在打印流System.out的println()方法中写个对象就是打印对象的toString方法.
而你程序中TreeMap存的key和value都是对象,并且你在第5行重写了key(即Student对象)的toString
作者:
赵学刚
时间:
2012-12-5 00:42
哦 了解 谢谢
作者:
杨永胜
时间:
2012-12-5 00:49
在eclipse中你你可以找到覆写toString方法选项,就能看到 它默认的方法,这个是Object的方法,是用来打印结果的时候显示的,一般就是名字@hashcode码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2