A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马伟恒 中级黑马   /  2012-4-14 11:16  /  1515 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

}
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

7 个回复

倒序浏览
对象才有toString方法,基本类型哪里来的toString方法

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
toSting()是Object类的方法,所有对象都会继承Object,所以所有对象都有这个方法,你复写了就会调用复写之后的方法。

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

System.out.println(p2);

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

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
toString(T) 返回该对象的字符串表示。T必须是一个对象。
System.out.println(p1) 这默认调用的toString()方法。
System.out.println(p1.equals(p2)) 这里不是对象,肯定不会调用的。 而且你在上面new的两个对象。他们的内存地址肯定不同的。所以为false

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
toSting(),和equals()方法都是object类的方法,toSting()返回代表该对象值的字符串,Object类中返回的字符串形式是类名@内存地址的十六制整数。equals()方法在object类中通过判断两个对象是否指向同一块内存区域来判断是否相等,而楼主没有对equals()方法的重写,所以System.out.println(p1.equals(p2));只是比较两个对象的所指向的内存地址是否相同,所以为false;

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
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"

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
补充一点,String类中重写了equals()方法,具体的你可以查API文档
回复 使用道具 举报
蒋亮 中级黑马 2012-4-14 15:37:57
8#
p1.equals(p2)返回的是一个boolean类型的值,是基本数据类型,toString()方法是Object类的方法,所以你打印对象的时候会自动调用toString()方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马