为什么没有调用类中的toString()方法,却自动实现了转换?

来源:-

shenzhi

2015-12-04 11:45

package test;

public class MyDate {
	int year;
	int month;
	int day;
	
	void set(int y,int m,int d){
		year=y;
		month=m;
		day=d;
	}
	void set(MyDate d){
		set(d.year,d.month,d.day);
	}
	public String toString(){
		return year+"年"+month+"月"+day+"日";
	}
	public boolean equals(MyDate d){
		return this==d||d!=null&&year==d.year&&month==d.month&&day==d.day;
	}
	public static void main(String args[]){
		MyDate d1=new MyDate();
		d1.set(2009,7,16);
		MyDate d2=d1;
		System.out.println("d1:"+d1+",d2:"+d2+",d1==d2?"+(d1==d2));
		d2.year=2008;
		System.out.println("d1:"+d1+",d2:"+d2+",d1==d2?"+(d1==d2)+",d1.eguals(d2)?"+(d1.equals(d2)));
		d2=new MyDate();
		d2.set(d1);
		System.out.println("d1:"+d1+",d2:"+d2+",d1==d2?"+(d1==d2)+",d1.eguals(d2)?"+(d1.equals(d2)));
		
	}

}

输出结果是:

d1:2009年7月16日,d2:2009年7月16日,d1==d2?true

d1:2008年7月16日,d2:2008年7月16日,d1==d2?true,d1.eguals(d2)?true

d1:2008年7月16日,d2:2008年7月16日,d1==d2?false,d1.eguals(d2)?true


代码中并没有调用过toString()方法,为什么最后输出的时候会自动调用了呢?

写回答 关注

1回答

  • 风中绿叶0
    2015-12-04 12:33:00
    已采纳

    如果你输出的是对象,d1等效为d1.toString()下面是理由:

    1、System.out.println(center.toString())这句对应的源码:

    public void println(String x) {

        synchronized (this) {

            print(x); // 打印x

            newLine(); // 换行

     }

    }

    这能看懂吧,直接输出了传进来的参数x(center.toString())

    2、System.out.println(center)这句对应的源码:

    public void println(Object x) {

            String s = String.valueOf(x); // x对象转换为String

            synchronized (this) {

                print(s);

                newLine();

            }

        }

     主要看String s = String.valueOf(x);这句,然后再看看是怎么把对象x转换为String的,

     String.valueOf(x)对应的源码:

     public static String valueOf(Object obj) {

        return (obj == null) ? "null" : obj.toString();

        }

      这下看到了吧,把刚才那x(也就是你的center)转换为String是调用了obj.toString()得到

      的。

      所以"直接输出对象时,会默认调用对象toString()方法


    shenzh...

    说的很清楚,谢谢~

    2015-12-04 14:10:45

    共 1 条回复 >

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530560 学习 · 6091 问题

查看课程

相似问题