黑马程序员技术交流社区

标题: 关于toString()的疑惑 [打印本页]

作者: 马伟恒    时间: 2012-4-14 11:16
标题: 关于toString()的疑惑
class Person{

private String name;

private int age;

public Person(String name, int age) {

this.setName(name);

this.setAge(age);

}

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 toString() {

return "姓名:"+this.name+",年龄:"+this.age;

}
}
public class ObjectDemo01 {

public static void main(String[] args) {

Person p1=new Person("张三",11);

Person p2=new Person("张三",11);

System.out.println(p1);//很奇怪,这样就自动调用覆写过的toString()方法 了

System.out.println(p2);

System.out.println(p1.equals(p2));//应该是比较地址内容,结果为false,但这样,它就不再调用toString()方法 了,不是说打印对象 会自动调用toString()方法 吗?那这行代码为什么不再调用 了呢?

System.out.println(p1.toString().equals(p2.toString()));//比较内容,结果true

}
}

作者: 张锐    时间: 2012-4-14 11:20
对象才有toString方法,基本类型哪里来的toString方法
作者: 张卯    时间: 2012-4-14 11:24
toSting()是Object类的方法,所有对象都会继承Object,所以所有对象都有这个方法,你复写了就会调用复写之后的方法。

System.out.println(p1);//很奇怪,这样就自动调用覆写过的toString()方法 了    你这里打印的是对象,所以自动调用toString()

System.out.println(p2);

System.out.println(p1.equals(p2));//应该是比较地址内容,结果为false,但这样,它就不再调用toString()方法 了,不是说打印对象 会自动调用toString()方法 吗?那这行代码为什么不再调用 了呢?    你这里打印的是boolean返回类型的值,不是对象,所以不调用toString()
作者: 刘占月    时间: 2012-4-14 11:38
toString(T) 返回该对象的字符串表示。T必须是一个对象。
System.out.println(p1) 这默认调用的toString()方法。
System.out.println(p1.equals(p2)) 这里不是对象,肯定不会调用的。 而且你在上面new的两个对象。他们的内存地址肯定不同的。所以为false
作者: 陈坚    时间: 2012-4-14 11:56
toSting(),和equals()方法都是object类的方法,toSting()返回代表该对象值的字符串,Object类中返回的字符串形式是类名@内存地址的十六制整数。equals()方法在object类中通过判断两个对象是否指向同一块内存区域来判断是否相等,而楼主没有对equals()方法的重写,所以System.out.println(p1.equals(p2));只是比较两个对象的所指向的内存地址是否相同,所以为false;

作者: 孙国军    时间: 2012-4-14 12:44
System.out.println(p1.equals(p2));//应该是比较地址内容,结果为false,但这样,它就不再调用toString()方法 了,不是说打印对象 会自动调用toString()方法 吗?那这行代码为什么不再调用 了呢?

它不是不调用,你首先要p1.equals(p2)返回的是一个boolean类型的数据,当然调用的是Object类中的toString()方法后,它返回的是调用者boolean变量flase的一个字符串表现形式,打印的flase实际上是"false";

System.out.println(p1.toString().equals(p2.toString()));//比较内容,结果true

这里调用的toString()方法的是Person类中的p1,p2对象,调用过后,返回的值是一个String类型的字符串,而p1,p2的内容相同,是"("张三",11)"所以得到的String类型的字符串也是相同的,他们只是后使用.equals(()方法就不是比较地址值了,因为这个.equals(()的调用者是两个String类对象---字符串;而得到的值也就是true,所以最后打印的结果为"true"
作者: 孙国军    时间: 2012-4-14 12:46
补充一点,String类中重写了equals()方法,具体的你可以查API文档
作者: 蒋亮    时间: 2012-4-14 15:37
p1.equals(p2)返回的是一个boolean类型的值,是基本数据类型,toString()方法是Object类的方法,所以你打印对象的时候会自动调用toString()方法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2