黑马程序员技术交流社区
标题:
关于toSting()的覆盖方法
[打印本页]
作者:
ぺsimon☆
时间:
2013-4-26 15:42
标题:
关于toSting()的覆盖方法
本帖最后由 ぺsimon☆ 于 2013-4-28 17:42 编辑
/*
需求:把学生和其所属户籍存到HashMap集合中
因为学生不唯一的,户籍可以相同,所以在HashMap中以学生为键,户籍为值
学生类中,姓名和年龄相同视为一个学生
*/
import java.util.*;
class Student implements Comparable<Student>//实现Comparable比较器
{
private String name;
private int age;
Student(String name,int age) //构造函数
{
this.name=name;
this.age=age;
}
public void setName(String name) //设置名字
{
this.name=name;
}
public String getName() //获取获取名字
{
return name;
}
public void setAge(int age)//设置年龄
{
this.age=age;
}
public int getAge()//获取年龄
{
return age;
}
public int compareTo(Student obj) //覆盖compareTo方法
{
if(!(obj instanceof Student))
throw new RuntimeException();
Student s=(Student)obj;
int num=new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
return this.name.compareTo(s.name);
return num;
}
public int hashCode() //覆盖hashCode方法
{
return name.hashCode()+age*6;
}
public boolean equals(Student obj) //覆盖equals方法
{
if(!(obj instanceof Student))
return false;
Student s=(Student)obj;
return this.name.equals(s.name)&&this.age==s.age;
}
//***覆盖toString方法 ,这里不懂...为什么把toString()方法覆盖之后,程序打印
的Student对象是:name+":"+age ,不覆盖toSring方法打印出来的Student是一个地
址值,而这个地址值又是怎么来的呢?
public String toString()
{
return name+":"+age;
}
}
class HashMapStudent
{
public static void main(String[] args)
{
//创建一个容器
HashMap<Student,String> hs=new HashMap<Student,String>();
hs.put(new Student("zhangsan",01),"guangzhou01");
hs.put(new Student("zhangsan",02),"guangzhou02");
hs.put(new Student("zhangsan",03),"guangzhou03");
hs.put(new Student("zhangsan",04),"guangzhou04");
hs.put(new Student("zhangsan",05),"guangzhou05");
//得到映射关系
Set<Map.Entry<Student,String>> s=hs.entrySet();
//得到迭代器
Iterator<Map.Entry<Student,String>> it=s.iterator();
//循环输出每一个键值对
while(it.hasNext())
{
Map.Entry<Student,String> me=it.next();
System.out.println(me.getKey()+"="+me.getValue());
}
/*
Set<Student> s=hs.keySet();
Iterator<Student> it=s.iterator();
while(it.hasNext())
{
Student s1=it.next();
String s2=hs.get(s1);
System.out.println(s1+"="+s2);
}
*/
}
}
复制代码
作者:
聖手`书生
时间:
2013-4-26 15:48
1.toString()方法是Object中的方法,如果不覆盖,返回结果默认就是“类名@地址值”,
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
2.如果覆盖了,函数体就不一样了,那当然就按照你自己定义的返回值了,Object中的toString方法不也如此吗,希望这个分析对你有用
作者:
殇_心。
时间:
2013-4-26 15:54
楼上正解。路过```赚金币。
作者:
刘胜寒
时间:
2013-4-26 17:07
楼上正解。路过```赚金币。
作者:
HM朱蛟
时间:
2013-4-26 17:55
搞明白打印流的原理即可
请参考这个帖:
http://bbs.itheima.com/forum.php?mod=viewthread&tid=46122
作者:
邵彩华
时间:
2013-4-26 18:50
1、建议楼主查看下API文档,toString()方法,是所有普通类从Object中继承的方法,默认的功能是:Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
2、我们写自己的类时,可以复写toString()方法,是为了让该方法能按照我们的意愿返回一个值。楼主所举出的例子程序中,覆盖toString()方法是为了让结果更有意义,可以看得更直白。试想,让你输出人的信息,你该不会给人家输出一段看不懂的hashcode值吧? 但对于学习视频中的你来说,你应该是想问这个程序一定要这样写吗,为什么……答案是:否!这里你完全可以不用覆盖toString()方法。这是随你自愿的,你想要直接打印Student对象时输出的是什么内容,就可以通过重写toString()来完成。
作者:
袁梦希
时间:
2013-4-26 18:59
楼上正解,都是正解
作者:
花伟昌
时间:
2013-4-26 20:53
如果不覆盖toString()方法,默认会调用Object类中的toString()方法,你可以查看一下API文档,在java.lang包中找到Object 其toString方法是这样定义的:
public String toString() 返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
返回:该对象的字符串表示形式。
作者:
任雷彬
时间:
2013-4-26 23:36
toString()方法默认的是继承的Object父类的toString()方法。
而Object类的toString()方法,返回 的是
调用对象的.class文件的名字+@+改对象hashcode的无符号十六进制表示。
即是,this.getClass().getName()+"@"+Integer.toHexString(this.hashcode());
而System.out.println().在打印的时候会调用toString()方法。以字符串的形式输出。
而如果想要实现特有的数据输出的方式,则需要重写toString()方法。
public String toString(){
return .....;
}
作者:
hmr8
时间:
2013-4-27 02:04
object是根类,所有类都直接或间接继承Object类中的toString
作者:
黄玉昆
时间:
2013-4-27 20:09
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2